calloc oder new



  • Hi

    wie soll ich bei meiner Struktur den Speicher für 25 Einträge reservieren:

    (Arduino gcc compiler)

    #define Proto_max 25 // Anzahl Protokollzeilen
    struct Prot_Struct{
    char typ; // Meldungsart: s = Status e = Error
    byte std;
    byte min;
    byte sec;
    char text[41]; // Meldungstext
    };

    Prot_Struct ProtoIndex[Proto_max] ; // z.B. ProtoIndex[2].typ , ProtoIndex[3].typ , ProtoIndex[3].std
    Prot_Struct Protokoll; // z.B. (vorher gewünschten Record lesen: getBuffer(Protokoll,i) Protokoll.typ, Protokoll.text

    Ich möchte anschließend mit
    getBuffer(Protokoll,i) ; Protokoll.typ bzw.
    ProtoIndex[2].typ
    weiterarbeiten könnnen.



  • Wie wärs mit

    std::vector<Prot_Struct> MyStructs;
    MyStructs.resize( 25 );
    
    MyStructs[ 2 ].typ = 's';
    


  • Das mag der gcc nicht:
    "conflicting declaration 'std::vector<Prot_Struct> Protokoll'"


  • Banned

    @hanss sagte in calloc oder new:

    Das mag der gcc nicht:
    "conflicting declaration 'std::vector<Prot_Struct> Protokoll'"

    Versuch mal g++ statt gcc.



  • Für welchen Arduino machst du das denn.

    Die Entwicklungsumgebung gibt es für 8-Bit Mikrocontrollern mit wenig RAM bis 32-Bit Controllern mit reichlich RAM.
    Auf Ersteren ist malloc oder gar new nicht empfehlenswert.
    Bei den Anderen kannst du dich austoben



  • @RBS2
    ich meine, das ist der Fall:
    C/C++ compiler (avr-g++). All standard C and C++ constructs supported by avr-g++ should work in Arduino



  • @DirkB
    Der Speicher ist nicht das Problem:
    Der Sketch verwendet 371572 Bytes (35%) des Programmspeicherplatzes. Das Maximum sind 1044464 Bytes.
    Globale Variablen verwenden 30560 Bytes (37%) des dynamischen Speichers, 51360 Bytes für lokale Variablen verbleiben. Das Maximum sind 81920 B



  • @hanss sagte in calloc oder new:

    Prot_Struct ProtoIndex[Proto_max] ;

    Hier hast du doch schon ein Array für 25 Einträge erstellt. Ich verstehe dein Problem nicht richtig, glaube ich.

    PS: Da du das ja in C++ machen möchtest: warum das Macro #define Proto_max 25 statt einer einfachen Konstanten wie const int/size_t Proto_max = 25;?



  • @wob
    #define ist kein Macro sondern eine Konstante.
    C++ verwaltet den Speicher dynamisch. Bei MC ist der Speicher knapp und wird fragmentiert,
    wenn der Platz nicht von vornherein reserviert wird (new, malloc, calloc)



  • @hanss sagte in calloc oder new:

    #define ist kein Macro sondern eine Konstante.

    https://en.cppreference.com/w/cpp/preprocessor/replace



  • @hanss sagte in calloc oder new:

    @wob
    #define ist kein Macro sondern eine Konstante.
    C++ verwaltet den Speicher dynamisch. Bei MC ist der Speicher knapp und wird fragmentiert,
    wenn der Platz nicht von vornherein reserviert wird (new, malloc, calloc)

    #define ist im Grunde nichts anderes als eine Textersetzung.
    Edit: daher kannst du defines auch nicht debuggen.

    Starte mal deinen gdb und versuch mal den Wert von "Proto_max" anzuzeigen.... Du wirst enttäuscht sein 😉


  • Banned

    @hanss sagte in calloc oder new:

    #define ist kein Macro sondern eine Konstante.

    Eine Präprozessoranweisung, um sich Makros und Konstanten zu basteln. 😇



  • @RBS2 sagte in calloc oder new:

    @hanss sagte in calloc oder new:

    #define ist kein Macro sondern eine Konstante.

    Eine Präprozessoranweisung, um sich Makros und Konstanten zu basteln. 😇

    du meinst solche Konstanten:

    #define meinedaemlichekonstante const int konstante = 42;
    meinedaemlichekonstante
    

    Das ist zwar eine Konstante namens "konstante", die man auch debuggen kann, aber es ist so ziemlich die dämlichste Art eine Konstante zu bauen 😎


  • Banned

    @It0101 sagte in calloc oder new:

    @RBS2 sagte in calloc oder new:

    @hanss sagte in calloc oder new:

    #define ist kein Macro sondern eine Konstante.

    Eine Präprozessoranweisung, um sich Makros und Konstanten zu basteln. 😇

    du meinst solche Konstanten:

    #define meinedaemlichekonstante const int konstante = 42;
    meinedaemlichekonstante
    

    Das ist zwar eine Konstante namens "konstante", die man auch debuggen kann, aber es ist so ziemlich die dämlichste Art eine Konstante zu bauen 😎

    Besser:

    Makros ohne Parameter werden häufig für symbolische Namen von Konstanten verwendet:

    #define PI 3.14159

    Quelle: https://de.wikipedia.org/wiki/C-Präprozessor


  • Mod

    Da haben sich die Leute von Arduino so viel Mühe gegeben, auch neueste Sprachstandards und Compilerfeatures anzubieten. Da muss man nicht mehr so programmieren, als sei noch 1965, der Compiler strunzdumm, und selbst das Hostsystem auf 64kB beschränkt…

    Programmier einfach so, wie du es (hoffentlich) ganz normal tun würdest. Die Beschränkung liegt in der technischen Leistungsfähigkeit des Zielsystems, nicht in den Sprachfeatures, die du verwenden kannst.



  • @RBS2 sagte in calloc oder new:

    @It0101 sagte in calloc oder new:

    @RBS2 sagte in calloc oder new:

    @hanss sagte in calloc oder new:

    #define ist kein Macro sondern eine Konstante.

    Eine Präprozessoranweisung, um sich Makros und Konstanten zu basteln. 😇

    du meinst solche Konstanten:

    #define meinedaemlichekonstante const int konstante = 42;
    meinedaemlichekonstante
    

    Das ist zwar eine Konstante namens "konstante", die man auch debuggen kann, aber es ist so ziemlich die dämlichste Art eine Konstante zu bauen 😎

    Besser:

    Makros ohne Parameter werden häufig für symbolische Namen von Konstanten verwendet:

    #define PI 3.14159

    Quelle: https://de.wikipedia.org/wiki/C-Präprozessor

    Aber daraus resultiert keine Variable namens PI. Daher ist es im programmier-technischen Sinne keine Konstante, weil eine Konstante eine Variable ist, deren Inhalt sich nicht ändert.


  • Banned

    @It0101 sagte in calloc oder new:

    Aber daraus resultiert keine Variable namens PI.

    Es soll ja auch eine Konstante sein. Variablen sind variabel. Konstanten nicht.



  • @RBS2 sagte in calloc oder new:

    @It0101 sagte in calloc oder new:

    Aber daraus resultiert keine Variable namens PI.

    Es soll ja auch eine Konstante sein. Variablen sind variabel. Konstanten nicht.

    Im Grunde haste du Recht. Der eigentliche Punkt ist, dass PI sich niemals ändert und der Weg über das Makro daher in Ordnung ist. Aber eine Array-Size, die sich möglicherweise zu einem späteren Zeitpunkt ändert als Makro zu machen ist aus meiner Sicht Quark.
    Zumal, wie erwähnt, die debug-fähigkeit fehlt.


  • Banned

    @It0101 sagte in calloc oder new:

    Aber eine Array-Size, die sich möglicherweise zu einem späteren Zeitpunkt ändert als Makro zu machen ist aus meiner Sicht Quark.
    Zumal, wie erwähnt, die debug-fähigkeit fehlt.

    Klar, wenn die Größe variieren kann, sind Konstanten natürlich fehl am Platz.

    Aber was Debug angeht: es gibt keinen vernünftigen Grund, warum ein Debugger kein #define auswerten kann, wo er doch auch Zugriff auf den Source Code hat. Du sagst, der GDB kann das nicht, aber bei einem anderen Debugger habe ich mal erlebt, dass er es konnte. Weiß aber nicht mehr, bei welchem.


Log in to reply