Strukur ausgeben
-
Ich habe ein kleines Problem
Ich schaff es nicht eine Struktur byteweise auszugeben...typedef struct tagStruct { int a; int b[20]; char test[100]; int [5][5]; etc. }
Das problem ist übrigens, dass memcmp nicht 0 zurückliefert. Ich will eine Liste mit beiden structuren zum vergleichen wo es hapert. Alle Returnwerte einzell zu untersuchen ist zu aufwendig das sie einige MB gross ist.
-
padding?
-
Ja schon... was ist da falsch?
for(iIndex=0;iIndex<sizeof(tagStruct);iIndex++) { printf("%d\n",*(&tagStructMember_m+sizeof(char)*iIndex)); }
-
Ungetestet:
printf("%d\n",*(int*)((char *)(&tagStructMember_m)+iIndex));
-
Sieht abenteuerlich as,xD
Aber schein zu funktionieren, merci
-
Binggi schrieb:
Sieht abenteuerlich as,xD
Aber schein zu funktionieren, merciLass mich rate: Du hast keine Ahnung was dies genau macht und warum dein altes Vorhaben nicht funktionierte?
-
SeppJ schrieb:
Du hast keine Ahnung was dies genau macht
Ich auch nicht.
Ich hätte erwartet, dass nun zu große Werte zurückgegeben werden, weil ein int-Zeiger dereferenziert wird ...Ich hätte es so probiert:
printf("%d\n",(int) *((char *)(&tagStructMember_m)+iIndex));
-
Belli schrieb:
SeppJ schrieb:
Du hast keine Ahnung was dies genau macht
Ich auch nicht.
Ich hätte erwartet, dass nun zu große Werte zurückgegeben werden, weil ein int-Zeiger dereferenziert wird ...Ich hätte es so probiert:
printf("%d\n",(int) *((char *)(&tagStructMember_m)+iIndex));
Stimmt, das war ein Fehler bei mir. Interessant, dass es laut Binggi funktioniert.
-
Binggi schrieb:
Das problem ist übrigens, dass memcmp nicht 0 zurückliefert. Ich will eine Liste mit beiden structuren zum vergleichen wo es hapert.
Binggi schrieb:
Alle Returnwerte einzell zu untersuchen ist zu aufwendig das sie einige MB gross ist.
Na und? Megabytes im Hauptspeicher durchzulaufen ist Alltagsgeschäft eines Prozessors.
Ein saubere Lösung, die immer funktionieren würde und auch portabel wäre, wäre genau die Einzelprüfung z.B. mittels Funktionint istgleich(const struct bla *x,const struct bla *y) { ... }
Nichtportabel wäre das memcmp mit compilerabhängigen 'pack' Zeugs, das reduziert die Paddingbytes auf 0.
offsetof wäre auch noch ein portabler Weg, aber so aufwändig wie erstgenannter Fall.
-
SeppJ schrieb:
Binggi schrieb:
Sieht abenteuerlich as,xD
Aber schein zu funktionieren, merciLass mich rate: Du hast keine Ahnung was dies genau macht und warum dein altes Vorhaben nicht funktionierte?
Da hast du falsch geraten, dass ich die Adresse nicht zuerst aufgelöst habe,habe ich verschwitzt. Das casten von tagStruct auf char* ist mir im nachhinein klar geworden.
Wobei der cast auf (int*) nicht sinnvoll ist, denn bekomme ich werte über 255 zurück.
Sorry, habe ich selbst verbessert, da ichs in %c ausgebe fällt der cast auf (int sowieso weg...Wutz schrieb:
Na und? Megabytes im Hauptspeicher durchzulaufen ist Alltagsgeschäft eines Prozessors.
Ein saubere Lösung, die immer funktionieren würde und auch portabel wäre, wäre genau die Einzelprüfung z.B. mittels Funktionint istgleich(const struct bla *x,const struct bla *y) { ... }
Nichtportabel wäre das memcmp mit compilerabhängigen 'pack' Zeugs, das reduziert die Paddingbytes auf 0.
offsetof wäre auch noch ein portabler Weg, aber so aufwändig wie erstgenannter Fall.Ja schon, aber im Debuger meiner IDE ist es extrem mühsam 2 structs zu vergleichen... und memcpy ist ja genau das was ich brauche...
EDIT: @Wutz: hast mich glaub falsch verstanden, der memcmp sollte 0 zurückliefern, da theoretisch in beiden das gleiche drin stehen sollte, das hat es aber nicht, darum die ausgabe um zu schauen, elche werte falsch sind.