Probleme bei Strukturen



  • Hiho also ich hab folgendes:

    struct Schaf{
    	int nr;
    	char name[100];
    
    };
    
    struct sheepcollection
    {
     struct Schaf sheep[100];
     int Anz;
    };
    
    main(){
    
    struct sheepcollection *Sammlung;
    Sammlung=(struct sheepcollection*)malloc(sizeof(struct sheepcollection));
    
    printf("Nummer fuer das Schaf: ");
    	scanf("%d",&Sammlung->sheep[Sammlung->counter].nr);
    printf("Name fuer das Schaf: ");
    	fflush(stdin);
    	fgets(Sammlung->sheep[Sammlung->counter].name,MAX,stdin);
    

    ich würde verstehen: Sammlung->sheep.nr.. jedoch funktioniert das nicht
    was hat es mit dem [Sammlung->counter] auf sich?

    und wenn ich Sammlung->sheep.nr schreiben will schlägt mir das prog aber Sammlung->sheep->nr vor warum?



  • 1. Warum hat deine main keinen Rückgabewert??

    2. In ANSI-C darf man die Rückgabe von malloc nicht casten!

    3. fflush(stdin) ist böse und nur beim MS-Compiler erlaubt (und auch da sollte man eine andere Lösung nehmen). Such mal hier nach "Eingabepuffer leeren".

    4. Warum postest du Code, bei dem relevante Passagen fehlen? counter kommt in deinem struct nicht vor.

    5. Sammlung[x]->sheep.nr ist doch richtig. Hast du überhaupt mal die andere Variante (->nr) ausprobiert? Wahrscheinlich nicht, dann hättest du gemerkt, dass sich das logischerweise gar nicht kompilieren lässt...



  • Hallo

    Wenn du mit der Entwicklungsumgebung Visual Studio C/C++ arbeitest, solltest du die Strukturen vor unnützer und fehleranfälliger (und automatischer) Strukturenoptimierung schützen. Das kann in bestimmten Fällen schonmal in die Hose gehen. In Visual Studio wären es die normalen pragmas: pack.

    Mfg.
    way



  • way schrieb:

    Hallo

    Wenn du mit der Entwicklungsumgebung Visual Studio C/C++ arbeitest, solltest du die Strukturen vor unnützer und fehleranfälliger (und automatischer) Strukturenoptimierung schützen. Das kann in bestimmten Fällen schonmal in die Hose gehen. In Visual Studio wären es die normalen pragmas: pack.

    Mfg.
    way

    Sieh dir doch den Code an. Glaubst du, der weiß was pack oder Alignment bedeutet? 😉

    Nee, hier sollten erstmal Grundlagen vermittelt werden, bevor es an solche Feinheiten geht...



  • Hallo

    Ja, gerade deswegen ist es höchste Zeit es zu lernen 😃 .

    Mfg.
    way



  • worsorrr schrieb:

    ich würde verstehen: Sammlung->sheep.nr.. jedoch funktioniert das nicht

    sheep ist kein Schaf, sondern ein Array von 100 Schafen. Für den Zugriff auf ein bestimmtes Element des Arrays brauchst du also einen Index. Und der steht eben in eckigen Klammern.

    way schrieb:

    Wenn du mit der Entwicklungsumgebung Visual Studio C/C++ arbeitest, solltest du die Strukturen vor unnützer und fehleranfälliger (und automatischer) Strukturenoptimierung schützen. Das kann in bestimmten Fällen schonmal in die Hose gehen.

    Warum nur bei Visual C++?
    Warum unnütz?
    Warum fehleranfällig?
    Was sind das für "bestimmte Fälle"?

    Ich vermute, du bist nur irgendwann mit nichtstandardkonformen Gefrickel auf die Nase gefallen, und zufällig ließ sich das durch Unterbinden des Strukturalignment "fixen".



  • way schrieb:

    Wenn du mit der Entwicklungsumgebung Visual Studio C/C++ arbeitest, solltest du die Strukturen vor unnützer und fehleranfälliger (und automatischer) Strukturenoptimierung schützen.

    nö, du darfst structs nur nicht wie char-arrays behandeln.
    🙂



  • Hallo

    Was hast du für ein Problem?

    Mfg.
    way



  • way schrieb:

    Was hast du für ein Problem?

    Falls du mich meinst: Beantworte meine Fragen, dann beantworte ich deine 😉



  • Hallo

    Warum nur bei Visual C++?

    Weil ich es persönlich nur bei Visual Studio C++ erlebt habe.

    Warum unnütz?

    Weil es in den meisten Fällen nicht gewollt ist.

    Was sind das für "bestimmte Fälle"?

    Bestimmte Fälle in denen man mit den Strukturen arbeitet?

    Das letzte stimmt auch, dadurch bin ich auf die Optimierung aufmerksam geworden. Ist das jetzt schlimm? oO

    Mfg.
    way



  • way schrieb:

    Weil ich es persönlich nur bei Visual Studio C++ erlebt habe.

    FYI: Viele Compiler machen das.

    way schrieb:

    Weil es in den meisten Fällen nicht gewollt ist.

    Weißt du überhaupt, welchem Zweck es dient?

    way schrieb:

    Bestimmte Fälle in denen man mit den Strukturen arbeitet?

    Also kannst du das nicht näher beschreiben?



  • way schrieb:

    Warum unnütz?

    Weil es in den meisten Fällen nicht gewollt ist.

    schau mal da: http://en.wikipedia.org/wiki/Packed
    🙂



  • Hallo

    Möchtest du dich profilieren oder warum brauchst du eine Erklärung?

    Naja, ich rechtfertige mich trotzdem mal. Die struct's werden standardmäßig nicht unter 32 Bytes optimiert (oder waren es 24?). Falls die Byteanzahl über 32 ist, werden weitere 24 hinzugefügt. Der Memory Cache (CPU) ist optimiert um eine größere Byteanzahl als einen Byte zu kopieren.

    Mfg.
    way



  • way schrieb:

    Möchtest du dich profilieren oder warum brauchst du eine Erklärung?

    schlechte laune oder was?
    🙂



  • Hallo

    Bin auf der Arbeit, jooo...

    Mfg.
    way



  • way schrieb:

    Bin auf der Arbeit, jooo...

    na, ich hoffe du musst bei deiner arbeit keinen C-code schreiben.
    (nicht ernst nehmen).
    🙂



  • Hallo

    Nä, Fließbandarbeiter (;

    Mfg.
    way



  • way schrieb:

    Die struct's werden standardmäßig nicht unter 32 Bytes optimiert (oder waren es 24?). Falls die Byteanzahl über 32 ist, werden weitere 24 hinzugefügt. Der Memory Cache (CPU) ist optimiert um eine größere Byteanzahl als einen Byte zu kopieren.

    Davon ab dass das allenfalls grob umrissen ist, war die Frage doch eigentlich, warum dies "meist ungewollt" ist.

    Nein, wir möchten uns nicht profilieren, wir (Mehrzahl) haben nur den Eindruck, dass Du nicht so recht verstehst, warum und wann ein Compiler überhaupt packt. Das kann aber nicht der Grund sein, Packing grundsätzlich abzuschalten.

    EDIT:
    Profilieren möchte sich m.E. eher, wer unbegründet empfiehlt "unnütze und fehleranfällige Strukturenoptimierung" zu deaktivieren.



  • _matze schrieb:

    2. In ANSI-C darf man die Rückgabe von malloc nicht casten

    Wieso sollte man das nicht dürfen? Ist doch völlig Standardkonform. Ob es allerdings schön ist, ist eine andere Sache.


Log in to reply