Listenfehler???
-
Habe ein kleines Problem mit Listen, sehe nun vor lauter Bäumen den Wald nicht mehr. Habe folgendes Problem:
Daten sollen in einer Liste sortiert abgelegt werden. Bei der Ausgabe ist aber nur eine Datei abgespeichert. Habe ich da einen Fehler bei der Adressierung gemacht? Zeigt jedes Listenelement auf das gleiche Datenfeld?
Hier der Code:/*************************************************/ /*Liste.h*/ #ifndef __LISTE_H #define __LISTE_H #include <io.h> #include <stdlib.h> #include <stdio.h> struct Liste{ struct _finddata_t *dirEntry; struct Liste *next; }; extern struct Liste *head; extern void insert(struct _finddata_t *entry); extern void initIteration(void); extern struct _finddata_t *getnext(void); extern void destroyList(void); #endif /*******************************************************************/
/******************************************************************/ /*Liste.c*/ #include "liste.h" #include "datetime.h" #include <stdio.h> #include <string.h> struct Liste *current; void Ausgabe(_finddata_t *entrylist){ struct tm DataInfo; convertDate(entrylist->time_write,&DataInfo.tm_mday, &DataInfo.tm_mon, \ &DataInfo.tm_year); convertTime(entrylist->time_write,&DataInfo.tm_hour, &DataInfo.tm_min); printf("%02i.%02i.%4i %02i:%02i %-12i %s\n",DataInfo.tm_mday, \ DataInfo.tm_mon,DataInfo.tm_year,DataInfo.tm_hour,DataInfo.tm_min, \ entrylist->size, entrylist->name); } /*Vergleicht den letzten Zugriff der Dateien miteinander*/ int ListVgl(time_t x, time_t y){ double diff = difftime(x,y); //x-y if(diff>=0.0) return(0); else return(1); } /*Fügt ein neues Element in die Liste ein*/ void insert(struct _finddata_t *entry){ struct Liste *dummy=(struct Liste *)malloc( sizeof(struct Liste) ); if (dummy){ dummy->dirEntry=entry; dummy->next = 0; if(!head){ head = dummy; printf("Kopf eingefügt!\n"); } else{ if(ListVgl(head->dirEntry->time_write,dummy->dirEntry->time_write)){ dummy->next=head; head=dummy; printf("2tes Element eingefügt!\n"); } else{ current = head; while(current->next && !ListVgl(current->dirEntry->time_write,\ dummy->dirEntry->time_write)){ current=current->next; } dummy->next=current->next; current->next=dummy; printf("xtes Element eingefügt!\n"); } } } } /*Läuft die Liste ab und gibt lässt die Elemente ausgeben*/ void initIteration(void){ struct _finddata_t *nex; if (head){ current = head; while(current->next){ Ausgabe(nex = getnext()); current=current->next; } } } struct _finddata_t *getnext(void){ return(current->dirEntry); } /*Löscht die Liste*/ void destroyList(void){ struct Liste *dummy; current=head->next; while(current){ dummy = current->next; free(current->dirEntry); free(current); current=dummy; } }
Sieht jemand auf einen Blick, wo mein Fehler liegt?
-
Wieviele Datensätze sollten denn angezeigt werden?
Bei initIteration() würde ich anstatt
while(current->next)
besser
while(current)
nehmen. Dann kannst du dir auch die Prüfung von head am Anfang sparen und es wird auch der letzte Datensatz ausgegeben ;).
-
Es sollen alle Datensätze angezeigt werden. Es handelt sich bei den Datensätzen um Verzeichniseinträge, die sortiert nach dem letzten Schreibzugriff sortiert und in der Liste abgelegt werden sollen (späteste zuletzt) und dann ausgegeben werden sollen.
Die Anzahl der Lsitenelemente stimmt, jedoch scheint jedes Listenelement immer auf den zuletzt eingefügten Datensatz zu zeigen?!?
-
Wenn es am Einfügen liegen sollte, dann solltest du am besten mal den Debugger anschmeissen ;). Dann kannst du es auch besser eingrenzen, wo es schief läuft.
-
Bekomme dann 2x die Meldung Zugriffsverletzung (Segmentation Fault) angezeigt... Nur wo???
-
Genau das solltest du ja mit dem Debugger rausbekommen
Setz einfach mal einen Haltepunkt bei dem Aufruf der Funktion und dann geh den Code Schritt für Schritt durch.