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));
    
    	}
    

  • Mod

    Ungetestet:
    printf("%d\n",*(int*)((char *)(&tagStructMember_m)+iIndex));



  • Sieht abenteuerlich as,xD
    Aber schein zu funktionieren, merci


  • Mod

    Binggi schrieb:

    Sieht abenteuerlich as,xD
    Aber schein zu funktionieren, merci

    Lass 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));


  • Mod

    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 Funktion

    int 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, merci

    Lass 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 Funktion

    int 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.


Log in to reply