Fehler bei Funktion (Zeigerreihungen) in C



  • Hallo Zusammen,

    Fall:
    Habe eine Funktion "neueBestellPosition", die zu einer durch den Parameter bestellungsID(siehe Funktion "neueBestellung) identifizierten Bestellung eine neue BestellPosition anlegt. Die neue Bestellposition wird mit Hilfe der übergebenen Werte initialisiert.

    Mein Problem:
    Ich kann die Variablen in der Funktion "neueBestellPosition" nicht initialisieren, siehe fettmarkierte Zeilen. Beim Debuggen wirft er immer diese Meldung aus:
    #0 76788E20 strcat() (C:\Windows\syswow64\msvcrt.dll:??)
    #1 00000000 0x00000000 in ??() (??:??)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX_BESTELLUNGEN 100
    #define MAX_BESTELLPOSITIONEN 10
    
    struct Bestellposition
    {
    
        char artikelBezeichnung[50];
        float artikelPreis;
        int anzahlArtikel;
    
    };
    
    struct Bestellung
    {
    
        char kundenname[101];
        struct Bestellposition *positionen[10];
    };
    
    struct Bestellung *bestellungsListe[MAX_BESTELLUNGEN];
    
    int neueBestellung(char name[])
    {
    
        int index  = 0;
    
        while(index < MAX_BESTELLUNGEN && bestellungsListe[index] != NULL)
        {
            index++;
        }
    
        if(index < MAX_BESTELLUNGEN)
        {
    
            struct Bestellung *neu;
    
            neu = (struct Bestellung*)malloc(sizeof(struct Bestellung));
    
            strcpy(neu->kundenname, name);
            neu->positionen[0] = NULL;
    
            bestellungsListe[index] = neu;
            bestellungsListe[index+1] = NULL;
    
        }
    
        return index;
    }
    
    void neueBestellPosition(int id, char artikel[], float preis, int anzahl)
    {
    
        int i = 0;
    
        while(bestellungsListe[id]->positionen[i] != NULL)
        {
            i++;
        }
    
        if(i < MAX_BESTELLPOSITIONEN)
        {
    
    [b]        strcpy(bestellungsListe[id]->positionen[i]->artikelBezeichnung,artikel);
            bestellungsListe[id]->positionen[i]->artikelPreis = preis;
            bestellungsListe[id]->positionen[i]->anzahlArtikel = anzahl;[/b]
    
        }
    
    }
    
    int main()
    {
    
        int bestellungsID;
        initBestellListe();
        bestellungsID = neueBestellung("Müller");
        neueBestellPosition(bestellungsID, "Milch", 0.99, 1);
        neueBestellPosition(bestellungsID, "Butter", 1.50, 2);
    
        return 0;
    }
    

    Hoffe ihr könnt mir helfen 🙂



  • Wo besorgst du denn Speicher für die positionen ?
    Irgendwo bei Zeile 73 muss das sein.

    Und du solltest vorher prüfen ob i zu groß wird.



  • Das könnte es sein, nur weiß ich momentan nicht, wie ich das am Besten mach...
    Danke schon mal für den Hinweis 🙂



  • bestellungsListe[id]->positionen[i] = malloc(sizeof(struct Bestellposition));
    

    oder so.

    Du solltest deine Preise in Cent und als unsigned int abspeichern.
    Und vor allem dann auch als Integer berechnen.



  • Speicherreservierung hat hingehauen ;).
    Habs so gemacht:
    struct Bestellposition neu;
    neu = (struct Bestellposition
    )malloc(sizeof(struct Bestellposition));
    bestellungsListe[i]->positionen[i] = neu;

    Sehe aber, dass deins kürzer ist, somit besser :).

    Ein kleines Problem hab ich noch:

    Hab am Anfang eine Funktion:
    void initialisiere_Liste(), möchte hier alle Positionen pro Bestellung am Anfang auf NULL festlegen, aber hier bringt er mir auch wieder beim Debuggen einen Fehler (fett markiert), hier brauche ich doch noch keinen Speicher reservieren, oder !?. Reservier ja bei "bestellungsListe[i] == NULL, auch keinen Speicher!? Bin auf einmal sehr verwirrt 😕

    void initialisiere_liste()
    {
    int i;
    int j;

    for(i=0; i < MAX_BESTELLUNGEN; i++) {

    bestellungsListe[i] = NULL;

    for(j=0; j < MAX_BESTELLPOSITIONEN; j++)

    bestellungsListe[i]->positionen[j] = NULL;

    }

    }



  • Da bestellungsListe[i] == NULL ist, gibt es ein bestellungsListe[i]->positionen[j] gar nicht.*

    NULL bedeutet "ungültiger Zeiger".

    (Wenn das Grundstück nicht bebaut ist, kannst du auch nicht in das 3. Stockwerk gehen)

    * Da es nicht existiert, brauchst du es auch nicht initialisieren.
    Das musst du dann machen, wenn du auch den SPeicher dafür geholt hast.



  • Erstmal vielen Dank für deine Mühe ;).
    noch eine kurze Frage :):

    Wie sind denn die anderen Positionen am Anfang bei bestellungsListe[i]->positionen[i] belegt, wenn zum Beispiel position[0] belegt ist. Denn ich muss ja bei einer Befüllung immer sagen, dass der nächste Wert NULL ist also position[0+1] = NULL. Aber diese müssten doch schon von vornherein NULL sein, oder nicht :)?! So war es zumindest bei Java 🙂



  • Du schreibst einmal nach dem malloc

    neu->positionen[0] = NULL;
    

    Das musst du für die anderen MAX_BESTELLPOSITIONEN auch machen (also bis positionen[MAX_BESTELLPOSITIONEN-1]).

    Eigentlich musst du auch alle Elemente von bestellungsListe[MAX_BESTELLUNGEN] initialisieren.
    Nur ist das bei die eine globale Variable und die werden sowieso mit 0 initialisiert.



  • Wenn ich aber am Anfang schon bei der Initialisierungs_Funktion sage, bestellungsListe[i]->positionen[i] = NULL; und ich reserviere dann später für die Bestellpositionen dynamisch mit malloc speicher, werden dann alle MAX_BESTELLUNGEN mit einer Adresse belegt, d.h. keine NULLWERTE?! Bei Java ist das nämlich anders. Da sind alle anderen Werte, die noch nicht belegt wurden, gleich NULL.



  • C != Java. :xmas2:
    Und das nicht nur dem Namen nach.

    Der Speicher kannst du benutzen. Es steht aber das drin, was drin steht. Evtl. auch Daten von einem Programm, das den Speicher vorher belegt hatte.

    Du solltest dir mal calloc ansehen. Das setzt den Speicher auf 0.



  • Dankeschön Dirk, hast mir sehr geholfen 👍


Anmelden zum Antworten