Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Brauche dringend Hilfe zu Listen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.06.2004, 12:44 Uhr
~Alex3333
Gast


Hallo,
habe folgendes Problem, ich soll den DOSen DIR Befehl in C nachbilden. Da die Ausgabe sortiert nach der letzten Datenänderung erfolgen soll, lege ich die Daten in einer einfach verketteten Liste ab. Doch das klappt nicht so ganz, am Ende steht nur der letzte Eintrag mehrmals in der Liste, die Anzahl der Listenelemente stimmt aber. Es scheint so als würde ich jedem Zeiger der Liste immer den gleichen Dateneintrag zuweisen. Ich finde aber meinen Fehler einfach nicht
Wäre nett, wenn mir jemand helfen könnte...
Hier der komplette Code. Der Fehler muss in der liste.c sein. Main Funktion befindet sich in mydir.c Kompiliert wird der Code problemlos macht aber nicht so ganz was es soll.


C++:
/******************************************************************************/
/*                  liste.c                                        */
/******************************************************************************/
#include "liste.h"
#include "datetime.h"


struct Liste *current;



void Ausgabe(_finddata_t *entrylist){ //Gib Daten aus
    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  ",DataInfo.tm_mday,                      \
    DataInfo.tm_mon,DataInfo.tm_year,DataInfo.tm_hour,DataInfo.tm_min);
    if(entrylist->attrib & _A_SUBDIR) printf("<DIR>         %s\n",             \
    entrylist->name);
    else printf("     %-9i%s\n",entrylist->size, entrylist->name);
}

int ListVgl(time_t x, time_t y){ //Vergleiche letzte Änderung
    double diff = difftime(x,y); //x-y
    printf("%f\n",diff);
    if(diff<=0)
        return (1);
    else
        return (0);
}

void insert(struct _finddata_t *entry){
    struct Liste *dummy=(struct Liste*)malloc( sizeof(struct Liste) );
    if(dummy){
        dummy->dirEntry=entry;
        dummy->next=NULL;
        if(!(hd->head))        //Kein Eintrag in der Liste, erstes Element
           {
           hd->head=dummy;
           printf("Kopf eingefügt\n");
           }
        else
           {
           if(ListVgl(hd->head->dirEntry->time_write,dummy->dirEntry->time_write))
              {        //Eintrag kleiner Head, Element vor Head setzen. Hier ist bereits Head = Dummy! Wieso?!?
              Ausgabe(hd->head->dirEntry);
              Ausgabe(dummy->dirEntry);
              dummy->next=hd->head;
              hd->head=dummy;
              printf("Vor Kopf eingefügt\n");
              }
           else              //Eintrag kommt irgendwo in die Liste, suche und füge ein.
              {
              current=hd->head;
              while(current->next && ListVgl(current->dirEntry->time_write,dummy->dirEntry->time_write))
                 {
                 current=current->next;
                 }
              dummy->next=current->next;
              current->next=dummy;
              printf("Mitten eingefügt\n");
              }
           }
        }
}


void initIteration(void){              //Liste durchlaufen und ausgeben
    current=hd->head;
    Ausgabe(current->dirEntry);
    struct _finddata_t *DirEntry;
    while(DirEntry=getnext())
        {
        Ausgabe(DirEntry);
        }
            
}


struct _finddata_t *getnext(void){
    if(current->next)
        {
        current=current->next;
        return(current->dirEntry);
        }
    else
        return 0;
}


void destroyList(void){                //Speicher freigeben
    struct Liste *dummy;
    current=hd->head->next;
    while(current){
        dummy = current->next;
        free(current->dirEntry);
        free(current);
        current=dummy;
    }
}







C++:
/******************************************************************************/
/*                  mydir.c                                           */
/******************************************************************************/
#include "datetime.h"
#include "liste.h"
struct ListHead *hd;


int main(int argc, char **argv)
{
hd=(struct ListHead *) malloc(sizeof (struct ListHead));
hd->head=NULL;
struct _finddata_t entry;
int done = 0;
long handle;
char sSearchDir[256];
if(argc<=1) {
    strcpy( sSearchDir, "*.*" );}
else{
    sprintf(sSearchDir,"%s\\*.*",argv[1]);
    }
if ((handle = _findfirst(sSearchDir,&entry))!= -1L)
    {
    while(!done)
        {
        Ausgabe(&entry);
        insert(&entry);
        done = _findnext(handle, &entry);
        }
    _findclose(handle);
    }
else
{printf("*** Kein Eintrag gefunden ***");}

initIteration();

destroyList();
//int leak = _CrtDumpMemoryLeaks();

}





C++:
/******************************************************************************/
/*                  liste.h                                           */
/******************************************************************************/
#ifndef __LISTE_H
#define __LISTE_H
#include <io.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct Liste{
    struct _finddata_t *dirEntry;
    struct Liste *next;
};

struct ListHead{
    struct Liste *head;
    };

extern struct ListHead *hd;

extern void Ausgabe(_finddata_t *entrylist);
extern void insert(struct _finddata_t *entry);
extern void initIteration(void);
extern struct _finddata_t *getnext(void);
extern void destroyList(void);
#endif



C++:
/******************************************************************************/
/*                  datetime.c                                          */
/******************************************************************************/
#include "datetime.h"



void convertDate(time_t time, int *day, int *month, int *year)
{
    struct tm zeitdaten;
    zeitdaten = *localtime(&time);
    *month = zeitdaten.tm_mon + 1;
    *day = zeitdaten.tm_mday;
    *year = zeitdaten.tm_year + 1900;
}

void convertTime(time_t time, int *hour, int *min)
{
    struct tm zeitdaten;
    zeitdaten = *localtime(&time);
    *hour = zeitdaten.tm_hour;
    *min = zeitdaten.tm_min;
}




C++:
/************************************/
/*          datetime.h              */
/************************************/
#ifndef __datetime_h        
#define __datetime_h
#endif
#include <time.h>



extern void convertDate(time_t time, int *day, int *month, int *year);


extern void convertTime(time_t time, int *hour, int *min);


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.06.2004, 13:18 Uhr
ao

(Operator)


struct Liste enthält einen Pointer auf _finddata_t. Der Fehler ist, dass du in insert() nur diesen Pointer auf das gefundene _finddata_t-Element zeigen lässt. Das ist aber immer dasselbe Element und wird bei jedem Aufruf von _findnext () überschrieben.

Abhilfe: In insert () musst du eine *Kopie* des reingereichten Elements machen und diese speichern.

Das war übrigens eine sehr gute Fehlerbeschreibung, im Gegensatz zu anderen Postings, die in letzter Zeit bei mir ein bisschen für Verdruss gesorgt haben (Zehn Seiten Code ausgekippt und die lapidare Frage dazu: "Wat is hier falsch?")

Dieser Post wurde am 23.06.2004 um 13:21 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.06.2004, 15:45 Uhr
~Alex3333
Gast


Vielen Dank! Das habe ich nicht gesehen, dass ich da immer den gleichen Zeiger auf das zuletzt eingefügte Element vergeben habe.
Nun funktionierts! Danke nochmal!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: