Dynamisches Array call-by-reference übergeben

09/09/2010 - 12:04 von gismo82 | Report spam
Hi...

ich bin leider noch nicht so fit in der C-Programmierung, und hoffe,
dass ich hier Hilfe finde.

Wie ich in folgendem Post
http://groups.google.com/group/de.c...read/dd...
beschrieben habe, lese ich eine CSV-Datei in ein Dynamisches Array
ein.

Dies klappt auch ganz gut. Nun möchte ich das ganze in eine Funktion
"readFile" ausgliedern. Leider bekomme ich ein "Segmentation Fault".
Kann jemand bitte einmal über den Code schauen? Ich weiß leider nicht
weiter.

Original CSV-Datei:

1:Spalte2-Zeile1:Spalte3-Zeile1:19
2:Spalte2-Zeile2:Spalte3-Zeile2:59
3:Spalte2-Zeile3:Spalte3-Zeile3:89

-
Quellcode:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

typedef struct {
int status;
char *spalte2;
char *spalte3;
int start;

} Data;

int readFile(FILE *timersConf, Data **daten)
{
daten = NULL;

int count = 0;
int i = 0;

int nRet;
size_t *t = malloc(0);

char **gptr = malloc(sizeof(char*));
*gptr = NULL;

while( (nRet=getline(gptr, t, timersConf)) > 0)
{
daten = (Data **)realloc(daten, (count + 1) * sizeof(Data *));
daten[count] = (Data *)malloc(sizeof(Data));

daten[count]->status = atoi(strtok(*gptr,":"));
daten[count]->spalte2 = strtok(NULL,":");
daten[count]->spalte3 = strtok(NULL,":");
daten[count]->start = atoi(strtok(NULL,":"));

// Ausgabe 1
printf("%d - %s - %s - %d",daten[count]->status, daten[count]-


spalte2, daten[count]->spalte3, daten[count]->start);



*gptr = NULL;
count++;
}
return count;

}

int main(int argc, char **argv)
{
Data **daten = NULL;
FILE *datei = NULL;
int i = 0;
int count = 0;

datei = fopen("/home/andreas/test.csv", "r");

count = readFile(datei, daten);

// Ausgabe 2
for (i = 0;i < count; i++) {
printf("%d - %s - %s - %d",daten[i]->status, daten[i]-

spalte2, daten[i]->spalte3, daten[i]->start);



}

fclose(datei);

return 0;

}

-
Ausgabe:

1 - Spalte2-Zeile1 - Spalte3-Zeile1 - 19
2 - Spalte2-Zeile2 - Spalte3-Zeile2 - 59
3 - Spalte2-Zeile3 - Spalte3-Zeile3 - 89
Segmentation fault

Die ersten 3 Zeilen der Ausgabe werden direkt in der Funktion gemacht.

Kann mir jemand helfen?

Gruß Andreas
 

Lesen sie die antworten

#1 Rainer Weikusat
09/09/2010 - 12:36 | Warnen spam
gismo82 writes:
Dies klappt auch ganz gut. Nun möchte ich das ganze in eine Funktion
"readFile" ausgliedern. Leider bekomme ich ein "Segmentation Fault".
Kann jemand bitte einmal über den Code schauen? Ich weiß leider nicht
weiter.

Original CSV-Datei:

1:Spalte2-Zeile1:Spalte3-Zeile1:19
2:Spalte2-Zeile2:Spalte3-Zeile2:59
3:Spalte2-Zeile3:Spalte3-Zeile3:89

-
Quellcode:



[ please see original ]

Eine Variante, die bei mir funktioniert (liest Eingaben von stdin):

#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

typedef struct {
int status;
char *spalte2;
char *spalte3;
int start;

} Data;

Data **readFile(FILE *timersConf, int *count)
{
Data **daten = NULL;

int cnt = 0;

int nRet;
size_t t;
char *gptr;

while( (gptr = NULL, nRet=getline(&gptr, &t, timersConf)) > 0)
{
daten = realloc(daten, (cnt + 1) * sizeof(Data *));
daten[cnt] = malloc(sizeof(Data));

daten[cnt]->status = atoi(strtok(gptr,":"));
daten[cnt]->spalte2 = strtok(NULL,":");
daten[cnt]->spalte3 = strtok(NULL,":");
daten[cnt]->start = atoi(strtok(NULL,":"));

// Ausgabe 1
printf("%d - %s - %s - %d",daten[cnt]->status, daten[cnt]->spalte2, daten[cnt]->spalte3, daten[cnt]->start);
++cnt;
}

*count = cnt;
return daten;
}

int main(void)
{
Data **daten = NULL;
int count = 0, i;

daten = readFile(stdin, &count);

// Ausgabe 2
for (i = 0;i < count; i++) {
printf("%d - %s - %s - %d",daten[i]->status, daten[i]->spalte2, daten[i]->spalte3, daten[i]->start);

}

return 0;
}


Allerdings habe ich mir nicht im Einzelnen gemerkt, was ich geaendert
habe, weil es tatsaechlich mit dem von Dir beschriebenen Problem zu
tun hatte und was, weil es einfach nur Stuss war. Fehler sind Eigentum
des Finders.

Ähnliche fragen