Kann eine Struktur Argument einer Funktion sein?



  • Mal eine wahrscheinlich noch peinlichere Frage, ist das so richtig erlaubt? Ich übergebe Strukturen immer als Zeiger und kenne das auch nicht anderes, was ja auch an sich Sinn macht. In C++ hat man dafür ja die Referenzen, etc. . Ich war bisher immer davon ausgegangen, dass in C nur Integrale Typen zugewiesen werden können. Des Forums Liebling macht dann die Verwirrung noch komplett:

    Jürgen Wolf schrieb:

    Folgende Wertzuweisung von Strukturen sollten Sie allerdings vermeiden:

    struct {
       int a1;
       int a2;
       int a3;
    } werte1, werte2;
    werte1.a1 = 8;
    werte1.a2 = 16;
    werte1.a3 = 32;
    werte2 = werte1;   // Bitte vermeiden Sie solche Zuweisungen
    

    Das ist zwar erlaubt in C, kann aber zu Fehlern führen, wenn ein Compiler dies nicht unterstützt. Sicherer wäre da die folgende Möglichkeit:

    memcpy(&werte2, &wert1, sizeof(werte1));
    

    Dies soll nur ein Hinweis sein und keine Regel!

    Ich hab jetzt auch nur Hinweise gefunden, dass man Zeiger nutzen soll.
    Es wäre toll, wenn das jemand aufklären könnte!


  • Mod

    Da hat Herr Wolf wie immer unrecht. Natürlich ist das erlaubt. Der Gang über Zeiger ist unnötig, aber nicht unberechtigt: Bei großen Structs möchte man ja nicht unbedingt eine Kopie. Und es gibt möglicherweise Probleme, wenn man keine flache Kopie möchte.

    Aber es ist vom Standard garantiert, dass es geht.

    edit: Genau genommen hat Herr Wolf sogar doch Recht, weil er sagt "Das ist zwar erlaubt in C, kann aber zu Fehlern führen, wenn ein Compiler dies nicht unterstützt". Natürlich führt jedes reguläre Sprachmittel zu Fehlern, wenn man einen Compiler hat, der dies nicht unterstützt. Aber vielleicht unterstützt der Compiler ja auch kein memcpy...



  • Beim Recherchieren hab ich gleich noch etwas anderes gefunden. Nach dieser Seite http://c-buch.sommergut.de/Kapitel13/Strukturen.shtml kann man über Strukturen auch Arrays kopierbar machen. Es verwundert mich aber, dass ich diesen Trick noch nirgendwo in Anwendung gefunden habe. Statt dessen erfindet man lieber std::array, was ja erst bei nicht-PODs sinnvoller ist.



  • std::array gibt es in C nicht 😉



  • SeppJ schrieb:

    ... Aber vielleicht unterstützt der Compiler ja auch kein memcpy...

    Das unterstützt der Compiler nicht. Das ist Sache der Library.


  • Mod

    Paul Müller schrieb:

    Beim Recherchieren hab ich gleich noch etwas anderes gefunden. Nach dieser Seite http://c-buch.sommergut.de/Kapitel13/Strukturen.shtml kann man über Strukturen auch Arrays kopierbar machen. Es verwundert mich aber, dass ich diesen Trick noch nirgendwo in Anwendung gefunden habe. Statt dessen erfindet man lieber std::array, was ja erst bei nicht-PODs sinnvoller ist.

    Das ist aber ein ganz gängiger Trick, wenn man Arrays fester Größe hat. Ist aber halt extrem inflexibel, weil die Größe fix ist, d.h. es ist schwer, z.B. allgemeine Funktionen dafür zu schreiben.

    Kann aber sinnvoll sein, wenn die Zahl der Dimensionen bekannt ist, z.B. 3D-Koordinaten.



  • Wolfgang Sommergut schrieb:

    pszDup = (char *) malloc(
    	 strlen(pszWord) + sizeof('\0'));
    

    Leute die obiges verwenden sind ebenso Dilettanten wie JW.
    Liebe Kinder, nicht nachmachen!


  • Mod

    Wutz schrieb:

    Leute die obiges verwenden sind ebenso Dilettanten wie JW.
    Liebe Kinder, nicht nachmachen!

    Zustimm, aber was hat das hiermit zu tun? Falscher Thread?



  • SeppJ schrieb:

    Wutz schrieb:

    Leute die obiges verwenden sind ebenso Dilettanten wie JW.
    Liebe Kinder, nicht nachmachen!

    Zustimm, aber was hat das hiermit zu tun? Falscher Thread?

    Der Thread wird wohl richtig sein, siehe Autorenname von "Pauls" link.



  • SeppJ schrieb:

    Das ist aber ein ganz gängiger Trick, wenn man Arrays fester Größe hat. Ist aber halt extrem inflexibel, weil die Größe fix ist, d.h. es ist schwer, z.B. allgemeine Funktionen dafür zu schreiben.

    Okay das hab ich zumindest noch nicht bewusst in freier Wildbahn wahr genommen. Das mit der Größe leuchtet ein, das Problem dürfte aber auch auf std::array zutreffen. Oder kann man in den Funktionsdeklarationen die Größe offen lassen?


Anmelden zum Antworten