Strukturarray realloc? Malloc?



  • muss ich hier noch jedes Struktur element einzeln mit Speicher per malloc versorgen?

    Weil der angegeben Code funktioniert nicht so ganz...

    int count=0; // zähler wie viele eingaben
      struct dats * daten = NULL;
    
    	FILE *fd;
    	char trenner[] = "|";
    
    	int nRet;
    	size_t *t = malloc(0);
    	char **gptr = (char **)malloc(sizeof(char*));
    	*gptr = NULL;
    
       if ( (fd = fopen(datei,"r")) == NULL) {
          fprintf(stderr, "\nKonnte Datei %s nicht öffnen!", datei);
          exit(EXIT_FAILURE);
       }
    
    /* Datei zeilenweise einlesen */
       while( (nRet=getline(gptr, t, fd)) > 0){
    
         count++;
         daten = (struct dats*) realloc (daten, count * sizeof(struct dats));
         if (daten==NULL)
           { 
           	puts ("Error (re)allocating memory"); 
           	exit (0); 
           }
    
    		strcpy(daten[count-1].date1,strsep(gptr,trenner));      
    		strcpy(daten[count-1].date2,strsep(gptr,trenner));      
    
     }
    

    gruß
    Dominik



  • Das kommt ganz darauf an, wie dein struct definiert ist. Wenn die Elemente als char[] deklariert sind, werden sie mit angelegt (dann solltest du aber aufpassen, daß du nicht zu viele Daten reinkopierst), wenn du char*'s hast, mußt du denen noch gesondert Speicherplatz zuweisen.



  • struct dats {
    	char date1[10];
    	char date2[10];
    	char date3[10];
    };
    

    so schaut meine Struktur aus.
    Ich kann das ganze zwar durchlaufen, aber nur 6x mit einer Datei mit folgendem Inhalt

    246|1|2||..
    246|1|2||..
    246|1|2||..
    246|1|2||..
    246|1|2||..
    246|1|2||..
    297|1|12||..
    

    Wenn ich Testweise ausgebe, bekomme ich 6x 246 ausgegeben und dann Speicherfehler?!



  • problem gelöst 🙂

    Lag nicht an Struktur, lag an einem anderen Pointer (gptr - Zeileneinlesen)

    Aber jetzt hab ich ein anderes kleines Problem 😞

    /* Variablendeklaration */
    char *token;
    char *tmp;
    
    tmp=malloc(strlen(*gptr)+1);
    memcpy(tmp,gptr,strlen(*gptr)); 
    
    token = strsep(tmp,trenner); /* Hinweis: "passing arg 1 of 'strsep' from incompatible pointer type */
    strcpy(daten[count-1].date1,token);
    

    Funktionieren tuts, aber 100% richtig ists ja nicht...

    gruß
    Dominik



  • token = strsep( &tmp, trenner);
    

    Und wenn du eh schon nicht-ANSI Funktionen verwendest, dann kannst anstelle von

    tmp=malloc(strlen(*gptr)+1);
    memcpy(tmp,gptr,strlen(*gptr));
    

    auch gleich strdup() nehmen.



  • thx.

    Was könnte das für Probleme bereiten mit nicht "ansi c" Funktion?

    [quote]
    The strsep() function is intended as a replacement for the strtok() func-
    tion. While the strtok() function should be preferred for portability
    reasons (it conforms to ANSI X3.159-1989 (``ANSI C'')) it is unable to
    handle empty fields
    ,...

    eigentlich hatte ich zuerst strtok, aber da es keine leeren Felder behandeln kann...
    
    [cpp]
    char **tmp;
    

    jetzt gehts 🙂



  • freakx0 schrieb:

    Was könnte das für Probleme bereiten mit nicht "ansi c" Funktion?

    Portabilität ist im Eimer.


Anmelden zum Antworten