Array Eintrag auf 0 nach Speicherallokieren



  • Hallo,

    ich hab folgendes Problem und keine Ahnung, was der Grund dafür sein könnte:

    Ich muss einen 2D-Baum bauen und habe dafür folgendes struct:

    struct kdtree{
            char direction; //x or y direction
            double median;
            int points; //number of points
            struct particle *list;
            struct kdtree *father;
            struct kdtree *left;
            struct kdtree *right;
    
        };
    

    Die Vorliegende Datenstruktur ist eine einfach-verkettete List:

    struct particle{
            double x,y;
            struct particle *next;
        };
    

    Für den Aufbau des Baumes muss ich diese Liste nach x bzw. y werten sortieren. Die beste Möglichkeit, die ich gefunden habe, ist, qsort() zu benutzen. Dazu muss ich die Liste in ein Array überführen. Dies geschieht folgendermaßen:

    struct particle *array;
        array = calloc(numberOfParticles, sizeof(struct particle));
        int k;
        for(k=0; k<numberOfParticles; k++){
            array[k] = *list;
            list = list->next;
        }
    

    Soweit so gut. qsort() darauf angewendet funktioniert auch noch wunderbar. Ich erstelle also die Wurzel des Baumes:

    static struct kdtree *tree;
        tree = calloc(1, sizeof(struct kdtree*));
        tree->points = numberOfParticles;
    

    Nun kommt das Mysterium. Sobald ich nun Speicher allokiere für die nächsten Zweige des Baumes, wird der X und Y Wert des ersten Eintrages des Arrays auf 0 gesetzt bzw. 3.1146530717858859e-317 laut debugger. Im Code sieht das so aus:

    tree->left = calloc(1, sizeof(struct kdtree *));
        tree->right = calloc(1, sizeof(struct kdtree *));
    

    Die Ausgabe von array[0].x und array[0].y vor dem Allokieren:
    1 Koordinaten des Punktes: (68.16928 | 71.46369)
    nach dem Allokieren:
    1 Koordinaten des Punktes: (0.00000 | 0.00000)

    Die restlichen Einträge des Arrays sind weiterhin korrekt.

    Hat jemand eine Idee woran dies liegen könnte und wie ich das beheben kann?!

    Für Vorschläge wäre ich wirklich dankbar....



  • Mit calloc(1, sizeof(struct kdtree*)) besorgts du auch nur Platz für einen Zeiger. (z.Zt i.A. 4 Byte)
    Mit tree->points = numberOfParticles; greifst du dann aber auf ein Element zu, das so gar nicht existiert.



  • Über:

    int numberOfParticles=0;
       while (pointer != NULL){
            list = list->next;
            numberOfParticles++;
       }
    

    bestimme ich vorher die Anzahl an Einträgen in der einfach verketteten Liste.

    Wenn ich

    tree->left = calloc(1, sizeof(struct kdtree *))
    

    aufrufe, sollte doch Speicher für ein gesamtes Struct reserviert werden. Ich versteh nicht wie da ein Seiteneffekt auf mein Array entstehen kann. Der Eintrag des Arrays sollte doch von diesem Vorgang komplett unabhängig sein...



  • Sorry, du hattest tatsächlich recht. Es liegt daran, dass ich nur einen Zeiger und nicht den Speicher für das struct reserviert hab....

    tree->left = calloc(1, sizeof(struct kdtree));
    

    löst das Problem.

    Vielen Dank für den Denkanstoss.

    Manchmal sitzt man davor und siehts einfach nicht!!!!



  • little_joe schrieb:

    Für den Aufbau des Baumes muss ich diese Liste nach x bzw. y werten sortieren. Die beste Möglichkeit, die ich gefunden habe, ist, qsort() zu benutzen. Dazu muss ich die Liste in ein Array überführen.

    Was den ganzen Unsinn mit verketteten Listen zu Tage fördert.



  • Leider kann ich mir das nicht aussuchen. Das Vorprogramm liefert diese Datenstruktur, die ich weiterverarbeiten muss, um eine schnelle Suche zu ermöglichen...


Log in to reply