Moin!
..
..typedef struct {
int param1
int param2;
int param3;
} stru ;stru **array;
..
..
// Loops for each line
int i = 0;
while( fgets(buffer, MAX_LENGTH_LINE + 2, fp) != NULL ) {
// Reallocates memory
if( i == REALLOC_AFTER ) {
Wie ist denn REALLOC\_AFTER definiert?
> ~~~c
REALLOC_AFTER *= 2;
> array = (stru **)realloc(array, REALLOC_AFTER * sizeof(stru *));
>
> // Checks memory allocation
> if (array == NULL) {
> println("Error");
> exit(EXIT_FAILURE);
> }
> }
>
> chomp ( buffer );
> char *result = strtok( buffer, SEPARATOR );
Die Verwendung von strtok (ISO C89-Standard) wird zu Gunsten von strsep (leider noch nicht standardisiert) empfohlen:
The strsep() function is intended as a replacement for the strtok() function. While the strtok() function should be preferred for portability reasons (it conforms to ISO/IEC 9899:1990 (``ISO C89'')) it is unable to handle empty fields, i.e. detect fields delimited by two adjacent delimiter characters, or to be used for more than a single string at a time.
(Quelle: BSD Library Functions Manual strsep(3))
Außerdem sprechen AFAIK Sicherheitsgründe gegen strtok.
stru s;
s.param1 = atoi(result);
Auch von der Verwendung von atoi wird abgeraten, da es keine Fehler behandelt bzw. korrekt feststellt, im Vergleich zu strtol.
> ~~~c
result = strtok( NULL, SEPARATOR );
> s.param2 = atoi(result);
> result = strtok( NULL, SEPARATOR );
> s.param3 = atoi(result);
> result = strtok( NULL, SEPARATOR );
>
> array[i] = &s;
>
> // Ausgabetest OK
> printf("%i\n", array[i]->param1);
> printf("%i\n", array[i]->param2);
> printf("%i\n", array[i]->param3);
>
> printf("sizeof %i:", sizeof(array));
Bringt dich dies weiter? So weit ich oben gesehen habe, ist array definiert als ein Pointer auf einen Pointer bzw. ein zweidimensionales Array, sollte diese Ausgabe nicht so etwas wie "sizeof 4:" sein?
Greife ich aufs Array aus einer Methode zu,
Seit wann gibt es in C Methoden?
ergibt dies aber ein Fehler, bzw. ich erhalte als Ausgabe irgendwelche grosse Zahlen:
void test() {
printf("%i\n", array[i]->param1);
printf("%i\n", array[i]->param2);
printf("%i\n", array[i]->param3);
Welchen Wert hat denn i bzw. wo ist diese Variable deklariert und definiert? Falls du auf ein globales i zugreifen willst, würde ich dir eher empfehlen, das i an deine Funktion zu übergeben oder gleich die for-Schleife in test() zu schreiben. Außerdem brauchst du array nicht global zu benutzen, da Arrays als Pointer an Unterprogramme übergeben werden, d.h. du kopierst eh nicht deinen halben Speicher durch die Gegend, sondern nur Pointer.
Viele Grüße,
Robert