struct - Auto-Struktur programmieren



  • Hallo,
    ich möchte ein Programm programmieren, welches Autos aus einer .txt ausliest und man auch Werte hinzufügen kann. Hier mein bisheriges Programm:

    #include <stdio.h>
    #include <stdlib.h>
    
    FILE *file;
    int n = 99;
    const char * const MeineDatei = "meineautos.txt";
    int lc, lv = 0;
    
    typedef struct vehicle CAR;
    struct vehicle
    {
        char Hersteller[10];
        char Modell[10];
        // hier Attribute einfuegen
        unsigned int vMax;
    };
    
    void ShowMenu()
    {
        printf("Bitte waehle!\n\n");
        printf("1. Anzeigen der gespeicherten Autos.\n");
        printf("2. Neues Auto anlegen.\n");
        printf("3. <not implemented> \n");
        printf("4. Beenden.\n");
    }
    
    void ReadFile()
    {
        char str0 [n];
        char str1 [n];
        int i=0;    // Startvaribale der Struktur
        int wert;
        CAR MeineAutoListe [n];
    
        if ((file = fopen (MeineDatei, "r")) == NULL)
        {
            fprintf (stderr, "Fehler beim Oeffnen der Datei %s.\n", MeineDatei);
            return 1;
        }
        while (!feof(file))
        {
            // Werte in den zugehörigen Variablen speichern
            fscanf(file, "%s %s %d", MeineAutoListe[i].Hersteller, MeineAutoListe[i].Modell, &MeineAutoListe[i].vMax);
            i++;
        }
        n = i-1;
        for (i=0; i<=n; i++)
        {
            printf("%s - %s, %dkm/h\n",
            MeineAutoListe[i].Hersteller,
            MeineAutoListe[i].Modell,
            MeineAutoListe[i].vMax);
        }
    
        fclose (file);
    }
    
    int main(int argc, char** argv)
    {
        CAR MeineAutoListe [n]; //n Autos erzeugen
        int zahl;
        while (1)
        {
            ShowMenu();
            scanf ("%d", &zahl);
            switch(zahl)
            {
                case 1:
                    ReadFile();
                    break;
                case 2:
                    printf ("hallo");
                    break;
                case 3:
                    printf ("hallo");
                    break;
                case 4:
                    return (EXIT_SUCCESS);
            }
        }
    
        return (EXIT_SUCCESS);
    }
    

    Das Problem ist, ich weiß nicht, wie ich die Struktur übergeben kann. Ich definier sie (in der ReadFile-Funktion, Zeile 33) neu, was natürlich nicht Sinn der Sache ist. Bin Um Ratschläge sehr dankbar.



  • Mach die Liste doch global. (so wie lc und lv)
    Ansonsten über Zeiger.



  • global habe ich auch schon gedacht, aber das ist immer so "unschön". Und Zeiger wiederum ist etwas kompliziert, lässt es sich gar nicht übergeben an eine Funktion?

    //global definiert folgt folgende Fehlermeldung:

    error: variably modified 'MeineAutoListe' at file scope



  • supersass1 schrieb:

    global habe ich auch schon gedacht, aber das ist immer so "unschön". Und Zeiger wiederum ist etwas kompliziert, lässt es sich gar nicht übergeben an eine Funktion?

    Du kannst ein struct übergeben, aber kein Array. Daher Zeiger. Mit Strings kommst du doch auch klar.

    void ReadFile(CAR *MeineAutoListe, int *Anzahl)
    { ....
      ...
            printf("%s - %s\n",
              MeineAutoListe[i]->Hersteller,
              MeineAutoListe[i]->Modell);
    ....
    

    in main:

    ReadFile(MeineAutoListe, &Anzahl);
    

    supersass1 schrieb:

    //global definiert folgt folgende Fehlermeldung:

    error: variably modified 'MeineAutoListe' at file scope

    WO hast du denn 'MeineAutoListe' definiert? Vor oder nach dem typedef?



  • DirkB schrieb:

    supersass1 schrieb:

    global habe ich auch schon gedacht, aber das ist immer so "unschön". Und Zeiger wiederum ist etwas kompliziert, lässt es sich gar nicht übergeben an eine Funktion?

    Du kannst ein struct übergeben, aber kein Array. Daher Zeiger. Mit Strings kommst du doch auch klar.

    void ReadFile(CAR *MeineAutoListe, int *Anzahl)
    { ....
      ...
            printf("%s - %s\n",
              MeineAutoListe[i]->Hersteller,
              MeineAutoListe[i]->Modell);
    ....
    

    das klappt soweit, aber nur wenn ich

    MeineAutoListe[i].Hersteller

    statt:

    MeineAutoListe[i]->Hersteller

    schreibe.

    supersass1 schrieb:

    //global definiert folgt folgende Fehlermeldung:

    error: variably modified 'MeineAutoListe' at file scope

    WO hast du denn 'MeineAutoListe' definiert? Vor oder nach dem typedef?

    [/quote]

    Danach, aber ich glaube ich benutze nun die Zeigervariante (ist wohl das gängiste).



  • das klappt soweit, aber nur wenn ich
    Zitat:

    MeineAutoListe[i].Hersteller
    

    statt:
    Zitat:

    MeineAutoListe[i]->Hersteller
    

    schreibe.

    Ja klar! Danke.



  • Es klappt jetzt, vielen Dank! 🙂


Anmelden zum Antworten