Forum: Compiler & IDEs array als parameter / sizeof()


von daniel (Gast)


Lesenswert?

Hallo,
ích habe das Problem, dass ich mit der sizeof()-Funktion einen anderen 
Wert erhalte wenn das Argument als Parameter übergeben wurde:


void GetIntParam(intTypePrm intParam[]);

typedef struct{
  char* name;
  ViInt32* value;
}intTypePrm;

int status1 = 1;
int status2 = 2;

intTypePrm intParam[] = {{"status1", &status1}, \
                       {"status2", &status2}};

printf("%d\n", sizeof (intParam));
GetIntParam(intParam);

void GetIntParam(intTypePrm intParam[]){
        printf("%d\n", sizeof (intParam));
}

von ... (Gast)


Lesenswert?

siehe:
Beitrag "Array vorbelegen und Anzahl Einträge in enum?"

Da findest Du u.a. auch die Erklärung dafür.

von daniel (Gast)


Lesenswert?

@: ... (Gast) mit der Antwort kann ich leider nichts anfangen.
Ich denke das mir beim Aufruf nur noch die Größe des zeigers auf das 
Array angezeigt wird (4 Bytes). Bei der direkten Ausgabe werden alle 
Zeiger des structs berücksichtigt (4 x4 Bytes). Nur wie umgehe ich das 
und erhalte die in der Funktion das gleiche Ergebnis?
Hier nochmal das ganze als lauffähiger code:

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


void CMUInit(void);
void ZVMInit(void);

typedef struct{
  char* name;
  int* value;
}intTypePrm;

void GetIntParam(intTypePrm intParam[]);

int main(void){
  int status1 = 1;
  int status2 = 2;

  intTypePrm intParam[] = {{"status1", &status1}, {"status2", 
&status2}};

  printf("%d\n", sizeof (intParam));
  GetIntParam(intParam);

  return 0;
}

void GetIntParam(intTypePrm intParam[]){
  printf("%d\n", sizeof (intParam));
}

von Peter II (Gast)


Lesenswert?

daniel schrieb:
> Nur wie umgehe ich das
> und erhalte die in der Funktion das gleiche Ergebnis?

es geht nicht!!!!!

es gibt von array in C keien größe die zur laufzeit ermittelbar ist. 
entweder machst du dir ein DEFINE oder gibt dir größe der Funktion als 
zusatz parameter mit.

von ... (Gast)


Lesenswert?

daniel schrieb:
> Nur wie umgehe ich das
> und erhalte die in der Funktion das gleiche Ergebnis?

Direkt gar nicht. Deklarier Deine Funktion so:
1
void GetIntParam(intTypePrm intParam[], size_t size);
und ruf sie in main so auf:
1
GetIntParam(intParam, sizeof(intParam));

von ... (Gast)


Lesenswert?

Ansonsten such hier im Forum nach 'sizeof', das Thema gibts alle Nase 
lang:
http://www.mikrocontroller.net/search?query=sizeof

von daniel (Gast)


Lesenswert?

Ok, Danke Leute
Das ist wohl auch der Grund von:

int main (int argc, char *argv[]){
}

von Professor Crey (Gast)


Lesenswert?

Nicht unbedingt.

Man kann bei solchen Arrays wie argv auch den letzten Eintrag auf NULL 
setzen.
Wird teilweise auch gemacht

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.