/ 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
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
C++ Initialisering af static array
Fra : Michael


Dato : 05-01-10 21:05

Hej Gruppe

Jeg har "arvet" et større projekt hvor jeg skal lave lidt ændringer.
GCC version 3.2.2 bruges som compiler.

I en statisk funktion har jeg brug for et statisk array.
Mit problem er med initialiseringen af dette statiske array.
Arrayets størrelse bliver fastsat af en enum.
Jeg vil gerne sikre mig at hvis der ændres i denne enum at
initialiseringen af arrayet stadig er korrekt.
Jeg har prøvet med bool myClass::myArray[3] = {false, false, false};
Ved denne metode får jeg kun compiler-fejl hvis jeg angiver flere "init-
værdier" end arrayets størrelse og ingen fejl hvis jeg angiver færre
"init-værdier" end arrayets størrelse.
Compileren burde vist implicit initialisere arrayet til false men jeg vil
gerne ha' det eksplicit.

Klassen har ikke en constructor der bliver kaldt ved brug af klassens
metoder og jeg ved heller ikke hvornår jeg "manuelt" skulle initialisere
arrayet og jeg vil undgå at skulle bruge et init-flag hver gang arrayet
skal læses.

Er der nogle herinde der har et godt råd til hvordan jeg får
initialiseret mit statiske array og får compiler-fejl hvis arrayets
størrelse (enum) ændrer sig uden at "init-værdierne"

På forhånd tak
Michael

 
 
Bertel Brander (05-01-2010)
Kommentar
Fra : Bertel Brander


Dato : 05-01-10 23:05

Michael skrev:
> Hej Gruppe
>
> Jeg har "arvet" et større projekt hvor jeg skal lave lidt ændringer.
> GCC version 3.2.2 bruges som compiler.
>
> I en statisk funktion har jeg brug for et statisk array.
> Mit problem er med initialiseringen af dette statiske array.
> Arrayets størrelse bliver fastsat af en enum.
> Jeg vil gerne sikre mig at hvis der ændres i denne enum at
> initialiseringen af arrayet stadig er korrekt.
> Jeg har prøvet med bool myClass::myArray[3] = {false, false, false};
> Ved denne metode får jeg kun compiler-fejl hvis jeg angiver flere "init-
> værdier" end arrayets størrelse og ingen fejl hvis jeg angiver færre
> "init-værdier" end arrayets størrelse.
> Compileren burde vist implicit initialisere arrayet til false men jeg vil
> gerne ha' det eksplicit.
>
> Klassen har ikke en constructor der bliver kaldt ved brug af klassens
> metoder og jeg ved heller ikke hvornår jeg "manuelt" skulle initialisere
> arrayet og jeg vil undgå at skulle bruge et init-flag hver gang arrayet
> skal læses.
>
> Er der nogle herinde der har et godt råd til hvordan jeg får
> initialiseret mit statiske array og får compiler-fejl hvis arrayets
> størrelse (enum) ændrer sig uden at "init-værdierne"


Der er vist ikke nogen vildt elegant måde at gøre det på.
Det smarteste er nok at lave en constructor der initialiserer
objekterne. Det kan så enten gøres ved at du laver en class
der arver fra bool men som initialiserer objectet til false,
eller du kan lave en container der gør det for dig. Den
hurtige måde er at lave dit array om til en std::vector,
som kan sættes til at initialicere objekterne.

Mogens Hansen (06-01-2010)
Kommentar
Fra : Mogens Hansen


Dato : 06-01-10 08:34


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:4b43b774$0$36567$edfadb0f@dtext01.news.tele.dk...


[8<8<8<]
> Det kan så enten gøres ved at du laver en class
> der arver fra bool men som initialiserer objectet til false,

En klasse kan ikke arve fra bool (eller andre primitive typer som int,
float)

--
Venlig hilsen

Mogens Hansen



Michael Rasmussen (05-01-2010)
Kommentar
Fra : Michael Rasmussen


Dato : 05-01-10 23:37

On Tue, 05 Jan 2010 23:04:50 +0100
Bertel Brander <bertel@post4.tele.dk> wrote:

> hurtige måde er at lave dit array om til en std::vector,
> som kan sættes til at initialicere objekterne.
Kunne man ikke også lave en template klasse, der havde størrelse som
parameter.

--
Hilsen/Regards
Michael Rasmussen
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xE3E80917
A computer is like air conditioning: it becomes useless when you open
windows.


Michael Rasmussen (06-01-2010)
Kommentar
Fra : Michael Rasmussen


Dato : 06-01-10 01:07

On Wed, 06 Jan 2010 00:41:01 +0100
Bertel Brander <bertel@post4.tele.dk> wrote:

> overveje exceptions, osv. Men der er måske ikke vundet
> ret meget i forhold til en std::vector
Hvis vi kun skal have en liste af bool, kan man for relativt små data
mængder vinde meget ved at anvende unsigned int som en bit sekvens.

unsigned int b_array = 0; // alle elementer er false
int b_array = UINT_MAX; // alle elementer er true


--
Hilsen/Regards
Michael Rasmussen
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xE3E80917
A computer is like air conditioning: it becomes useless when you open
windows.


Mogens Hansen (06-01-2010)
Kommentar
Fra : Mogens Hansen


Dato : 06-01-10 08:34


"Michael" <not_valid@noemail.com> wrote in message
news:4b439b76$0$36580$edfadb0f@dtext01.news.tele.dk...
> Hej Gruppe
>
> Jeg har "arvet" et større projekt hvor jeg skal lave lidt ændringer.
> GCC version 3.2.2 bruges som compiler.
>
> I en statisk funktion har jeg brug for et statisk array.
> Mit problem er med initialiseringen af dette statiske array.
> Arrayets størrelse bliver fastsat af en enum.
> Jeg vil gerne sikre mig at hvis der ændres i denne enum at
> initialiseringen af arrayet stadig er korrekt.
> Jeg har prøvet med bool myClass::myArray[3] = {false, false, false};
> Ved denne metode får jeg kun compiler-fejl hvis jeg angiver flere "init-
> værdier" end arrayets størrelse og ingen fejl hvis jeg angiver færre
> "init-værdier" end arrayets størrelse.
> Compileren burde vist implicit initialisere arrayet til false men jeg vil
> gerne ha' det eksplicit.
>
> Klassen har ikke en constructor der bliver kaldt ved brug af klassens
> metoder og jeg ved heller ikke hvornår jeg "manuelt" skulle initialisere
> arrayet og jeg vil undgå at skulle bruge et init-flag hver gang arrayet
> skal læses.
>
> Er der nogle herinde der har et godt råd til hvordan jeg får
> initialiseret mit statiske array og får compiler-fejl hvis arrayets
> størrelse (enum) ændrer sig uden at "init-værdierne"

Kan du skrive lidt kode der illustrerer dit problem og design ?
Det står ikke helt tydeligt for mig, hvad dit problem er

--
Venlig hilsen

Mogens Hansen



Michael (06-01-2010)
Kommentar
Fra : Michael


Dato : 06-01-10 20:03

Alle: Tak for inputs indtil videre, jeg vil prøve at kigge lidt på
templates.

Her er et eksempel jeg håber der viser mit "problem":
I private-delen af header filen er flg definition:
static bool myArray[];

I starten af c++ filen har jeg flg initialisering:
bool myClass::myArray[ARRAYSIZE] ={false, false, false, false};

I dette tilfælde er ARRAYSIZE lig 4.
Hvis ARRAYSIZE bliver lig 3 så advarer compileren mig med at jeg
initialiserer med for mange værdier.
Hvis ARRAYSIZE derimod bliver større end 4 får jeg ingen fejl/warnings.

Jeg vil gerne lave det lidt sikkert/elegant så at hvis ARRAYSIZE ændres
så gøres initialiseringen så det passer med den nye array-størrelse eller
at compileren i det mindste giver en compile fejl/advarsel.
Er der nogen der ved om dette er muligt ?

På forhånd tak
/Michael

On Wed, 06 Jan 2010 08:33:46 +0100, Mogens Hansen wrote:

> "Michael" <not_valid@noemail.com> wrote in message
> news:4b439b76$0$36580$edfadb0f@dtext01.news.tele.dk...
>> Hej Gruppe
>>
>> Jeg har "arvet" et større projekt hvor jeg skal lave lidt ændringer.
>> GCC version 3.2.2 bruges som compiler.
>>
>> I en statisk funktion har jeg brug for et statisk array. Mit problem er
>> med initialiseringen af dette statiske array. Arrayets størrelse bliver
>> fastsat af en enum. Jeg vil gerne sikre mig at hvis der ændres i denne
>> enum at initialiseringen af arrayet stadig er korrekt. Jeg har prøvet
>> med bool myClass::myArray[3] = {false, false, false}; Ved denne metode
>> får jeg kun compiler-fejl hvis jeg angiver flere "init- værdier" end
>> arrayets størrelse og ingen fejl hvis jeg angiver færre "init-værdier"
>> end arrayets størrelse. Compileren burde vist implicit initialisere
>> arrayet til false men jeg vil gerne ha' det eksplicit.
>>
>> Klassen har ikke en constructor der bliver kaldt ved brug af klassens
>> metoder og jeg ved heller ikke hvornår jeg "manuelt" skulle
>> initialisere arrayet og jeg vil undgå at skulle bruge et init-flag hver
>> gang arrayet skal læses.
>>
>> Er der nogle herinde der har et godt råd til hvordan jeg får
>> initialiseret mit statiske array og får compiler-fejl hvis arrayets
>> størrelse (enum) ændrer sig uden at "init-værdierne"
>
> Kan du skrive lidt kode der illustrerer dit problem og design ? Det står
> ikke helt tydeligt for mig, hvad dit problem er


Asger Joergensen (12-02-2010)
Kommentar
Fra : Asger Joergensen


Dato : 12-02-10 04:20

Hi Michael

Michael wrote:

> Hej Gruppe
>
> Jeg har "arvet" et større projekt hvor jeg skal lave lidt ændringer.
> GCC version 3.2.2 bruges som compiler.
>
> I en statisk funktion har jeg brug for et statisk array.
> Mit problem er med initialiseringen af dette statiske array.
> Arrayets størrelse bliver fastsat af en enum.
> Jeg vil gerne sikre mig at hvis der ændres i denne enum at
> initialiseringen af arrayet stadig er korrekt.
> Jeg har prøvet med bool myClass::myArray[3] = {false, false, false};

Det er godt nok lidt sent, men jeg kom først forbi i dag.
Jeg har lige testet det her

#define C 200000
if(true)
{
bool test[C] = {0};
int i;
for(i = 0; i < C; ++i)
test[i] = true;
}

bool test[C] = {0};
for(int i = 0; i < C; ++i)
if(test[i])OutputDebugStringW(L"True");

og med det ser det ud til at man kan gøre det samme som med en
struct, altså = {0}; og så bliver det hele sat til 0, men bruger man
f.eks 1 i stedt for 0 så er det kun den første der bliver sat
til værdien.
Hvis jeg fjerner = {0}; så er de fleste true.

testet i CB 2009.

Venlig hilsen
Asger



Søg
Reklame
Statistik
Spørgsmål : 177564
Tips : 31968
Nyheder : 719565
Indlæg : 6408970
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste