Anfägerfrage: Baum dynamisch bauen



  • baum? warum so etwas unhandliches? tuts nicht ne liste oder ein array?
    welchen compiler benutzt du?

    char name[];

    so etwas in einer struct, das sieht mir nach c99 syntax aus.
    rückgabewerte von malloc sollte man nicht casten, das ist oft ne typische c++ compiler meldung.



  • Danke für euere Rückmeldungen

    zu juppi++

    1. Compiler:avr-gcc (für ATML MCs)
    2. 2 dynamische Array (rooms,object) wobei die rooms auf objecte verweisen würde (noch nicht probiert)
    typedef struct{        
                char *name;
              } object;
    
    typedef struct{            
                int id;
                char *name;
                object link[];
              } room;                  
    
    void setup()
    {  
      //**** 
      room *rooms = (room*) malloc(sizeof(room)); //OK
      rooms->id=12;                               //OK
      rooms->name="Test";                         //OK
    
      rooms->link[0]->name="A";                   // rooms->link[0] klappt ->name="A" nicht mehr
      rooms->link[1]->name="B";                   
    
    }
    
    void loop()
    { 
    }
    

    Langsam verstehe ich:
    Ein Zeiger auf room zeigt auf Speicheradresse welche durch malloc frei gegeben wird. OK?

    Was ich noch nicht verstehe:
    Um mehrer Objecte "innerhalb" von rooms zu bekommen klappt es mit rooms->link[0],usw jedoch wie spreche ich diese an?

    Der Hacken malloc() schluckt 450Bytes 😞



  • mr_sol schrieb:

    Ich arbeite gerade auf einen ATMEL in C und müsste dynamische Bäume einlegen.
    ...
    Leider gibts kein new für den Compiler.

    Köstlich.

    Gehe davon aus, dass ein gcc alles richtig macht, und wenn du Fehler erhälst, liegt es an dir und nicht am Compiler.
    Gehe davon aus, dass du nicht weißt, was "dynamische Bäume" und "dynamische Arrays" sind oder gar die Unterschiede.
    Gehe davon aus, dass dein genannter Code unkompilierbar ist und dass du die o.g. Hinweise zum laienhaften malloc Cast und sinnfreier Verwendung von verketteten Listen aufgrund deiner eigenen Unkenntnis ignorierst und diese auch durch mehrfache Wiederholungen nicht richtig werden.



  • Der Index-Zugriff hat die Dereferenzierung schon gratis enthalten, da mußt du den Zeiger nicht nochmal extra dereferenzieren. D.h. das heißt korrekterweise rooms->link[0].name="A"; .

    (btw, diese Konstruktion mit den größenlosen Arrays (object link[];) funktioniert echt in C?)



  • Gehe davon aus, dass ein gcc alles richtig macht, und wenn du Fehler erhälst, liegt es an dir und nicht am Compiler....usw

    Ich bin C-Anfänger und bin hier etwas zu lernen. Deine Ansage bringt mich keinen Schritt weiter, ich finde sie ziemlich unhöflich.

    Vielen Dank an alle anderen.



  • mr_sol schrieb:

    Der Hacken malloc() schluckt 450Bytes 😞

    Du willst "dynamische Bäume" machen. Dynamsiche Speicherverwaltung läuft in C über malloc() . Das von dir vermisste new() braucht sicher mehr Speicher.

    mr_sol schrieb:

    rooms->name="Test";                         //OK
    

    Ist nicht OK. Es funktioniert. Aber nicht so wie du denkst.
    Strings werden in C anders behandelt als integrale Typen (int, double).

    mr_sol schrieb:

    ...
      rooms->link[0]->name="A";                   // rooms->link[0] klappt ->name="A" nicht mehr
      rooms->link[1]->name="B";
    

    Wo hast du denn link[0] bzw link[1] Werte zugewiesen?
    Zudem macht ->name="A"; nicht das was du denkst.

    mr_sol schrieb:

    Ich bin C-Anfänger

    Mit welchen Programmiersprachen hast du dich denn bis jetzt vergnügt?



  • Bisher: OOP-PHP, SQL, VB, JS, XSLT also nix systemnahes.

    Im Hintergrund meiner Frage steht ein Projekt bei welchen Sensordaten im MC gepuffert werden. Leider können es zwischen 1....n sein. Würde ich zb 150 Datensätze in einem Array reservieren und nur 3 wirklich empfangen, schmerzt der verlorene Speicherplatz. 32 kByte sind ja nicht allzuviel.

    Daher der Versuch einer Lösung mit dynamischen Arrays oder Variablen (ich hoffe es richtig Ausgedrückt zu haben)

    Malloc kostet fast 450 Bytes. Vielleicht ist mein Lösungsansatz vollkommen falsch und es gibt eine bessere einfachere Lösung.



  • Wenn deine 150 Datensätze in den Speicher (RAM) passen ist doch gut.
    Der MC macht doch sonst nichts weiter. Mit dem freiem Speicher kannst du doch sonst nichts anfangen.
    Und deine Baumverwaltung ist viel teuerer als die 450 Byte.

    Nimm Arrays.

    Und lies die Kapitel über Arrays, Zeiger und Strings gründlich und mehrmals durch.



  • mr_sol schrieb:

    Ich bin C-Anfänger und bin hier etwas zu lernen. Deine Ansage bringt mich keinen Schritt weiter, ich finde sie ziemlich unhöflich.

    Unhöflich ist, dass du die dir mehrfach gezeigten Fehler ignorierst und anschließend diesen uncompilierbaren, falschen und sinnfreien Code wiederholst und damit zum Ausdruck bringst, dass du eben nicht lernen willst.
    Das Problem mit euch Anfängern ist auch, dass diese (wie du in deinem Beitragstitel offenbarst) keine Ahnung von C haben, aber schon ganz genau wissen, mit welchen Mitteln (von denen sie auch nur nebulöse Vorstellungen haben, in deinem Fall "dyn. Bäume") sie ihre Aufgabenstellung umsetzen wollen.

    Haken schreibt man in diesem Zusammenhang richtig Haken und nicht Hacken.



  • Statt dynamisch zu arbeiten, könntest du auch eine ungefähre Schätzung für den maximal nötigen Puffer bestimmen und deinen Puffer dennoch statisch anlegen.
    => Nachteil wäre dann natürlich notfalls Daten "wegschmeißen" zu müssen, was bei kritischeren Systemen wohl unverzeihlich wäre.

    Keine Ahnung, vllt. kannst du die Schätzung zum Puffer mit ner Gauß-Verteilung co. und weiteren Werten noch iwie optimieren.



  • Ich werde wohl erst mal bei statischen Array mit passender struct bleiben. Beim Nachlesen bei den Microcontrollerleuten wird malloc eher mit Vorsicht verwendet. Ich werde das Ganze erst mal austesten.

    Vielen Dank an alle.



  • typedef struct{        
                char *name;
              } object;
    
    typedef struct{            
                int id;
                char *name;
                object link[];
              } room;
    

    kannst du die ids selbst frei wählen? das wäre optimal, dann könntest du die ids nämlich gleich zur indizierung deiner arrays nehmen und hättest nen 1:1 sofortzugriff auf deine datenstruktur. schneller kommst du kaum an deine daten ran.



  • Ja ich habe frei ID Wahl.

    dann könntest du die ids nämlich gleich zur indizierung deiner arrays nehmen

    Wie sollte der direkte Zugriff als Code ausschauen?



  • nimm ein array mit zeigern auf deine strukturen und mit der id kommst du direkt an die entsprechende struktur ran.



  • Ah verstehe 🙂 Danke


Anmelden zum Antworten