Amadeus7 Δημοσιεύτηκε Νοέμβριος 2, 2009 #1 Δημοσιεύτηκε Νοέμβριος 2, 2009 Γειά και χαρά σας παίδες. Παλεύω να γράψω ένα προγραμματάκι αλλά μου πετάει segmentation fault όταν τρέχω το παρακάτω (εδώ απλά θέλω να διαβάσω αριθμούς από ένα αρχείο lab1.dat και να τους βάλω σε έναν πίνακα):#include<stdio.h>#include<string.h>#include<stdlib.h>#define ROW_NUM 15#define COLUMN_NUM 18int initialize(int **Array, int rows, int columns){ int i=0 ,j=0; char *separator=" , , "; char buffer[72]; FILE *lab1; lab1=fopen("lab1.dat","r"); if(lab1==NULL) printf("Error: can't open file lab1.dat .\n"); for(i=0; i<rows; i++) { fgets(buffer,72,lab1); Array[i][0]=atoi(strtok(buffer, separator)); for(j=1; j<columns; j++) Array[i][j]=atoi(strtok(NULL, separator)); } return(0);}int main(){ int i, j; int **A; A=(int**)malloc(ROW_NUM*sizeof(int*)); for(i=0; i<ROW_NUM; i++) A[i]=(int*)malloc(COLUMN_NUM*sizeof(int)); initialize(A, ROW_NUM, COLUMN_NUM); return(0);}Και το αρχείο lab1.dat: 0 0 -5 0 0 0 0 12 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 31 0 0 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 4 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 -10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 0 0 0 0 6 0 0 0 0 0 0 0 8 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 16 0 0 21 0 0 0 0 0 0 0 0 0 0 11 0 0 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 25 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 20 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0μπορεί να καταλάβει κανείς τί παίζει???
Jaco Νοέμβριος 4, 2009 #2 Νοέμβριος 4, 2009 Το segmentation error που βγάζει το Linux, είναι συνήθως κάποιος pointer αλλού γι' αλλού...Βασικά ένα λάθος σου είναι ότι ενώ ναι μεν κάνεις τον έλεγχο για το NULL που μπορεί να επιστρέψει η fopen δεν το χειρίζεσαι σωστά γιατί παρακάτω χρησιμοποιείς την fget η οποία όμως έχει έναν μάλλον null pointer για file descriptor... οπότε εκεί θα τα τινάζει... άρα πρέπει να το κάνεις ως εξής...:if(lab1==NULL) { printf("Error: can't open file lab1.dat .\n"); return(-1); //return some error code}έτσι ώστε μην μπαίνει στο πιο κάτω for και πέσει στην fgets...Αν όντως υπάρχει το lab1.dat τότε θα πρέπει να ορίσεις σωστά το execution directory που βλέπει εκείνη την στιγμή το πρόγραμμα, οπότε ή θα πρέπει να τρέξεις πρώτα μια chdir που την υποστηρίζει το gcc ή να δώσεις το full path μαζί με το αρχείο... δηλαδή...:chdir("/tmp/test/Debug/"); //αν το αρχείο lab1.dat είναι στον φάκελο αυτόlab1=fopen("lab1.dat","r"); //άνοιγμα αρχείουή lab1=fopen("/tmp/test/Debug/lab1.dat","r");Εδιτ:Επίσης όταν τελειώσεις με το αρχείο, τρέξε την fclose για να απελευθερώσεις τον handler...Γενικά δεν ξέρω τι θέλεις να κάνεις, αλλά δεν βλέπω κάποιο λόγο να χρησιμοποιήσεις pointer to pointer (**) καθώς είναι για πολύ συγκεκριμένες περιπτώσεις...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.