variavel dando erro

Programação C em geral

Moderadores: 51, guest2003

variavel dando erro

Mensagempor Doglao » 21 Mai 2007 12:04

Ola!
Estou tentando colocar uma variavel short int AdrIO dentro de uma classe como privado mas o compilador na hora de linkar da o seguinte erro:
[Linker Error] undefined reference to `AdrIO'
Esta variavel faz parte da escrita da porta paralela aonde colocamos o endereco da porta desta funcao:
Código: Selecionar todos
void PortaParalelaFrm::outportb(short int End, unsigned char valor)
{
   ValOut = valor;
   AdrIO = End;
   __asm("mov _AdrIO,%dx");
   __asm("mov _ValOut,%al");
   __asm("out %al, %dx");
}
Mas!, quando eu coloco esta variave AdrIO no codigo .cpp como global funciona bem. Repare que tem duas variaveis, a variavel ValOut e coloco na Classe como privada e nao da erro somente a AdrIO.
Código: Selecionar todos
class PortaParalelaFrm : public wxFrame
{
   private:
      DECLARE_EVENT_TABLE();

   public:
      PortaParalelaFrm(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("PortaParalela"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = PortaParalelaFrm_STYLE);
      virtual ~PortaParalelaFrm();
      void Botao1Click(wxCommandEvent& event);
      void outportb(short int End, unsigned char valor);
      void Botao2Click(wxCommandEvent& event);
      void Botao3Click(wxCommandEvent& event);
      void Botao4Click(wxCommandEvent& event);
      void Botao5Click(wxCommandEvent& event);
      void Botao6Click(wxCommandEvent& event);
      void Botao7Click(wxCommandEvent& event);
      void Botao8Click(wxCommandEvent& event);
      void Botao9Click(wxCommandEvent& event);
      void BotaoZerarClick(wxCommandEvent& event);
      void BotaoContadorClick(wxCommandEvent& event);

   private:
      //Do not add custom control declarations between
      //GUI Control Declaration Start and GUI Control Declaration End.
      //wxDev-C++ will remove them. Add custom code after the block.
      ////GUI Control Declaration Start
      wxButton *BotaoContador;
      wxStaticText *WxStaticText1;
      wxButton *BotaoZerar;
      wxButton *Botao8;
      wxButton *Botao7;
      wxButton *Botao6;
      wxButton *Botao5;
      wxButton *Botao4;
      wxButton *Botao3;
      wxButton *Botao2;
      wxButton *Botao1;
      wxPanel *WxPanel1;
      ////GUI Control Declaration End

   private:
        byte siValor; // [b]aqui aceita a variavel[/b]
        short int AdrIO; // [b]aqui da erro de linkagem[/b]
//Note: if you receive any error with these enum IDs, then you need to
//change your old form code that are based on the #define control IDs.
//#defines may replace a numeric value for the enum names.
//Try copy and pasting the below block in your old form header files.
      enum
      {
         ////GUI Enum Control ID Start
         ID_BOTAOCONTADOR = 1014,
         ID_WXSTATICTEXT1 = 1013,
         ID_BOTAOZERAR = 1012,
         ID_BOTAO8 = 1011,
         ID_BOTAO7 = 1010,
         ID_BOTAO6 = 1009,
         ID_BOTAO5 = 1008,
         ID_BOTAO4 = 1007,
         ID_BOTAO3 = 1006,
         ID_BOTAO2 = 1005,
         ID_BOTAO1 = 1004,
         ID_WXPANEL1 = 1002,
////GUI Enum Control ID End
         ID_DUMMY_VALUE_ //don't remove this value unless you have other enum values
      };

   private:
      void OnClose(wxCloseEvent& event);
      void CreateGUIControls();
};
Ja coloquei em varios lugares da Classe e o erro eh o mesmo. Oque pode estar de errado neste codigo?
Obs: Estou usando o wxDevC++ , eh o devCpp com wxWidgets e o compilador MingW.
Abrcs
Douglas
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null

Mensagempor ivan » 21 Mai 2007 22:50

Se puder colocar o codigo da classe toda fica mais fácil de procurar o erro.
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Mensagempor Doglao » 22 Mai 2007 13:29

ivan escreveu:Se puder colocar o codigo da classe toda fica mais fácil de procurar o erro.


Ola!
Obrigado por contestar

ai vai o codigo da classe:
Código: Selecionar todos
//---------------------------------------------------------------------------
//
// Name:        PortaParalelaFrm.h
// Author:      Douglas
// Created:     5/18/2007 4:44:21 PM
// Description: PortaParalelaFrm class declaration
//
//---------------------------------------------------------------------------

#ifndef __PORTAPARALELAFRM_h__
#define __PORTAPARALELAFRM_h__

#ifdef __BORLANDC__
   #pragma hdrstop
#endif

#ifndef WX_PRECOMP
   #include <wx/wx.h>
   #include <wx/frame.h>
#else
   #include <wx/wxprec.h>
#endif

//Do not add custom headers between
//Header Include Start and Header Include End.
//wxDev-C++ designer will remove them. Add custom headers after the block.
////Header Include Start
#include <wx/stattext.h>
#include <wx/button.h>
#include <wx/panel.h>
////Header Include End

////Dialog Style Start
#undef PortaParalelaFrm_STYLE
#define PortaParalelaFrm_STYLE wxCAPTION | wxRESIZE_BORDER | wxSYSTEM_MENU | wxTHICK_FRAME | wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxCLOSE_BOX
////Dialog Style End
class PortaParalelaFrm : public wxFrame
{
   private:
      DECLARE_EVENT_TABLE();

   public:
      PortaParalelaFrm(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("PortaParalela"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = PortaParalelaFrm_STYLE);
      virtual ~PortaParalelaFrm();
      void Botao1Click(wxCommandEvent& event);
      void outportb(short int End, unsigned char valor);
      void Botao2Click(wxCommandEvent& event);
      void Botao3Click(wxCommandEvent& event);
      void Botao4Click(wxCommandEvent& event);
      void Botao5Click(wxCommandEvent& event);
      void Botao6Click(wxCommandEvent& event);
      void Botao7Click(wxCommandEvent& event);
      void Botao8Click(wxCommandEvent& event);
      void Botao9Click(wxCommandEvent& event);
      void BotaoZerarClick(wxCommandEvent& event);
      void BotaoContadorClick(wxCommandEvent& event);

   private:
      //Do not add custom control declarations between
      //GUI Control Declaration Start and GUI Control Declaration End.
      //wxDev-C++ will remove them. Add custom code after the block.
      ////GUI Control Declaration Start
      wxButton *BotaoContador;
      wxStaticText *WxStaticText1;
      wxButton *BotaoZerar;
      wxButton *Botao8;
      wxButton *Botao7;
      wxButton *Botao6;
      wxButton *Botao5;
      wxButton *Botao4;
      wxButton *Botao3;
      wxButton *Botao2;
      wxButton *Botao1;
      wxPanel *WxPanel1;
      ////GUI Control Declaration End

   private:
        byte siValor;//esta variavel funciona bem para as funcoes dos botoes.
        //short int AdrIO;//aqui esta comentada para nao dar o erro
        //unsigned char ValOut;//aqui esta comentada para nao dar o erro
      //Note: if you receive any error with these enum IDs, then you need to
      //change your old form code that are based on the #define control IDs.
      //#defines may replace a numeric value for the enum names.
      //Try copy and pasting the below block in your old form header files.
      enum
      {
         ////GUI Enum Control ID Start
         ID_BOTAOCONTADOR = 1014,
         ID_WXSTATICTEXT1 = 1013,
         ID_BOTAOZERAR = 1012,
         ID_BOTAO8 = 1011,
         ID_BOTAO7 = 1010,
         ID_BOTAO6 = 1009,
         ID_BOTAO5 = 1008,
         ID_BOTAO4 = 1007,
         ID_BOTAO3 = 1006,
         ID_BOTAO2 = 1005,
         ID_BOTAO1 = 1004,
         ID_WXPANEL1 = 1002,
         ////GUI Enum Control ID End
         ID_DUMMY_VALUE_ //don't remove this value unless you have other enum values
      };

   private:
      void OnClose(wxCloseEvent& event);
      void CreateGUIControls();
};

#endif


Agora o codigo com as funcoes:
Código: Selecionar todos
//---------------------------------------------------------------------------
//
// Name:        PortaParalelaFrm.cpp
// Author:      Douglas
// Created:     5/18/2007 4:44:21 PM
// Description: PortaParalelaFrm class implementation
//
//---------------------------------------------------------------------------

#include "PortaParalelaFrm.h"

//Do not add custom headers between
//Header Include Start and Header Include End
//wxDev-C++ designer will remove them
////Header Include Start
////Header Include End

//----------------------------------------------------------------------------
// PortaParalelaFrm
//----------------------------------------------------------------------------
//Add Custom Events only in the appropriate block.
//Code added in other places will be removed by wxDev-C++
////Event Table Start
BEGIN_EVENT_TABLE(PortaParalelaFrm,wxFrame)
   ////Manual Code Start
   ////Manual Code End

   EVT_CLOSE(PortaParalelaFrm::OnClose)
   EVT_BUTTON(ID_BOTAOCONTADOR,PortaParalelaFrm::BotaoContadorClick)
   EVT_BUTTON(ID_BOTAOZERAR,PortaParalelaFrm::BotaoZerarClick)
   EVT_BUTTON(ID_BOTAO8,PortaParalelaFrm::Botao8Click)
   EVT_BUTTON(ID_BOTAO7,PortaParalelaFrm::Botao7Click)
   EVT_BUTTON(ID_BOTAO6,PortaParalelaFrm::Botao6Click)
   EVT_BUTTON(ID_BOTAO5,PortaParalelaFrm::Botao5Click)
   EVT_BUTTON(ID_BOTAO4,PortaParalelaFrm::Botao4Click)
   EVT_BUTTON(ID_BOTAO3,PortaParalelaFrm::Botao3Click)
   EVT_BUTTON(ID_BOTAO2,PortaParalelaFrm::Botao2Click)
   EVT_BUTTON(ID_BOTAO1,PortaParalelaFrm::Botao1Click)
END_EVENT_TABLE()
////Event Table End

PortaParalelaFrm::PortaParalelaFrm(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style)
: wxFrame(parent, id, title, position, size, style)
{
   CreateGUIControls();
   siValor=0;
   outportb(0x378, 0);
}

PortaParalelaFrm::~PortaParalelaFrm()
{
    outportb(0x378, 0);
}

void PortaParalelaFrm::CreateGUIControls()
{
   //Do not add custom code between
   //GUI Items Creation Start and GUI Items Creation End
   //wxDev-C++ designer will remove them.
   //Add the custom code before or after the blocks
   ////GUI Items Creation Start

   WxPanel1 = new wxPanel(this, ID_WXPANEL1, wxPoint(0,0), wxSize(289,180));
   WxPanel1->SetFont(wxFont(8, wxSWISS, wxNORMAL,wxNORMAL, false, wxT("Tahoma")));

   Botao1 = new wxButton(WxPanel1, ID_BOTAO1, wxT("1"), wxPoint(6,100), wxSize(25,25), 0, wxDefaultValidator, wxT("Botao1"));
   Botao1->SetFont(wxFont(8, wxSWISS, wxNORMAL,wxNORMAL, false, wxT("Tahoma")));

   Botao2 = new wxButton(WxPanel1, ID_BOTAO2, wxT("2"), wxPoint(42,100), wxSize(25,25), 0, wxDefaultValidator, wxT("Botao2"));
   Botao2->SetFont(wxFont(8, wxSWISS, wxNORMAL,wxNORMAL, false, wxT("Tahoma")));

   Botao3 = new wxButton(WxPanel1, ID_BOTAO3, wxT("3"), wxPoint(78,100), wxSize(25,25), 0, wxDefaultValidator, wxT("Botao3"));
   Botao3->SetFont(wxFont(8, wxSWISS, wxNORMAL,wxNORMAL, false, wxT("Tahoma")));

   Botao4 = new wxButton(WxPanel1, ID_BOTAO4, wxT("4"), wxPoint(115,100), wxSize(25,25), 0, wxDefaultValidator, wxT("Botao4"));
   Botao4->SetFont(wxFont(8, wxSWISS, wxNORMAL,wxNORMAL, false, wxT("Tahoma")));

   Botao5 = new wxButton(WxPanel1, ID_BOTAO5, wxT("5"), wxPoint(151,100), wxSize(25,25), 0, wxDefaultValidator, wxT("Botao5"));
   Botao5->SetFont(wxFont(8, wxSWISS, wxNORMAL,wxNORMAL, false, wxT("Tahoma")));

   Botao6 = new wxButton(WxPanel1, ID_BOTAO6, wxT("6"), wxPoint(187,100), wxSize(25,25), 0, wxDefaultValidator, wxT("Botao6"));
   Botao6->SetFont(wxFont(8, wxSWISS, wxNORMAL,wxNORMAL, false, wxT("Tahoma")));

   Botao7 = new wxButton(WxPanel1, ID_BOTAO7, wxT("7"), wxPoint(221,100), wxSize(25,25), 0, wxDefaultValidator, wxT("Botao7"));
   Botao7->SetFont(wxFont(8, wxSWISS, wxNORMAL,wxNORMAL, false, wxT("Tahoma")));

   Botao8 = new wxButton(WxPanel1, ID_BOTAO8, wxT("8"), wxPoint(256,100), wxSize(25,25), 0, wxDefaultValidator, wxT("Botao8"));
   Botao8->SetFont(wxFont(8, wxSWISS, wxNORMAL,wxNORMAL, false, wxT("Tahoma")));

   BotaoZerar = new wxButton(WxPanel1, ID_BOTAOZERAR, wxT("Zerar"), wxPoint(152,53), wxSize(75,25), 0, wxDefaultValidator, wxT("BotaoZerar"));
   BotaoZerar->SetFont(wxFont(8, wxSWISS, wxNORMAL,wxNORMAL, false, wxT("Tahoma")));

   WxStaticText1 = new wxStaticText(WxPanel1, ID_WXSTATICTEXT1, wxT("0"), wxPoint(135,14), wxDefaultSize, 0, wxT("WxStaticText1"));
   WxStaticText1->SetFont(wxFont(8, wxSWISS, wxNORMAL,wxNORMAL, false, wxT("Tahoma")));

   BotaoContador = new wxButton(WxPanel1, ID_BOTAOCONTADOR, wxT("Contador"), wxPoint(39,52), wxSize(75,25), 0, wxDefaultValidator, wxT("BotaoContador"));
   BotaoContador->SetFont(wxFont(8, wxSWISS, wxNORMAL,wxNORMAL, false, wxT("Tahoma")));

   SetTitle(wxT("PortaParalela"));
   SetIcon(wxNullIcon);
   SetSize(8,8,297,214);
   Center();

   ////GUI Items Creation End
}
void PortaParalelaFrm::OnClose(wxCloseEvent& event)
{
   Destroy();
}
//byte siValor =0;//somente esta que funciona dentro da classe
short int AdrIO;// tenho que declarar aqui para que funcione
unsigned char ValOut;//aqui tambem
void PortaParalelaFrm::outportb(short int End, unsigned char valor)
{
   ValOut = valor;
   AdrIO = End;
   __asm("mov _AdrIO,%dx");
   __asm("mov _ValOut,%al");
   __asm("out %al, %dx");
}

/*
 * WxButton2Click
 */
void PortaParalelaFrm::Botao1Click(wxCommandEvent& event)
{
    siValor=1;
   outportb(0x378, siValor);
   WxStaticText1->SetLabel("1");
}

/*
 * WxButton3Click
 */
void PortaParalelaFrm::Botao2Click(wxCommandEvent& event)
{
    siValor=2;
   outportb(0x378, siValor);
   WxStaticText1->SetLabel("2");
}

/*
 * WxButton4Click
 */
void PortaParalelaFrm::Botao3Click(wxCommandEvent& event)
{
    siValor=3;
   outportb(0x378, siValor);
   WxStaticText1->SetLabel("3");
}

/*
 * WxButton5Click
 */
void PortaParalelaFrm::Botao4Click(wxCommandEvent& event)
{
    siValor=4;
   outportb(0x378, siValor);
   WxStaticText1->SetLabel("4");
}

/*
 * WxButton6Click
 */
void PortaParalelaFrm::Botao5Click(wxCommandEvent& event)
{
    siValor=5;
   outportb(0x378, siValor);
   WxStaticText1->SetLabel("5");
}

/*
 * WxButton7Click
 */
void PortaParalelaFrm::Botao6Click(wxCommandEvent& event)
{
    siValor=6;
   outportb(0x378, siValor);
   WxStaticText1->SetLabel("6");
}

/*
 * WxButton8Click
 */
void PortaParalelaFrm::Botao7Click(wxCommandEvent& event)
{
    siValor=7;
   outportb(0x378, siValor);
   WxStaticText1->SetLabel("7");
}

/*
 * WxButton9Click
 */
void PortaParalelaFrm::Botao8Click(wxCommandEvent& event)
{
    siValor=8;
   outportb(0x378, siValor);
   WxStaticText1->SetLabel("8");
}

/*
 * WxButton10Click
 */
void PortaParalelaFrm::BotaoZerarClick(wxCommandEvent& event)
{
   outportb(0x378, 0);
   siValor=0;
   WxStaticText1->SetLabel("0");
}


/*
 * BotaoContadorClick
 */
void PortaParalelaFrm::BotaoContadorClick(wxCommandEvent& event)
{
    wxString s;
   siValor++;
   WxStaticText1->SetLabel(s << siValor);
    outportb(0x378, siValor); //Todos os pinos em nível alto.
}


Corrigindo o erro da minha primeira postagem , eh que sao duas variaveis que nao podem ser declaradas na classe , estas sao as duas
tenho que declarar estas variavei no codigo das funcoes para que funcione bem antes do codigo da porta paralela.
short int AdrIO;
unsigned char ValOut;
E esta variavel byte siValor =0; posso declarar na classe normalmente, ela e somente usada nas funcoes dos eventos dos botoes, as outras duas sao usadas no codigo da porta paralela. Uma pergunta simples, se o codigo da porta paralela esta declarado dentro da classe teria que aceitar normalmente estas variaveis como membro da classe ou eu nao estou enchergando o alcance destas variaveis na classe?
eu coloquei comentarios nas variaveis que estao no codigo indicando o problema.
Valeu!
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null

Mensagempor ivan » 22 Mai 2007 23:17

Doglao,

Me parece que o método PortaParalelaFrm::outportb não tem um escopo definido, penso q deveria ser declarado como public. Não lembro de cabeça qual o escopo default qdo nenhum é declarado.
Mas antes, tire o comentário da declaração de suas variáveis com prob e faça referencia a elas no método onClose() q está declarado como private, e claro, comentando a referência a elas na função PortaParalelaFrm::outportb. Se o prob do linker se resolver, então declare o escopo de PortaParalelaFrm::outportb q deve funcionar normalmente.
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Mensagempor ivan » 28 Mai 2007 19:01

E aí? Funcionou?
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Mensagempor Doglao » 28 Mai 2007 21:57

ivan escreveu:Doglao,

Me parece que o método PortaParalelaFrm::outportb não tem um escopo definido, penso q deveria ser declarado como public. Não lembro de cabeça qual o escopo default qdo nenhum é declarado.
Mas antes, tire o comentário da declaração de suas variáveis com prob e faça referencia a elas no método onClose() q está declarado como private, e claro, comentando a referência a elas na função PortaParalelaFrm::outportb. Se o prob do linker se resolver, então declare o escopo de PortaParalelaFrm::outportb q deve funcionar normalmente.


Ola Ivan!
eu nao consegui fazer funcionar nao, pelo codigo da classe ela esta como public, como eh isso de tirar o comentario com "prob"? coloquei na onclose e da o mesmo erro, queria colocar estas variaveis na classe para ser acessada pelos metodos da classe, mas se coloco no codigo de declaracao das funcoes como global funciona, estou usando agora o Porttalk para acessar a porta paralela, e nao mais a funcao assembler porque nao estava conseguindo escrever no registro de CONTROLE da porta paralela com devcpp, mas com o porttalk consigo bem, entao vou continuar esta discusao para efeito de saber porque que nao linka estas variaveis
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null

Mensagempor ivan » 29 Mai 2007 19:53

tire o comentário da declaração de suas variáveis com prob



Significaria retirar o comentário das linhas comentadas no trecho de código abaixo:

Código: Selecionar todos
   private:
        byte siValor;//esta variavel funciona bem para as funcoes dos botoes.
        //short int AdrIO;//aqui esta comentada para nao dar o erro
        //unsigned char ValOut;//aqui esta comentada para nao dar o erro
...
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Mensagempor Doglao » 29 Mai 2007 20:49

ah bao! tinha me perdido no prob, hehehe mas foi feito isso, e como dizia as variaveis continuam como antes nada de linkar e ja coloquei en todas portes possiveis na classe e fica do mesmo jeito.
obrigado
null
Doglao
Byte
 
Mensagens: 101
Registrado em: 12 Mai 2007 12:13
Localização: null

Mensagempor ivan » 30 Mai 2007 10:32

Doglao,

Como não é possível replicar o seu ambiente pra compilar a classe (vai dar um trabalhão), posta a msg de erro pra ver se posso ajudar.
Independente disso, é sempre recomendável que os acessos aos valores de variáveis membro de classe só sejam feitos através de métodos setter e getter, mesmo para métodos da própria classe. Isso é um dos padrões impostos pela técnica de OO.
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27


Voltar para Visual C++/C/C++/C#

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x