problème d'erreur de segmentation

problème d'erreur de segmentation - C - Programmation

Marsh Posté le 03-03-2005 à 08:47:25    

Bonjour,  
je cherche à transferer des éléments d'un fichier .txt dans un tableau Le programme marche très bien jusqu'à DIMENSION = 700 le problème c'est que j'ai besoin d'un tableau 1000*1000 et avec DIMENSION, au moment de l'appel il m'affiche une erreur de segmentation... je ne comprend pas trop..
 
les 2 premières lignes du fichier .txt sont inutiles pour le tableau d'où les 2 fgets
 
le code:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define DIMENSION 1000
  4. void initCarte(char *fname)
  5. {
  6.    FILE  * fp;
  7.    int i,j;
  8.    int carte[DIMENSION][DIMENSION];
  9.    static char     strProvi[400];
  10.  
  11.    if ((fp = fopen(fname,"r" )) == NULL)
  12.    {
  13.       printf("Impossible d'ouvrir le fichier : %s\n",fname);
  14.       exit(1);
  15.    }
  16.  
  17.    puts("Lecture du fichier (+ de 20 secondes)." );                                     
  18.     fgets (strProvi, 10, fp);
  19.     fgets (strProvi, 10, fp);
  20.  
  21.    for(i = 0; i < DIMENSION; i++)
  22.    { 
  23.       for(j = 0; j < DIMENSION; j++)
  24.       {
  25.          fscanf(fp,"%d",&carte[i][j]);
  26.          if (carte[i][j]==255)
  27.          {
  28.                   carte[i][j]=0;
  29.          }
  30.          if (carte[i][j]==2)
  31.          {
  32.                   carte[i][j]=1;
  33.          }
  34.          if (carte[i][j]==251)
  35.          {
  36.                   carte[i][j]=2;
  37.          }                       
  38.       }
  39.    }
  40.    fclose(fp); 
  41.    for (int i = 0;i<DIMENSION;i++){
  42.         fprintf(stderr,"\n" ); 
  43.         for (int j =0;j<DIMENSION;j++)
  44.             fprintf(stderr,"%d ", carte[i][j]);
  45.     }     
  46.    
  47. int main(int argc, char *argv[])
  48. {
  49.    
  50.                                                                
  51.     initCarte("pat50.txt" );             
  52. }

Reply

Marsh Posté le 03-03-2005 à 08:47:25   

Reply

Marsh Posté le 03-03-2005 à 09:09:52    

man malloc

Reply

Marsh Posté le 03-03-2005 à 09:22:22    

Taz a écrit :

man malloc


Au risque de passer pour un boulet comment je l'utilise?

Reply

Marsh Posté le 03-03-2005 à 09:25:17    

seldon1 a écrit :

Au risque de passer pour un boulet comment je l'utilise?


 
il faut installer linux [:greenleaf]

Reply

Marsh Posté le 03-03-2005 à 09:37:19    

seldon1 a écrit :

Au risque de passer pour un boulet comment je l'utilise?


tu vas dans google et tu tapes 'man malloc'

Reply

Marsh Posté le 03-03-2005 à 09:44:32    

Taz a écrit :

tu vas dans google et tu tapes 'man malloc'


 ???
Linux c'est bien je suis d'accord...
Mais dévelloper sous windoz est également possible...
Ma question etait plutôt comment utiliser malloc (le code quoi..)...

Reply

Marsh Posté le 03-03-2005 à 10:16:15    

ben tu l'utilises comme marqué dans la documentation. malloc étant standard (norme ANSI) tu la trouveras partout.

Reply

Marsh Posté le 03-03-2005 à 11:18:44    

man est dispo online sinon :o
Et il y a aussi la msdn online :o

Reply

Marsh Posté le 03-03-2005 à 11:30:30    

faut que je vienne taper 'malloc exemple' dans ton google ou quoi :o


Message édité par Taz le 03-03-2005 à 11:30:39
Reply

Marsh Posté le 03-03-2005 à 11:46:15    

Taz a écrit :

faut que je vienne taper 'malloc exemple' dans ton google ou quoi :o


si possible avec un café...

Reply

Marsh Posté le 03-03-2005 à 11:46:15   

Reply

Marsh Posté le 03-03-2005 à 12:19:17    

Bon plus serieusement j'ai regardé la syntaxe de malloc mais je suis pas sur de mon coup car j'ai tjrs cette putain d'erreur de segmentation...
 
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int Char2int(char s[])
  4. {
  5.     int i,n;
  6.    
  7.     n=0;
  8.     for(i=0;s[i]>='0'&&s[i]<='9';++i)
  9.         n=10*n+(s[i]-'0');
  10.     return n;
  11. }
  12. void initCarte(int taille,char *fname)
  13. {
  14.     FILE  * fp;
  15.     int i,j;
  16.     static char     strProvi[10];
  17.     int *carte[taille][taille];
  18.    
  19.     carte[0][0]=(int*)malloc(1000 * 1000 * sizeof(int));
  20.    
  21.      puts("ok2" );
  22.      if ((fp = fopen(fname,"r" )) == NULL)
  23.      {
  24.           printf("Impossible d'ouvrir le fichier : %s\n",fname);
  25.           exit(1);
  26.      }
  27.  
  28.      puts("Lecture du fichier (+ de 20 secondes)." );                                     
  29.    fgets (strProvi, 10, fp);
  30.    fgets (strProvi, 10, fp);
  31.  
  32.    puts("ok4" );
  33.    for(i = 0; i < taille; i++)
  34.    { 
  35.       for(j = 0; j < taille; j++)
  36.       {
  37.          fscanf(fp,"%d",*carte[i][j]);
  38.          if (*carte[i][j]==255)
  39.          {
  40.                   *carte[i][j]=0;
  41.          }
  42.          if (*carte[i][j]==2)
  43.          {
  44.                   *carte[i][j]=1;
  45.          }
  46.          if (*carte[i][j]==251)
  47.          {
  48.                   *carte[i][j]=2;
  49.          }                       
  50.       }
  51.    }
  52.    fclose(fp); 
  53.    for (int i = 0;i<taille;i++){
  54.         fprintf(stderr,"\n" ); 
  55.         for (int j =0;j<taille;j++)
  56.             fprintf(stderr,"%d ", *carte[i][j]);
  57.     }     
  58.    
  59. int main(int argc, char *argv[])
  60. {
  61.     int dimension;
  62.     puts("ok1" );
  63.     puts("entrez la taille de l'environnement :" );
  64.     scanf("%d",&dimension);
  65.     initCarte(dimension,"basic.txt" );             
  66.     puts("ok4" );
  67. }

Reply

Marsh Posté le 03-03-2005 à 12:47:46    

alors :  
 
1) on ne cast pas un malloc
2) on test le retour du malloc, au cas où l'allocation mémoire serait impossible hein  [:zaib3k]
 
genre :

Code :
  1. int* v_mem = malloc(1000 * 1000 * sizeof(int));
  2. if (v_mem == null)
  3. {
  4.   puts ("Allocation mémoire impossible" );
  5.   return -1; //y'a surement une macro pour un code d'erreur normé...
  6. }
  7. else
  8. {
  9. carte[0][0]= ...
  10. ...
  11. }


 
3) Si "ok4" s'affiche, ca vient de la ligne 73 ou 37 ? :D
(le debugger c'est bien aussi hein :o )
 
4) je ne saurai te recommander la lecture de http://www.isty-info.uvsq.fr/~rume [...] c0012.html (notamment pour le free)


Message édité par ToxicAvenger le 03-03-2005 à 12:53:55
Reply

Marsh Posté le 03-03-2005 à 12:58:58    

seldon1 a écrit :

Bonjour,  

Code :
  1. #define DIMENSION 1000
  2. void initCarte(char *fname)
  3. {
  4.    int carte[DIMENSION][DIMENSION];
  5. }



Beaucoup trop gros pour la mémoire automatique... Question de bon sens...

  • Soit tu utilises un tableau statique
  • Soit tu utilises un tableau crée dynamiquement avec malloc() (1 dimension de 1000 x 1000 avec accès calculé, ou un tableau de 1000 pointeurs sur des tableaux de 1000 avec accès [x][y]. Lire la FAQ...)


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 03-03-2005 à 13:40:52    

fscanf(fp,"%d",*carte[i][j]);
 
.... compile avec des warnings et reviens

Reply

Marsh Posté le 03-03-2005 à 13:55:30    

seldon1 a écrit :

Bon plus serieusement j'ai regardé la syntaxe de malloc mais je suis pas sur de mon coup car j'ai tjrs cette putain d'erreur de segmentation...

Code :
  1. void initCarte(int taille,char *fname)
  2.     int *carte[taille][taille];
  3.    
  4.     carte[0][0]=(int*)malloc(1000 * 1000 * sizeof(int));




Marche pas.
 Si tu veux créer un tableau linéaire de  taille x taille:


   int *carte = malloc (sizeof *carte * taille * taille);
   if (carte != NULL)
   {
   /* etc. */


par contre, après, il faut calculer l'indice i = f (x, y, taille). La fonction f() se défini facilement :

  (x * taille) + y


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-03-2005 à 23:21:53    

Pour le malloc si tu veux utiliser les tableaux deux dimentions, il y a deux methodes.
La plus simple c'est (je detaille pas tout)
pour un tableau de taille : tailleX * tailleY  

Code :
  1. int **tab; // Un pointeur vers un tableau de pointeur ^^
  2. tab = (int **) malloc(sizeof(int *) * tailleX );
  3. tab[0] = (int *) malloc(sizeof(int) * tailleX * tailleY);
  4. for(i=1;i<tailleX;i++)
  5.    tab[i] = tab[i-1] + 1;
  6. // Le tableau est alloue en memoire


 
 
Pour l'utiliser maintenant c'est comme un tableau normal: tab[i][j] = .... :bounce:

Reply

Marsh Posté le 07-03-2005 à 08:56:21    

Ok merci pour ta réponse!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed