Avatar billede f2f4 Novice
17. marts 2004 - 20:35 Der er 11 kommentarer og
2 løsninger

Nulstilling af struct

Jeg har nogle initialiseringsproblemer i (ANSI) C.

Når jeg kompilere nedenstående i Borland C++ builder 3 er der ingen problemer men hvis jeg kompilere det i MS Visual C++ 6.0 er det bliver hele structen ikke nulstilles!?

Ex.
struct var4Type
{
  double var4;
  double var5;
}
struct Hovedstruktur
{
  double var1;
  double var2;
  double var3;
  struct var4Type var4[10];
}

:

Min kode:
  struct Hovedstruktur *Hoved;
  Hoved = new Hovedstruktur;
  memset(Hoved, 0, sizeof(Hovedstruktur));

Alt ser fint ud i BCB men i MSVC bliver alle variable ikke nulstillet! Burde de ikke det (!?) eller er nedenstående 'mere rigtigt':

  memset(Hoved, 0, sizeof(Hovedstruktur)+(10*sizeof(var4Type)) );

Tak for eventuel hjælp.

/Morten
Avatar billede bertelbrander Novice
17. marts 2004 - 22:56 #1
Jeg kan ikke se at der skulle være noget galt med memset(Hoved, 0, sizeof(Hovedstruktur)), selv om jeg ville skrive memset(Hoved, 0, sizeof(*Hoved)).

memset(Hoved, 0, sizeof(Hovedstruktur)+(10*sizeof(var4Type)) ) er ikke rigtigt.

Der er tilsyneladende ikke problemer med følgende program og VC++

#include <stdio.h>
#include <string.h>

struct var4Type
{
  double var4;
  double var5;
};

struct Hovedstruktur
{
  double var1;
  double var2;
  double var3;
  struct var4Type var4[10];
};

int main()
{
  struct Hovedstruktur *Hoved;
  Hoved = new Hovedstruktur;
  memset(Hoved, 0, sizeof(Hovedstruktur));
  printf("Check: %f\n", Hoved->var4[9].var5);

  return 0;
}

Der er ingen new i Ansi-C, det er der i Ansi-C++
Avatar billede coldplay Nybegynder
17. marts 2004 - 22:57 #2
struct var4Type
{
  double var4; // 8 bytes
  double var5; // 16 bytes akkumuleret
};
struct Hovedstruktur
{
  double var1; // 8 bytes
  double var2; // 16 bytes
  double var3; // 24 bytes
  struct var4Type var4[10]; // 184 bytes akkumuleret
};


struct Hovedstruktur *Hoved =  new Hovedstruktur;
Hoved  = (Hovedstruktur *)memset(Hoved, 0, sizeof(Hovedstruktur));

printf("%f\n", Hoved->var4); /* sammenhold med sidste printf sætning */
printf("%f\n", Hoved->var5); /* giver kompileringsfejl */
printf("%f\n", Hoved->var4[0].var4);

delete Hoved;
Avatar billede segmose Nybegynder
18. marts 2004 - 12:10 #3
Coldplay:
printf("%f\n", Hoved->var5); /* giver kompileringsfejl */
du mener vel Hoved->var4[0].var5 eller sådan noget???

hvad får du forøvrigt ud af:
printf("size=%ld\n", (long)sizeof(struct Hovedstruktur));
(hvad er egentlig %??? for size_t??? i den nyeste C++)

Får du ikke sizeof til følgende:
float 4
double 6
long double 8
Avatar billede rrn Nybegynder
18. marts 2004 - 17:50 #4
Morten:
Jeg har ikke noget svar på dit konkrete spørgsmål, men hvis du ikke er meget opsat på at optimere, ville jeg foreslå at klare initialiseringen vha. constructor'e:

struct var4Type
{
  double var4;
  double var5;

  var4Type(): var4(0.0), var5(0.0) {}
}
struct Hovedstruktur
{
  double var1;
  double var2;
  double var3;
  struct var4Type var4[10];

  Hovedstruktur(): var1(0.0), var2(0.0), var3(0.0) {}
}
Avatar billede coldplay Nybegynder
18. marts 2004 - 23:46 #5
segmose-->

forvirringen (min) skyldes sammenfaldet mellem (markeret med "<--"):

struct var4Type
{
  double var4; <--
  double var5; // 16 bytes akkumuleret
};
struct Hovedstruktur
{
  double var1; // 8 bytes
  double var2; // 16 bytes
  double var3; // 24 bytes
  struct var4Type var4[10]; <--
};

"hvad får du forøvrigt ud af: printf("size=%ld\n", (long)sizeof(struct Hovedstruktur));"

svar--> 184 bytes

"(hvad er egentlig %??? for size_t??? i den nyeste C++)"

svar-->

1) hvis du spørger uden at vide det selv, så er mit svar "ved det ikke".

2) hvis du spørger fordi du selv ved det, så fortæl.
Avatar billede bertelbrander Novice
19. marts 2004 - 00:19 #6
>> "(hvad er egentlig %??? for size_t??? i den nyeste C++)"

size_t x = whatever();
std::cout << x << std::endl; // ;-)

I C99 har man opfundet: %zd

I pre-C99 ville man caste til en (unsigned) long, og bruge %ld/%lu
Avatar billede segmose Nybegynder
19. marts 2004 - 10:06 #7
coldplay:
Du har ret i det kunne jeg jo godt have gjort med det samme:
4, 8, 10 henholdsvis, jeg mente de var 4, 6 og 8 i hvilket tilfælde dine tal havde været forkert hvis der var kørt med byte align 1 eller 2.
Avatar billede f2f4 Novice
25. marts 2004 - 08:58 #8
Undskyld jeg ikke har fulgt op på denne! Diskussionen tog vist en drejning der ikke hjalp mig!
Summs sumarum: Jeg har stadig problemet og undrer mig over det - MSV kontra BCB. Men ja nogle havde ret i at det ikke helt er ANSI-C! (-;
Avatar billede rrn Nybegynder
25. marts 2004 - 09:13 #9
Jeg tror ikke vi (der ikke har MSVC og BCB) kommer det nærmere med den tilgængelige information.

Selv ville jeg starte med følgende:

1. Finde det mindste eksempel, som giver problemet: Kan elementer af strukturen fjernes uden at problemet forsvinder? Er der problemer i et program, som kun lige indeholder de kodelinier, du har i oplægget?

2. Checke at værdien af bytes'ene i strukturen efter (mislykket) nulstilling virkelig er 0 (konvertér til char[sizeof(Hovedstruktur)] og udskriv integerværdien af hver char - evt. i hexnotation).

3. Prøve at nulstille en enkelt double for at se om MSVC bruger en eller anden "syg" repræsentation.
Avatar billede f2f4 Novice
29. marts 2004 - 09:50 #10
Det er desværre lidt svært med et lille eksempel da problemet opstod i en større program. Men tak for gode kommentarer. Jeg har fundet problemet og beklager hvis jeg har 'spildt jeres tid'!:
Problemet opstod fordi et array blev fyldt med et element for meget og dermed sikkert har forrykket 'memmory'. Det undrer mig bare at BCB versionen tilsyneladende fungerede korrekt, mens MSVC versionen fejlede med det samme!
Avatar billede f2f4 Novice
15. april 2004 - 11:09 #11
lukkes
Avatar billede f2f4 Novice
02. maj 2004 - 23:59 #12
Lukket! Med tak for hjælp!
Avatar billede noden Nybegynder
06. maj 2004 - 02:26 #13
size_t er en variabeltype som kan indeholde størrelser.
Ofte (på Linux) er dette bare intér inden bagved.
Når i bruger menset skal i huske at fortælle at give en adresse med &
memset(&buffer, 0, sizeof buffer);
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