Amadeus7 Δημοσ. 2 Νοεμβρίου 2009 Δημοσ. 2 Νοεμβρίου 2009 Γειά και χαρά σας παίδες. Παλεύω να γράψω ένα προγραμματάκι αλλά μου πετάει 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(separator, buffer)); for(j=1; j<columns; j++) Array[i][j]=atoi(strtok(separator, NULL)); } 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 μπορεί να καταλάβει κανείς τί παίζει???
Evgenios1 Δημοσ. 2 Νοεμβρίου 2009 Δημοσ. 2 Νοεμβρίου 2009 1) Στο αρχειο δεν εχεις κομμα. 2) strtok(separator, buffer) Δες τις παραμετρους (Βαλτα αναποδα )
Amadeus7 Δημοσ. 2 Νοεμβρίου 2009 Μέλος Δημοσ. 2 Νοεμβρίου 2009 1) Στο αρχειο δεν εχεις κομμα.2) strtok(separator, buffer) Δες τις παραμετρους (Βαλτα αναποδα ) ευχαριστώ για την απάντηση το έκανα έτσι αλλά πάλι μου πετάει segmentation fault > 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); }
Directx Δημοσ. 2 Νοεμβρίου 2009 Δημοσ. 2 Νοεμβρίου 2009 Ο κώδικας είχε διάφορες αδυναμίες, για παράδειγμα δεν ελέγχεις πότε τελειώνει η ανάγνωση του αρχείου (EOF) μέσο της fgets. Δεν ελέγχεις αν το strtok έχει φτάσει στο τέλος του (NULL), πριν δώσεις τα αποτελέσματα του στην atoi εξ’ ου και το Segmentation fault. Ο buffer[72] θα έπρεπε να ήταν [73] ή ακόμα καλύτερα μια αρκετά μεγάλη τιμή όπως BUFSIZ (που δηλώνεται στο stdio.h) για να μην παίζεις στην «κόψη του ξυραφιού» με το μέγεθος κάθε γραμμής. Αναρτώ τον κώδικα σου μετατρεμμένο (αλλά όχι ξανά γραμμένο) έτσι ώστε να παίζει με το αρχείο lab1.dat που ανάρτησες (και μόνο – δεν έχω χρόνο το δοκιμάσω περαιτέρω - ούτε έχει νόημα). Γενικά, καλό θα ήταν να το έγραφες από την αρχή λαμβάνοντας υπόψη σου το πώς λειτουργεί η strtok. Τέλος βάλε και μερικά free στην έξοδο (είθισται να αποδεσμεύουμε ότι δεσμεύουμε ακόμα και αν το OS το κάνει, σήμερα, για εμάς). Καλή τύχη. Πρόγραμμα: > #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[73]; FILE *lab1; lab1=fopen("lab1.dat","r"); if(lab1==NULL) printf("Error: can't open file lab1.dat .\n"); for(i=0; i<rows; ) { char *pszToken = NULL; if(fgets(buffer,73,lab1) == NULL) /* EOF? */ break; if(buffer[0] == '\n') /* Skip \n terminator */ continue; if((pszToken = strtok(buffer, separator)) != NULL) { for(j=0; j<columns; j++) { int n; n = atoi(pszToken); Array[i][j] = n; printf("Array[%.2d][%.2d] = %d\n", i, j, n); if((pszToken = strtok(NULL, separator)) == NULL) break; } } i++; /* Next ROW position */ } 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); } Είσοδος: > 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 Έξοδος: > Array[00][00] = 0 Array[00][01] = 0 Array[00][02] = -5 Array[00][03] = 0 Array[00][04] = 0 Array[00][05] = 0 Array[00][06] = 0 Array[00][07] = 12 Array[00][08] = 0 Array[00][09] = 0 Array[00][10] = 0 Array[00][11] = 0 Array[00][12] = 3 Array[00][13] = 0 Array[00][14] = 0 Array[00][15] = 0 Array[00][16] = 0 Array[00][17] = 0 Array[01][00] = 0 Array[01][01] = 0 Array[01][02] = 0 Array[01][03] = 0 Array[01][04] = 0 Array[01][05] = 0 Array[01][06] = 0 Array[01][07] = 0 Array[01][08] = 0 Array[01][09] = 9 Array[01][10] = 0 Array[01][11] = 0 Array[01][12] = 0 Array[01][13] = 0 Array[01][14] = 0 Array[01][15] = 0 Array[01][16] = 0 Array[01][17] = 0 Array[02][00] = 0 Array[02][01] = 0 Array[02][02] = 31 Array[02][03] = 0 Array[02][04] = 0 Array[02][05] = 0 Array[02][06] = 0 Array[02][07] = 0 Array[02][08] = 0 Array[02][09] = 0 Array[02][10] = 0 Array[02][11] = 0 Array[02][12] = 0 Array[02][13] = 0 Array[02][14] = -3 Array[02][15] = 0 Array[02][16] = 0 Array[02][17] = 0 Array[03][00] = 0 Array[03][01] = 0 Array[03][02] = 4 Array[03][03] = 0 Array[03][04] = 6 Array[03][05] = 0 Array[03][06] = 0 Array[03][07] = 0 Array[03][08] = 0 Array[03][09] = 0 Array[03][10] = 0 Array[03][11] = 0 Array[03][12] = 0 Array[03][13] = 0 Array[03][14] = 0 Array[03][15] = 0 Array[03][16] = 0 Array[03][17] = 0 Array[04][00] = 0 Array[04][01] = 0 Array[04][02] = 0 Array[04][03] = 0 Array[04][04] = 0 Array[04][05] = 0 Array[04][06] = 0 Array[04][07] = 0 Array[04][08] = 0 Array[04][09] = 0 Array[04][10] = 15 Array[04][11] = 0 Array[04][12] = 0 Array[04][13] = 0 Array[04][14] = 0 Array[04][15] = 0 Array[04][16] = 0 Array[04][17] = 0 Array[05][00] = 17 Array[05][01] = 0 Array[05][02] = 0 Array[05][03] = 0 Array[05][04] = 0 Array[05][05] = 0 Array[05][06] = 0 Array[05][07] = 0 Array[05][08] = 0 Array[05][09] = 0 Array[05][10] = 0 Array[05][11] = 0 Array[05][12] = 0 Array[05][13] = 0 Array[05][14] = 0 Array[05][15] = 0 Array[05][16] = 0 Array[05][17] = 0 Array[06][00] = 0 Array[06][01] = 0 Array[06][02] = 0 Array[06][03] = 14 Array[06][04] = 0 Array[06][05] = 0 Array[06][06] = 0 Array[06][07] = 0 Array[06][08] = 0 Array[06][09] = 0 Array[06][10] = 0 Array[06][11] = 0 Array[06][12] = 0 Array[06][13] = 0 Array[06][14] = 0 Array[06][15] = 7 Array[06][16] = 0 Array[06][17] = 0 Array[07][00] = 0 Array[07][01] = 0 Array[07][02] = 0 Array[07][03] = 0 Array[07][04] = 0 Array[07][05] = -10 Array[07][06] = 0 Array[07][07] = 0 Array[07][08] = 0 Array[07][09] = 0 Array[07][10] = 0 Array[07][11] = 0 Array[07][12] = 0 Array[07][13] = 0 Array[07][14] = 0 Array[07][15] = 0 Array[07][16] = 0 Array[07][17] = 0 Array[08][00] = 0 Array[08][01] = 0 Array[08][02] = 0 Array[08][03] = 0 Array[08][04] = 0 Array[08][05] = 0 Array[08][06] = 0 Array[08][07] = 0 Array[08][08] = 0 Array[08][09] = 0 Array[08][10] = 0 Array[08][11] = 12 Array[08][12] = 0 Array[08][13] = 0 Array[08][14] = 0 Array[08][15] = 0 Array[08][16] = 6 Array[08][17] = 0 Array[09][00] = 0 Array[09][01] = 0 Array[09][02] = 0 Array[09][03] = 0 Array[09][04] = 0 Array[09][05] = 0 Array[09][06] = 8 Array[09][07] = 0 Array[09][08] = 0 Array[09][09] = -1 Array[09][10] = 0 Array[09][11] = 0 Array[09][12] = 0 Array[09][13] = 0 Array[09][14] = 0 Array[09][15] = 0 Array[09][16] = 0 Array[09][17] = 0 Array[10][00] = 0 Array[10][01] = 0 Array[10][02] = 0 Array[10][03] = 0 Array[10][04] = 0 Array[10][05] = 10 Array[10][06] = 0 Array[10][07] = 0 Array[10][08] = 0 Array[10][09] = 0 Array[10][10] = 0 Array[10][11] = 0 Array[10][12] = 0 Array[10][13] = 0 Array[10][14] = 0 Array[10][15] = 0 Array[10][16] = 16 Array[10][17] = 0 Array[11][00] = 0 Array[11][01] = 21 Array[11][02] = 0 Array[11][03] = 0 Array[11][04] = 0 Array[11][05] = 0 Array[11][06] = 0 Array[11][07] = 0 Array[11][08] = 0 Array[11][09] = 0 Array[11][10] = 0 Array[11][11] = 0 Array[11][12] = 11 Array[11][13] = 0 Array[11][14] = 0 Array[11][15] = 0 Array[11][16] = 0 Array[11][17] = 0 Array[12][00] = 0 Array[12][01] = 0 Array[12][02] = 0 Array[12][03] = 0 Array[12][04] = 0 Array[12][05] = 0 Array[12][06] = 0 Array[12][07] = 0 Array[12][08] = -8 Array[12][09] = 0 Array[12][10] = 0 Array[12][11] = 25 Array[12][12] = 0 Array[12][13] = 0 Array[12][14] = 0 Array[12][15] = 0 Array[12][16] = 0 Array[12][17] = 0 Array[13][00] = 4 Array[13][01] = 0 Array[13][02] = 0 Array[13][03] = 0 Array[13][04] = 0 Array[13][05] = 0 Array[13][06] = 0 Array[13][07] = 0 Array[13][08] = 0 Array[13][09] = 0 Array[13][10] = 0 Array[13][11] = 0 Array[13][12] = 0 Array[13][13] = 1 Array[13][14] = 0 Array[13][15] = 0 Array[13][16] = 0 Array[13][17] = 20 Array[14][00] = 0 Array[14][01] = 0 Array[14][02] = 0 Array[14][03] = 5 Array[14][04] = 0 Array[14][05] = 0 Array[14][06] = 0 Array[14][07] = 0 Array[14][08] = 0 Array[14][09] = 0 Array[14][10] = 0 Array[14][11] = 0 Array[14][12] = 0 Array[14][13] = 0 Array[14][14] = 0 Array[14][15] = 0 Array[14][16] = 0 Array[14][17] = 0
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.