Avatar billede mookid8000 Nybegynder
26. marts 2004 - 13:51 Der er 8 kommentarer og
1 løsning

Adgang til private data i klasse fra interruptrutine

Hej!

Jeg sidder og programmerer en klasse, WheelPulseSensor, som indeholder en interrupt service rutine - se nedenstående headerfil (constructoren foretager al nødvendig opsætning af interrupt service rutinen og starter interrupts og det hele).

Problemet er at jeg får linkerfejl når jeg forsøger at køre det - variablen pulses kan ikke resolves under linkningen...


------------------------------------------------------
class WheelPulseSensor {

public:
    WheelPulseSensor();

    int getPulses() {
                return pulses;
        }

    static void RTKAPI IRQHandler() {
                pulses ++;

        RTKEnableInterrupts();
        RTKIRQEnd(irq_to_respond_to);
    }

private:
    static const int irq_to_respond_to = 5;
   
    static int pulses;
};
Avatar billede arne_v Ekspert
26. marts 2004 - 14:11 #1
Der mangler vel en:

int WheelPulseSensor::pulses = 0;
Avatar billede segmose Nybegynder
26. marts 2004 - 16:27 #2
Køre du RTKernel?
Avatar billede mookid8000 Nybegynder
26. marts 2004 - 16:35 #3
>>Der mangler vel en:
>>
>>int WheelPulseSensor::pulses = 0;

Nej, i constructoren sættes de statiske variable til 0. Og man kan jo ikke gøre det i header-filen medmindre de også er const, men det dur ikke.



>>Køre du RTKernel?

ja :o)
Avatar billede arne_v Ekspert
26. marts 2004 - 20:13 #4
Jeg skal starte med at sige at jeg kender intet til environmentet.

Men jeg forstår ikke hvad sammenhængen mellem at pulses bliver initialiseret
i constructor og om den bliver defineret er.

C:\>type x1.cpp
class X
{
  public:
      static int n;
      X();
};

X::X()
{
  n = 0;
}

int main()
{
  X x;
  return 0;
}

C:\>cl x1.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

x1.cpp
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:x1.exe
x1.obj
x1.obj : error LNK2001: unresolved external symbol "public: static int  X::n" (?n@X@@2HA)
x1.exe : fatal error LNK1120: 1 unresolved externals

C:\>type x2.cpp
class X
{
  public:
      static int n;
      X();
};

X::X()
{
  n = 0;
}

int X::n = 0;

int main()
{
  X x;
  return 0;
}

C:\>cl x2.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

x2.cpp
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:x2.exe
x2.obj
Avatar billede mookid8000 Nybegynder
27. marts 2004 - 11:59 #5
minsandten, det ser ud til at det virker!

hvordan kan det være at man skal sætte den statiske variabel ude fra "ingenting"?
Avatar billede mookid8000 Nybegynder
27. marts 2004 - 12:01 #6
hvordan giver jeg dig de 150 point? jeg er ny her på Eksperten... :o)
Avatar billede arne_v Ekspert
27. marts 2004 - 18:21 #7
Jeg ligger et svar som du kan acceptere
Avatar billede arne_v Ekspert
27. marts 2004 - 18:22 #8
Sådan er statiske klasse variabel i C++
Avatar billede mookid8000 Nybegynder
27. marts 2004 - 19:10 #9
sådan, du - og tak for det gode eksempel!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester