Jump to content



Segmentation fault εκεί που δεν το περιμένω (στη C)


Amadeus7

Recommended Posts

Γειά και χαρά σας παίδες. Παλεύω να γράψω ένα προγραμματάκι αλλά μου πετάει segmentation fault όταν τρέχω το παρακάτω (εδώ απλά θέλω να διαβάσω αριθμούς από ένα αρχείο lab1.dat και να τους βάλω σε έναν πίνακα):


#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#define ROW_NUM 15

#define COLUMN_NUM 18

int 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

μπορεί να καταλάβει κανείς τί παίζει???

Link to comment
Share on other sites

Το 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 (**) καθώς είναι για πολύ συγκεκριμένες περιπτώσεις...

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Δημιουργία...

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.