R
Hallo!
Ich habe mich nochmals etwas mit dem Thema Vektoren von Zeigern befasst und bin zu folgendem Ergebnis gekommen:
Genau wie einen Zeiger kann ich Vektoren von Zeigern an Funktionen übergeben, es wird immer direkt die Speicheradresse auf die der Zeiger zeigt behandelt, sei sie aus einem Vektor oder nicht. Es spielt auch keine Rolle, ob der Zeiger bereits einen sinnvollen Inhalt hat oder nicht, solange ich ungültige Zeiger nicht referenziere.
vgl K&R Programmieren in C S.93 ff., S.104 ff.
Das Problem in obigem Programm ist ein ganz anderes:
Der Speicher für adresse[entry] wird bei jedem Semikolon neu alloziert anstatt bei jedem 38sten.Somit ist der gewünschte Speicher nicht adressierbar. Das kann nicht funktionieren.
Folgender Ansatz ist ANSI konform und laut meinem Verständnis und meinen schlauen Büchern korrekt.
int open_ascii_adress_file(char *filename,t_adress *adresse[])
{
FILE *fd;
int count = 0;
int entry = 0;
int row = 0;
int line = 0;
char c;
char buffer[42];
if ((fd = fopen(filename,"r")) == NULL) {
fprintf(stderr,"Error opening %s \n",filename);
exit(1);
}
if ((adresse[entry] = malloc(sizeof(t_adress))) == NULL) {
fprintf(stderr,"Memory allocation failed");
exit(1);
}
while ((c = getc(fd)) != EOF) {
if (c == ';') {
if (count == 38) {
count = 0;
entry++;
if ((adresse[entry] = malloc(sizeof(t_adress))) == NULL) {
fprintf(stderr,"Memory allocation failed");
exit(1);
}
}
buffer[row++] = '\0';
strncpy(adresse[entry]->field[count],buffer,strlen(buffer)+1);
row = 0;
count++;
continue;
}
if ( isprint(c) || isdigit(c) ) buffer[row++] = c;
}
fclose(fd);
return entry;
}
GreetZ
ReSeT
[ Dieser Beitrag wurde am 13.01.2003 um 20:56 Uhr von ReSeT editiert. ]