Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1422 connectés 

  FORUM HardWare.fr
  Programmation
  C

  problème d'erreur de segmentation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problème d'erreur de segmentation

n°999165
seldon1
Posté le 03-03-2005 à 08:47:25  profilanswer
 

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. }

mood
Publicité
Posté le 03-03-2005 à 08:47:25  profilanswer
 

n°999183
Taz
bisounours-codeur
Posté le 03-03-2005 à 09:09:52  profilanswer
 

man malloc

n°999196
seldon1
Posté le 03-03-2005 à 09:22:22  profilanswer
 

Taz a écrit :

man malloc


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

n°999199
ToxicAveng​er
Posté le 03-03-2005 à 09:25:17  profilanswer
 

seldon1 a écrit :

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


 
il faut installer linux [:greenleaf]

n°999211
Taz
bisounours-codeur
Posté le 03-03-2005 à 09:37:19  profilanswer
 

seldon1 a écrit :

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


tu vas dans google et tu tapes 'man malloc'

n°999220
seldon1
Posté le 03-03-2005 à 09:44:32  profilanswer
 

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..)...

n°999251
Taz
bisounours-codeur
Posté le 03-03-2005 à 10:16:15  profilanswer
 

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

n°999344
ToxicAveng​er
Posté le 03-03-2005 à 11:18:44  profilanswer
 

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

n°999360
Taz
bisounours-codeur
Posté le 03-03-2005 à 11:30:30  profilanswer
 

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


Message édité par Taz le 03-03-2005 à 11:30:39
n°999381
seldon1
Posté le 03-03-2005 à 11:46:15  profilanswer
 

Taz a écrit :

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


si possible avec un café...

mood
Publicité
Posté le 03-03-2005 à 11:46:15  profilanswer
 

n°999423
seldon1
Posté le 03-03-2005 à 12:19:17  profilanswer
 

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. }

n°999455
ToxicAveng​er
Posté le 03-03-2005 à 12:47:46  profilanswer
 

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
n°999461
Emmanuel D​elahaye
C is a sharp tool
Posté le 03-03-2005 à 12:58:58  profilanswer
 

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/
n°999516
Taz
bisounours-codeur
Posté le 03-03-2005 à 13:40:52  profilanswer
 

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

n°999531
Emmanuel D​elahaye
C is a sharp tool
Posté le 03-03-2005 à 13:55:30  profilanswer
 

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/
n°1002219
Twinsens
Posté le 05-03-2005 à 23:21:53  profilanswer
 

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:

n°1003223
seldon1
Posté le 07-03-2005 à 08:56:21  profilanswer
 

Ok merci pour ta réponse!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  problème d'erreur de segmentation

 

Sujets relatifs
Problème de chargement d'images sur Rollover avec IEProblème mysql_query
[MFC/C++] Problème d'initialisation de CListCtrlProblème d'agrégation
Probleme fermeture application si fenetres ouvertes ....[JAVA] Probleme de conversion de String en Date?
problème gestion panier php[c# / .NET][résolu] erreur sur Application.Exit()
[C++/SQL./Oracle] Juste un petit problème de chaine...[VisualC++ 6] Help ! Version Win32 release tombe en erreur
Plus de sujets relatifs à : problème d'erreur de segmentation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR