Typdef struct in den Header, oder doch nicht?



  • Hallo,
    ich habe folgendes prinzipielles Problem:
    Eigentlich würde ich eine typdef struct Konstruktion immer in den Header packen um diese auch in anderen files bekannt machen zu können.
    Nun stelle ich mir eine Struktur vor die ein oder mehrere Arrays enthalten soll z. B.

    typdef struct foo {
      uint8_t feld1[5];
      int var_a;
    };
    

    Wenn ich nicht komplett falsch liege dann würde mit der Angabe feld[5] direkt speicher reserviert, was ja eigentlich im Header File nicht gemacht werden sollte.
    Definiere ich uint8_t feld[]; so habe ich eigentlich nur einen Zeiger und ich müsste das array in einer wie auch immer gearteten init-Funkion erstellen und mit einer Größe versehen, bzw. mit Werten füllen.
    Jetzt könnte ich mir vorstellen für jedes array, welches ich in meiner Struktur unterbringen möchte einen Zeiger zu definieren und die arrays dann im c-File anzuliegen. Dann müssten die Zeiger in der Struktur in einer Art Initialisierung eben auf die entsprechenden arrays zeigen. Was aber nicht so elegant und meiner Meinung nach auch Fehleranfällig wäre.
    Wie würde man dieses Problem üblicherweise lösen?.
    Schon jetzt recht herzlichen Dank für Eure Ratschläge.

    Grüße
    Resetpin



  • @Resetpin sagte in Typdef struct in den Header, oder doch nicht?:

    Wenn ich nicht komplett falsch liege

    Du liegst komplett falsch.



  • Schreibe bitte in Zukunft in eine Zeile vor Deinem Code ``` und in eine Zeile nach Deinem Code ```. Alternativ markiere Deinen Code und klicke auf das </> in der Symbolleiste über dem Eingabefenster.
    Du kannst Deine Beiträge auch nachträglich bearbeiten. Den Menüpunkt "Bearbeiten" findest Du in dem Drei-Punkte-Menü rechts unter Deinem Beitrag.
    Danke

    @Resetpin sagte in Typdef struct in den Header, oder doch nicht?:

    tpydef struct foo {
        uint8_t feld1[5];
        int var_a;
    };
    

    Es heißt typedef. Dieses Schlüsselwort ist dafür da einen Typ bekanntzumachen. Dafür ist es aber auch nötig, daß Du diesem Typ einen Namen gibst:

    typedef int number_t;
    
    typedef struct foo {
        int bar[42];
        int baz;
    } foo_t;
    

    wobei number_t und foo_t die Typenames sind.


    @Resetpin sagte in Typdef struct in den Header, oder doch nicht?:

    Wenn ich nicht komplett falsch liege

    Wie @manni66 schon gesagt hat liegst Du damit komplett falsch. Was Du da hast ist eine Definition einer struct. Es ist ein Bauplan. Da wird kein Speicher reserviert. Erst wenn eine struct instanziiert wird

    struct foo { int bar; };
    
    // ...
    
    struct foo hugo;  // hier
    

    oder eben mit typedef:

    typedef struct foo { int bar; } that_foo_type;
    
    // ...
    
    that_foo_type hugo;  // hier
    

    gibt es eine Instanz der struct foo namens hugo die dann tatsächlich Speicher belegt.

    Analog: Wenn ich mir von der IKEA-Website eine Bauanleitung für irgendein Möbel runterlade landet auch nicht automagisch das betreffende Möbelstück in meiner Wohnung.



  • Vielleicht hilft Dir zum Verständnis von typedef auch diese Diskussion: Anfängerfragen zu typedef struct (ist Fork aus "Gemeinsame nette double linked list...")



  • Hallo,

    vielen Dank für die schnellen Antworten.
    Dann ist mir die Sache mit der Größenangabe bei Arrays klar.
    Dachte immer da wird gleich Speicher reserviert, aber das Argument mit dem Bauplan und der Reservierung von Speicher erst nach erstellen einer Instanz mach natürlich Sinn.
    Das mit der Verwendung der typdef Anweisung werde ich mir nochmal zu Gemüte führen.

    Vielen Dank nochmals und viele Grüße

    Resetpin



  • Vielleicht hat dich folgendes verwirrt?

    struct Foo {
        int f[123];
    } foo; // Definiert den Typ `struct Foo` und gleichzeitig eine Variablen dieses Typs mit Namen `foo`
    
    typedef struct Foo {
        int f[123];
    } foo; // Definiert den Typ `struct Foo` und gleichzeitig eine typedef `foo` der ein Alias für `struct Foo` ist.
           // Hier wird aber _keine_ Varaible definiert. `foo` steht an der selben Stelle wie ohne `typedef`
           // der Variablenname, aber mit `typedef` hat der Bezeichnier dort eben eine andere Bedeutung.

Anmelden zum Antworten