PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mehr dimensionaler array => segmentation fault



Azrae1
02-11-2003, 16:29
Hallo,

ich werd noch verrückt, jetzt bin ich schon den ganzen Tag dran, dass ich in einem Unterprogramm aus einem Textfile mehrere Strings herausbekommen.
Der erste Pointer zeigt auf ein Feld von einem Feld von Strings.
Ich kann exakt 2 Strings abspeichern dann sagt er
Segmentation Fault

kann mir jemand sagen wo der Fehler ist?
(im main wird der erste pointer au



int getInodesArray(char *filename, char ***files){

FILE *inodesfile;
int i=0;
char inputfilename[15];
// inodesfile = fopen(filename,"r");
inodesfile = fopen("inodes","r");
printf("getInodesArray");

do{
fscanf(inodesfile,"%s",inputfilename);
*files = realloc (*files,(i+1)*sizeof(char*));
if(!*files)
printf("FEHLER bei realloc");
*files[i] = 0;
*files[i] = malloc(strlen(inputfilename)+1);
if(!*files[i])
printf("FEHLER bei malloc");
strcpy(*files[i],inputfilename);
i++;
}while (!feof(inodesfile));
.
.
.



im main wird der pointer so initialisiert



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


mfg Azrael

axeljaeger
02-11-2003, 16:48
filearray = malloc(sizeof(char**));

Wie viele Elemente willst du denn da rein speichern? Im Moment schaffst du dir platz für einen Pointer auf ein char** array. Einen Pointer mit 3 Sternchen halte ich für sehr mutig. Muss das wirklich sein? Willst du bei reinem C bleiben? Ansonsten könnte man nette Klassen aus der C++ Standartbibliothek nehmen.

DanDanger
02-11-2003, 16:56
Hmm,
ich weiss zwar nicht, was bei Dir schiefläuft, aber du kannst das auch so machen :


#include <stdio.h>

char EinString[50][50] ;

void TextFileInStringEinlesen(char *FileName)
{
FILE *fd ;
int i = 0 ;

fd =fopen(FileName, "r") ; // Datei nur im Lese-Zugriff (read) Oeffnen

while(fscanf(fd, %s, EinString[i]) > 0) // Solange Dateiende noch nicht erreicht...
{
i++ ;
}
}


Auf die einzelnen Strings kannst du dann so zugreifen :


EinString[0] ....
EinString[1] ....
EinString[2] ....
.....

z.B.
printf("Erste Zeile der Textdatei : %s\n", EinString[0]) ;


Gruss
DanDanger

Azrae1
02-11-2003, 16:59
Hallo,

so wie ich es jetzt machen möchte müssen drei sterne sein, da ich den pointer in das unterprogramm übergebe und von dort dynamisch ein zweidimensionales feld erweitern.

c++ ist mehr wilkommen, auch wenn ich es nicht kann
(bzw. ich hab micht noch nicht damit auseinandergesetzt)

axeljaeger
02-11-2003, 17:04
In c++ kannst du einen String in einer stringklasse abspeichern, das geht dann so:




#include <string>
using namespace std;

string hallo = "Hallo Welt";



Es gibt dann etliche Containerklassen, in die du die Strings reinpacken kannst. Du musst dich dann auch nicht darum kümmern, ob evtl. mehr String zu speichern sind, als das Array Felder hat usw.

Azrae1
02-11-2003, 17:13
Ich habs jetzt ohne C++ geschafft,

axeljaeger du hattest recht, mit *** arbeiten ist
nicht ideal,

ich habs jetzt so gelöst, dann ich den pointer umkopiere und dann mit einem ** arbeite, am schluss kompiere ich den Pointer wieder zurück auf das ***

dann funktioniert alles einwandfrei



int isinFile(char ***files_){

char **files;
files = *files_;
.
.
.



Danke für eure hilfe, hat mir sehr geholfen