Προς το περιεχόμενο

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


Amadeus7

Προτεινόμενες αναρτήσεις

Δημοσ.

Γειά και χαρά σας παίδες. Παλεύω να γράψω ένα προγραμματάκι αλλά μου πετάει 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

 

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

Δημοσ.
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);
}

Δημοσ.

Ο κώδικας είχε διάφορες αδυναμίες, για παράδειγμα δεν ελέγχεις πότε τελειώνει η ανάγνωση του αρχείου (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

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

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