Anzeige:
Ergebnis 1 bis 9 von 9

Thema: Struct Array als Parameter [C]

  1. #1
    Registrierter Benutzer
    Registriert seit
    16.08.2002
    Beiträge
    23

    Struct Array als Parameter [C]

    Sowas ähnliches hat es hier schonmal gegeben, konnte mir aber leider nicht weiterhelfen. Mein Problem ist folgendes.
    Über eine externe Funktionion, die vorgegeben ist, werden Datensätze aus einer Dateigeladen.
    Die die laden() Funktion nimmt dabei einen struct Array entgegen der gefüllt wird, und liefert die Anzahl der Datensätze zurück. Ich hab leider ein Problem mit der Übergabe des Arrays aus dem Hauptprogramm, und bekomme immer eine Parse Error beim kompilieren. Die entsprechende Zeilen meine Programmcodes sehen folgendermaßen aus:
    Code:
    #include <stdio.h>
    #include "laden.h"
    
     struct GebEintrag {
      char Vorname[21];
      char Nachname[21];
      int Jahr;
      unsigned short Monat;
      unsigned short Tag;
      }; /* Die Struktur eines Datensatzes. (Entspricht der selben Strukur, wie auch in der laden.c angegeben) */
      
     int main() {
     struct GebEintrag EintragsArray[10]; /* Dies soll halt der Struct Array sein, und soll 10 Datensätze aufnehmen können */
     int EintragsAnzahl;
     printf("Lade Daten...\n");
     EintragsAnzahl = laden(struct GebEintrag EintragsArray); /* Hier ist der Knackpunkt. Nach meiner Ansicht nach, sollte es so richtig sein, aber der Compiler (gcc) meckert das an. */
     printf("Es wurden %i Datensätze geladen.\n",EintragsAnzahl);
     return 0;
     }
    Kompiliert hab ich mit "gcc GebEintrag.c laden.c"; die Ausgabe des Compiler ist:
    GebEintrag.c: In function `main':
    GebEintrag.c:16: parse error before "struct"

  2. #2
    Registrierter Benutzer
    Registriert seit
    10.04.2001
    Ort
    Bremen
    Beiträge
    339
    Hi!

    Kleiner Tipp: Wenn du mit typedef einen neuen Typ definierst, dann kannst du dir sparen das struct immer davor zu schreiben
    Code:
    typedef struct
    {
      char Vorname[21];
      char Nachname[21];
      int Jahr;
      unsigned short Monat;
      unsigned short Tag;
    } GebEintrag;
    Deine lade Funktion sollte dann ungefähr so definiert sein:
    Code:
    int lade(GebEintrag eintr[]); ([] wegen Array, alternativ GebEintrag *eintr)
    Und so aufgerufen werden:
    Code:
    retval = lade(EintragsArray);
    Näheres über typedef findest du hier kurz http://www.foogirl.de/C/EmailLesson11 im Abschnitt "typedef".

    HTH

    c ya,
    Tobias
    Geändert von tkortkamp (18-03-2003 um 19:51 Uhr)

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Nur den Namen des Arrays angeben.

    Er erwartet einen Variablennamen, keine Deklaration.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  4. #4
    Registrierter Benutzer
    Registriert seit
    16.08.2002
    Beiträge
    23
    ich hab jetzt nur den Namen der Array Variablen eingetragen. Beim kompilieren gibt es dann folgenden Fehler:
    Code:
    GebEintrag.c:16: warning: passing arg 1 of `laden' from incompatible pointer type
    Die laden Funktion ist übrigens folgendermaßen deklariert. Die muss auch so bleiben (ist halt Vorgabe)
    Code:
    int laden(struct tempGebEintrag Personen[]);
    Das struct tempGebEintrag ist in der laden.h so deklariert:
    Code:
    struct tempGebEintrag{
    		char Vorname[21];
    		char Nachname[21];
    		int Jahr;
    		unsigned short Monat;
    		unsigned short Tag;
    		};
    Ebenfalls Vorgabe... Da bleibt einem nicht viel Raum für Freiheiten.

  5. #5
    Registrierter Benutzer
    Registriert seit
    10.04.2001
    Ort
    Bremen
    Beiträge
    339
    Hi!

    Funktioniert hier so:
    Code:
    struct  GebEintrag
    {
      char Vorname[21];
      char Nachname[21];
      int Jahr;
      unsigned short Monat;
      unsigned short Tag;
    };
    
    int laden(struct GebEintrag eintr[])
    {
        /*Dummy*/
        return 0;
    }
     
     int main() {
     struct GebEintrag EintragsArray[10]; 
     int EintragsAnzahl;
     printf("Lade Daten...\n");
     EintragsAnzahl = laden(EintragsArray);
     printf("Es wurden %i Datens?tze geladen.\n",EintragsAnzahl);
     return 0;
     }
    c ya,
    Tobias

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von Sayonara
    Das struct tempGebEintrag ist in der laden.h so deklariert:
    Warum deklarierst du eine eigene Struct?
    In C++ ginge das zum Beispiel gar nicht, weil das ein neuer Typ wäre.
    Könnte in C das selbe sein.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer
    Registriert seit
    16.08.2002
    Beiträge
    23
    Original geschrieben von anda_skoa
    Warum deklarierst du eine eigene Struct?
    In C++ ginge das zum Beispiel gar nicht, weil das ein neuer Typ wäre.
    Könnte in C das selbe sein.

    Ciao,
    _
    Die laden.h und laden.c sind komplett vorgegeben. Dort ist das struct auch so deklariert. Ich bin mir jetzt nicht so sicher, ob eine erneute deklaration in dem Hauptprogramm was bringt, aber laufen tut das Programm. Halt "nur" die Compilerwarnung, aber die hat scheinbar nichts damit zutun.

  8. #8
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ich meinte, du musst die Strukt ja nicht neu deklarieren, da sie ja bereits in laden.h deklariert ist.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  9. #9
    Registrierter Benutzer
    Registriert seit
    16.08.2002
    Beiträge
    23
    Jo,..hab ich jetzt auch mal gemerkt. Und die ganze Deklaration weggelassen. Jetzt funktioniert das soweit. Aber ich denke, ich werde mich nochmal in einem anderen Thread melden, mit den selben Programm.....
    Jedenfalls, danke für die Hilfe

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •