tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von sheel
  • 1 Beitrag von sheel
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
259
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Mavinas Tutorials.de Gastzugang
    Hi,

    habe schon wieder eine Frage...

    Und zwar lese ich eine Datei zeilenweise aus.
    Bestimmte Dinge werden dabei von mir mit Hilfe von strtok getrennt und anschließend in einer linearen Liste abgelegt.

    Soweit so gut.

    Nun möchte ich allerdings auf die Daten im späteren Programmverlauf in einer anderen Funktion wieder zugreifen.

    Ich denke man muss ständig die Zeiger übergeben, aber ich habe leider keine Ahnung wie.


    Meine Liste ist beispielhaft so aufgebaut:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    
    struct liste
    {
         int zahl1;
         char wert1;
         struct liste *next;
    }
     
    struct liste *root=NULL;

    In der Funktion wird ein weiterer Zeiger initialisiert, der mir die augenblickliche Position zurückgibt.

    Code cpp:
    1
    
     struct liste *pos;

    Also "root" benutze ich für den Anfang, fürs erste Element der Liste und "pos" für jedes weitere. "next" gibt mir das Ende der Liste an.


    Wie komme ich also in einer anderen Funktion an die eingelesenen Daten ran?


    Grüße
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    Zitat Zitat von Mavinas Beitrag anzeigen
    Also "root" benutze ich für den Anfang, fürs erste Element der Liste und "pos" für jedes weitere. "next" gibt mir das Ende der Liste an.
    Zeig mal etwas mehr.
    Ich hab den Verdacht, dass du da etwas gründlich missverstanden hast.
    next sollte jeweils auf das Nächste zeigen...

    Damit du Zugriff auf die Liste hast sollte Root schon reichen
    Geändert von sheel (11.08.11 um 23:04 Uhr) Grund: uf->auf
     

  3. #3
    Mavinas Tutorials.de Gastzugang
    Die Funktion sieht in etwas so aus:
    Die Liste befindet sich in einer seperaten Header Datei.

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    
    struct liste
    {
         int zahl1;
         char wert1;
         struct liste *next;
    }
     
    struct liste *root=NULL;

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    
    struct liste *pos; 
    FILE *data=NULL;                     
    char buf[100];                      
    char del[]=" \n";                  
    char *temp;
     
    //vorher wird die Datei noch geöffnet. Den Teil habe ich weggelassen. 
    //Ich beschränke mich nur auf das Einlesen und Ablegen in der Liste
    while(fgets(buf, 100, data))
                {
                        if(root==NULL)
                        {
                            if((root=malloc(sizeof(struct liste)))==NULL)
                            {
                                printf("kein Speicher\n");
                                return 1;
                            }
                            temp=strtok(buf, del);
                            root->zahl1=atoi(temp);
                            temp=strtok(NULL, del);
                            root->wert1=*temp;
                            root->next=NULL;
     
                        else
                        {
                            pos=root;
                            while(pos->next!=NULL)
                                pos=pos->next;
     
                            if((pos->next=malloc(sizeof(struct liste)))==NULL)
                            {
                                printf("kein Speicher\n");
                                return 1;
                            }
                            pos=pos->next;
                            temp=strtok(buf, del);
                            pos->zahl1=atoi(temp);
                            temp=strtok(NULL, del);
                            pos->wert1=*temp;
                            pos->next=NULL;
                        }
    fclose(data);

    Die Funktion bekommt derzeit nichts übergeben.
    Geändert von Mavinas (11.08.11 um 22:53 Uhr)
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    1) Globale Variablen...wenn, dann nicht in Headerdateien.
    Sobald du das Programm in mehrere Codedateien aufteilst bekommst du damit Linkerfehler.
    Definier root im main.

    2) pos als Hilfsvariable ist OK

    3) Um root aus dem main in die Funktion zu übergeben gibt es zwei Möglichkeiten.
    Wenn du nicht nur C, sondern auch die mit C++ neu dazugekommenen Sachen verwenden darfst/kannst/willst, schreibst du "struct liste *&root" und übergibst beim Aufruf einfach "root".
    Andernfalls "struct liste **root" und "&root", für die Möglichkeit musst du aber auch den Zugriff in der Funktion an jeder Stelle umändern. Variante 1 ist bequemer.

    4) Hab mir den Einfügeprozess nicht genau angeschaut, aber du soltlest sowas wie "Einfügen in Liste", "Löschen aus Liste" etc. in eigene Funktionen packen.
    In dieser besprochenen Funktion dann nur den Dateiteil übernehmen und immer die andere Einfügefunktion aufrufen.
    Einfüge in die Liste wirst du sicher noch an anderen Stellen; wäre doch sinnlos immer neu programmieren.

    Gruß
    Mavinas bedankt sich. 

  5. #5
    Mavinas Tutorials.de Gastzugang
    Jo, danke dir.
    Das mit "root" probiere ich im Laufe des Tages nochmal.

    Das Einfügen ist leider in Wirklichkeit etwas komplizierter. Habe mich hier wirklich auf das Wesentliche beschränkt. Ansonsten ist es natürlich besser, wenn man dafür eine extra Funktion schreiben würde, die gegebenenfalls an anderer Stelle wieder verwendet werden kann.

    Die Liste in einer Headerdatei abzuspeichern ist aber so Programmierstil technisch ok?

    Edit:
    Kleine Frage noch.
    Die Funktion müsste den Zeiger am Ende auch wieder zurückgeben, oder?
    Wie mache ich das dann mit den Fehlermeldungen "return 1" etc. die auftreten können?
    Ich bin grad auf dem Stand, dass man nur eine Sache zurückgeben kann.
     

  6. #6
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Die Liste in einer Headerdatei abzuspeichern ist aber so Programmierstil technisch ok?
    Was ist "die Liste"?
    Das root nicht da rein gehört, sagte ich schon.
    Zu den Funktionen drin: Die sollten in ine dazugehörende cpp-Datei.
    In der Heaserdatei nur Returntyp, Funktionsname, Parameter und einen Striichpunkt übriglassen.

    zB.
    In der .h
    Code cpp:
    1
    
    void funk(int i);
    in der .cpp
    Code cpp:
    1
    2
    3
    4
    
    void funk(int i)
    {
        printf("%d\n", i);
    }

    Ich bin grad auf dem Stand, dass man nur eine Sache zurückgeben kann.
    Ja, stimmt.
    Die Funktion müsste den Zeiger am Ende auch wieder zurückgeben, oder?
    Bei den zwei Übergabemöglichkeiten, die ich geschrieben habe, ist das nicht nötig.
    Da werden Änderungen automatisch ins main (oder wo die Funktion sonst aufgerufen wird) übernommen.
    Du kannst die Returnwerte also weiterhin für Fehlerwerte nutzen

    Gruß
     

  7. #7
    Mavinas Tutorials.de Gastzugang
    Zitat Zitat von sheel Beitrag anzeigen
    Was ist "die Liste"?
    Also im Moment steht folgendes in der Header:

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    #ifndef LIST_H_
    #define LIST_H_
     
    //Include Dateien
    //[...]
     
    struct liste
    {
         int zahl1;
         char wert1;
         struct liste *next;
    }
     
    struct liste *root=NULL;
     
    //Funktionsprototypen
    int lade_daten();
     
    #endif /* LIST_H_ */

    "root" ändere ich dann noch.
    Geändert von Mavinas (12.08.11 um 11:41 Uhr)
     

  8. #8
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Wnn root da noch rauskommt, ist es in Ordnung.

    Gruß
    Mavinas bedankt sich. 

  9. #9
    Mavinas Tutorials.de Gastzugang
    Ich habe das mit "root" jetzt so probiert wie du beschrieben hast.

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    
    //In Main
    struct liste **root=NULL;
     
    //Übergabe an erste Funktion
    function1(&root);
             //Direkte Weitergabe an untergeordnete Einlesefunktion
                  function2(&root);

    Nun hat sich allerdings ein weiteres Problem eingeschlichen.
    In meiner einlese Funktion erkennt der Compiler die einzelnen Variablen der Liste nicht mehr.

    Heisst ich kann nicht wie zuvor mit "root->zahl1" etwas zuweisen.

    Code cpp:
    1
    
    error: request for member 'zahl1' in something not a structure or union


    Edit:
    Habs schon selbst rausgefunden.
    Muss die Liste auch mit übergeben.
    Also bei der Fnktionsdefinition "struct liste *" schreiben.

    Danke nochmal!

    Edit2:
    Wenn ich im weiteren Programmverlauf auf "root" zugreifen will, stürzt es ab.
    Ich kann also immernoch nur innerhalb der einlese Funktion ohne Probleme darauf zugreifen.
    Irgendwas ist noch falsch. Ich such mal weiter.
    Geändert von Mavinas (12.08.11 um 15:13 Uhr)
     

  10. #10
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    Im main nur mit einem * wie du es bis jetzt ja gehabt hast!

    Das *& oder ** meinte ich bei der Funktionsdefinition, zB.
    Code cpp:
    1
    
    int funktion(struct liste *&root)

    Und ich empfehle nocheinmal die *&-Variante.
    Sonst wirds in der Funktion umständlich.
     

Ähnliche Themen

  1. Zugriff auf eine Liste in der View bei @OneToMany Beziehungen
    Von outsidaa im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 1
    Letzter Beitrag: 13.12.09, 18:54
  2. Pointer-Problem bei verketteter Liste
    Von Pollux im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 27.09.08, 23:00
  3. Problem beim Zugriff auf übergebenen Pointer
    Von Kaiser206 im Forum C/C++
    Antworten: 9
    Letzter Beitrag: 23.06.08, 19:09
  4. Delphi 7 , Objekt Pointer , Einfach verkettete Liste
    Von xaros im Forum Delphi, Kylix, Pascal
    Antworten: 2
    Letzter Beitrag: 15.05.06, 14:54
  5. Antworten: 1
    Letzter Beitrag: 05.12.04, 12:05