Problem mit "schreiben" in Struct



  • Deine Lernweise ist (untertrieben gesagt) unkoordiniert.
    Du hangelst dich von einer grundlegenden Fragestellung zur nächsten, z.Z. scheint fwrite dein Problem.
    Außerdem zitierst du falschen, uncompilierbaren Code, nämlich

    struct {
       ...
    } adressen;
    

    ist eine Definition einer Variablen,

    dann ist aber

    sizeof( struct adressen )
    

    unmöglich.

    Der Adressoperator & ist ein Synonym für "Adresse auf", und ist nur für Variablen (mit Name, Typ, Speicherbereich und Wert) gültig, also nicht für Typen.
    Der operator sizeof ist auch für Typen erlaubt.



  • Lies im K&R das Kapitel Pointers and Arrays (5.3 bei mir).

    Da wird die "Ähnlichkeit" von Zeigern und Arrays erklärt, die

    char *fgets(char*, int, FILE*);
    
    void f(void){
      char  Data[80]
      fgets(Data, sizeof(Data), stdin);
    }
    

    zugrundeliegt.



  • Dieser Code stammt nicht von mir sondern ist 1 zu 1 aus dem GalileoBuch!!
    Das da was nicht stimmt dachte ich mir schon.
    Hier der Link :
    http://openbook.galileocomputing.de/c_von_a_bis_z/016_c_ein_ausgabe_funktionen_017.htm#mj72d8bcd5c9fd159c248b24caf558e345

    Unter Bockweise schreiben mit fwrite Abb 16.7

    Nein, ich hangle mich auch nicht, ich habe schon erfolgreich mit fwrite geschrieben und seit ich die Diskussion gestern angestossen habe, bzw. meine Frageorgie , ist mir rückwirkend doch etwas unklar.

    fwrite war nur ein Beispiel für das Lesen der C Refernzen, das mir Kopfzerbrechen bereitet.



  • DirkB schrieb:

    Arrays verhalten sich in C auch anderes als normale Variablen.

    Und gerade das Verständnis vom Zusammenspiel von Zeigern und Arrays ist für die Stringverarbeitung in C enorm wichtig.

    Das Verständnis hast du z.Zt nicht. Darum auch deine Fehler.

    Im K&R gibt es extra ein Kapitel über Zeiger und Vektoren (Arrays)

    Der Name eines Array (also ohne die []) steht schon für die Adresse des ersten Elements vom Array. Das ist gleichbedeutend mit &Data[0]

    Bei fwrite steht der erste Parameter für die Adresse, von wo aus die Daten geschrieben werdeb sollen.
    Der zweite gibt die Größe eines Elements an,
    der dritte die Anzahl der Elemente und
    der vierte den Stream, über den die Ausgabe erfolgen soll.

    Beim ersten Beispiel schreibst du 100 long Werte (darum sizeof(long), 100)
    Beim zweiten Beispiel schreibst du eine ganze Struct



  • Falls du dich fragst, warum bei fwrite zwei Paramter für die Anzahl angegeben werden, man kann ja schließlich auch size*count rechnen (wie bei malloc).

    Dann schau dir mal den Rückgabewert von fwrite an. Der gibt die Anzahl der erfolgreich gelesenen Elemente an (und nicht Byte).



  • DirkB schrieb:

    Der Name eines Array (also ohne die []) steht schon für die Adresse des ersten Elements vom Array. Das ist gleichbedeutend mit &Data[0]

    .
    .
    Beim ersten Beispiel schreibst du 100 long Werte (darum sizeof(long), 100)
    Beim zweiten Beispiel schreibst du eine ganze Struct

    Darum für die Struct das "&" oder? Weil der Structname allein nicht wie bei dem Array die Adresse des ersten Members enthält?



  • structs sind keine Arrays!

    Du kannst structs einander zuweisen und auch als Rückgabewert einer Funktion nutzen.

    struct foo barbar(void);
    ...
    struct foo bar1, bar2;
    
    bar1 = barbar();
    bar2 = bar1;
    

    Das geht mit Arrays nicht! ⚠



  • schon klar das eine struct kein array ist .

    Darum für die Struct das "&" oder? Weil der Structname allein nicht wie bei dem Array die Adresse des ersten Members enthält

    Es ging nur um das & .

    Kennt jmd. noch ein gutes Refernz buch in Druckversion?



  • Django2012 schrieb:

    Kennt jmd. noch ein gutes Refernz buch in Druckversion?

    "C in a nutshell" - O'Reilly

    ist, glaube ich, die umfassendste C-Referenz (auch C99).

    http://www.amazon.de/C-Nutshell-In-OReilly/dp/0596006977

    Gibt's auch als PDF im Internet, mir ist aber die gedruckte Version lieber.



  • Besten Dank allerseits!

    Was ich noch aus einem anderen Beitrag entdeckt habe , und wirklich auch nicht schlecht ist :

    http://c-faq.com/


Anmelden zum Antworten