/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
initialisering af static medlem
Fra : Hansen


Dato : 27-06-05 20:42

Hejsa

Jeg sidder med et problem i en embedded verden hvor jeg anvender C++.
Problemet er at jeg skal initialisere en række statiske klasser der er
private medlemmer i deres egen klasse. Som jeg gør det lige nu, ser det ud
til at konstruktøren ikke bliver kaldt, hvilket jeg ikke lige kan forstå.
Eksemplet her forklarer hvordan det ser ud:

(Header)
class A
{
public:
A(int x);
int m_x;
private:
static A m_a;
static A m_b;

};
(Source)
A A::m_a(1);
A A::m_b(2);

A::A(int x)
{
m_x = x;
}


Problemet er at m_x ikke bliver instantieret for m_a og m_b, selvom jeg
definere dem med parametrer.

Jeg er ikke sikker på at det ovenstående reelt set er muligt? Hvis det er,
er jeg ikke i stand til at gennemskue hvad problemet er ...

Mvh
Søren



 
 
Bertel Brander (27-06-2005)
Kommentar
Fra : Bertel Brander


Dato : 27-06-05 21:01

Hansen wrote:
> Problemet er at m_x ikke bliver instantieret for m_a og m_b, selvom jeg
> definere dem med parametrer.
>
> Jeg er ikke sikker på at det ovenstående reelt set er muligt? Hvis det er,
> er jeg ikke i stand til at gennemskue hvad problemet er ...

Ingen af de fire kompilere jeg pt. har på min pc har problemer
med dette:

#include <iostream>
class A
{
public:
A(int x);
int m_x;
public:
static A m_a;
static A m_b;

};

A A::m_a(1);
A A::m_b(2);

A::A(int x)
{
m_x = x;
}

int main()
{
A a(0);
std::cout << a.m_x << " " << a.m_a.m_x << " " << a.m_b.m_x << std::endl;
}

Bliver "almindelige" static initialiseret?
På mange embeddede platforme skal man selv sikre sig at
static constructorer bliver kaldt. Hvilken platform
bruger du?

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Hansen (28-06-2005)
Kommentar
Fra : Hansen


Dato : 28-06-05 06:28


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:42c05ae0$0$206$edfadb0f@dread11.news.tele.dk...
> Bliver "almindelige" static initialiseret?
> På mange embeddede platforme skal man selv sikre sig at
> static constructorer bliver kaldt. Hvilken platform
> bruger du?

Det er en ARM7 platform (LPC2132). Jeg bruger GNUARM compileren fra
gnuarm.com.
I fald jeg selv skal sikre mig at constructoren bliver kaldt, er det så i
startup.s det skal gøres?

/Søren



Mogens Hansen (28-06-2005)
Kommentar
Fra : Mogens Hansen


Dato : 28-06-05 08:12


"Hansen" <bluesboys@-remove-this-hotmail.com> wrote in message
news:d9qn63$cpi$1@news.net.uni-c.dk...

[8<8<8<]
> I fald jeg selv skal sikre mig at constructoren bliver kaldt, er det så i
> startup.s det skal gøres?

Det burde bare virke - også med compilere til embeddede systemer; jeg har
ofte benyttet næsten tilsvarende konstruktioner i embeddede systemer.

Hvis det er en defekt compiler, bør du overveje en ekstra gang om den er
værd at bruge - hvem ved hvilke andre "særheder" den lider af ?

Venlig hilsen

Mogens Hansen



Bertel Brander (28-06-2005)
Kommentar
Fra : Bertel Brander


Dato : 28-06-05 19:25

Hansen wrote:
> "Bertel Brander" <bertel@post4.tele.dk> wrote in message
> news:42c05ae0$0$206$edfadb0f@dread11.news.tele.dk...
>
>>Bliver "almindelige" static initialiseret?
>>På mange embeddede platforme skal man selv sikre sig at
>>static constructorer bliver kaldt. Hvilken platform
>>bruger du?
>
>
> Det er en ARM7 platform (LPC2132). Jeg bruger GNUARM compileren fra
> gnuarm.com.
> I fald jeg selv skal sikre mig at constructoren bliver kaldt, er det så i
> startup.s det skal gøres?

Jeg har kun prøvet med ARM og wxWorks (der bygger på GNU), her
skulle man køre et script under linkning der laver en liste over
alle static constructorer.

Du skal sansynligvis kalde en eller anden funktion fra din
startup kode.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Mogens Hansen (28-06-2005)
Kommentar
Fra : Mogens Hansen


Dato : 28-06-05 08:12


"Hansen" <bluesboys@-remove.me-hotmail.com> wrote in message
news:42c05685$0$10682$ba624c82@nntp06.dk.telia.net...

[8<8<8<]
> Som jeg gør det lige nu, ser det ud til at konstruktøren ikke bliver
> kaldt, hvilket jeg ikke lige kan forstå.

Hvordan konstaterer du det ?

[8<8<8<]
> A::A(int x)
> {
> m_x = x;

Foretræk initialisering frem for tildeling:

A::A(int x) :
m_x(x)
{
}

[8<8<8<]
> Jeg er ikke sikker på at det ovenstående reelt set er muligt?

Det er muligt.

> Hvis det er, er jeg ikke i stand til at gennemskue hvad problemet er ...

Enten observerer du noget andet end du tror, eller også bruger du en defekt
compiler.

Venlig hilsen

Mogens Hansen



Hansen (28-06-2005)
Kommentar
Fra : Hansen


Dato : 28-06-05 08:22


"Mogens Hansen" <mogens_h@dk-online.dk> wrote in message
news:42c0f850$0$67256$157c6196@dreader2.cybercity.dk...
> [8<8<8<]
>> Som jeg gør det lige nu, ser det ud til at konstruktøren ikke bliver
>> kaldt, hvilket jeg ikke lige kan forstå.
>
> Hvordan konstaterer du det ?

Jeg bruger arm-elf-gdb til at steppe mig igennem koden. Jeg har også prøvet
at trække værdien ud ved alm kørsel og teste på den, og sætte en LED ud fra
resultatet, med samme resultat.

> [8<8<8<]
>> A::A(int x)
>> {
>> m_x = x;
>
> Foretræk initialisering frem for tildeling:
>
> A::A(int x) :
> m_x(x)
> {
> }

Ok - noteret

> [8<8<8<]
>> Jeg er ikke sikker på at det ovenstående reelt set er muligt?
>
> Det er muligt.
>
>> Hvis det er, er jeg ikke i stand til at gennemskue hvad problemet er ...
>
> Enten observerer du noget andet end du tror, eller også bruger du en
> defekt compiler.

Måske det er noget andet i min kode der er problemet. Måske jeg skulle sende
hele koden som mail?

/Søren



Mogens Hansen (28-06-2005)
Kommentar
Fra : Mogens Hansen


Dato : 28-06-05 08:33


"Hansen" <bluesboys@-remove-this-hotmail.com> wrote in message
news:d9qtq4$eta$1@news.net.uni-c.dk...

[8<8<8<]
> Jeg bruger arm-elf-gdb til at steppe mig igennem koden. Jeg har også
> prøvet at trække værdien ud ved alm kørsel og teste på den, og sætte en
> LED ud fra resultatet, med samme resultat.

Det lyder umiddelbart rimeligt grundigt.

[8<8<8]
> Måske det er noget andet i min kode der er problemet. Måske jeg skulle
> sende hele koden som mail?

Lav det mindst mulige program, i stil med hvad Bertel Brander lavede, og
påvis at programmet ikke opfører sig rigtigt og prøv at kontakte compiler
leverandøren.
Prøv eventuelt at lave et global objekt af typen A, og se om det gør nogen
forskel (det burde ikke give nogen forskel).

Venlig hilsen

Mogens Hansen



Klaus Hebsgaard (29-06-2005)
Kommentar
Fra : Klaus Hebsgaard


Dato : 29-06-05 11:49

http://groups.google.dk/groups?hl=da&lr=&frame=right&th=2af058191001903e&seekm=d30a3q%24c6u%241%40news1.zwoll1.ov.home.nl#link1
"Hansen" <bluesboys@-remove.me-hotmail.com> wrote in message
news:42c05685$0$10682$ba624c82@nntp06.dk.telia.net...
> Hejsa
>
> Jeg sidder med et problem i en embedded verden hvor jeg anvender C++.
> Problemet er at jeg skal initialisere en række statiske klasser der er
> private medlemmer i deres egen klasse. Som jeg gør det lige nu, ser det ud
> til at konstruktøren ikke bliver kaldt, hvilket jeg ikke lige kan forstå.
> Eksemplet her forklarer hvordan det ser ud:
>
> (Header)
> class A
> {
> public:
> A(int x);
> int m_x;
> private:
> static A m_a;
> static A m_b;
>
> };
> (Source)
> A A::m_a(1);
> A A::m_b(2);
>
> A::A(int x)
> {
> m_x = x;
> }
>
>
> Problemet er at m_x ikke bliver instantieret for m_a og m_b, selvom jeg
> definere dem med parametrer.
>
> Jeg er ikke sikker på at det ovenstående reelt set er muligt? Hvis det er,
> er jeg ikke i stand til at gennemskue hvad problemet er ...
>
> Mvh
> Søren
>



Troels Thomsen (07-07-2005)
Søg
Reklame
Statistik
Spørgsmål : 177438
Tips : 31962
Nyheder : 719565
Indlæg : 6408046
Brugere : 218879

Månedens bedste
Årets bedste
Sidste års bedste