ERREUR SEGMENTATION CORE DUMPED

ERREUR SEGMENTATION CORE DUMPED - C++ - Programmation

Marsh Posté le 21-11-2015 à 13:37:37    

Bonjour,  
Je souhaiterais comprendre un programme qui s’exécute très bien sur un premier ordinateur mais ne peut pas s''exécuter sur un autre ordinateur de même environnement.
En effet, après avoir compiler et exécuter un programme, j'ai copié ce dernier via une clé sur mon ordinateur. Je l'ai compilé, tout se passe bien mais lorsque je veux l’exécuter, Le message d'erreur est "ERREUR SEGMENTATION (core dumped).
J'ai essayé d’autres programme qui fonctionnaient déjà sur mon ordinateur et tout va bien.
Quelqu'un aurait une idée ?
Je vous joins mon programme qui se lit via un fichier de structure et un fichier de fonction et qui est incrémenté par un fichier texte de données.
 
Fichier "liste_structures.h"
 

Code :
  1. typedef struct espece {
  2. char nom_espece[20];
  3. } ESPECE;
  4. typedef struct historique {
  5. int* abondance_sp;
  6. float biomasse_totale;
  7. float cout_total;
  8. struct historique* nxt;
  9. } HIST;
  10. typedef struct choix_espece {
  11.  char nom[20];
  12.  int nb_choix;
  13. struct choix_espece *nxt;
  14. } CE;
  15. /*typedef struct result_ab {
  16. int* abondance;
  17. } RES;*/
  18. typedef struct statistiques {
  19. float moyenne;
  20. float var;
  21. int val_max;
  22. int val_min;
  23. } STAT;
  24. typedef struct Etat_Initial {
  25. int nb_sp;
  26. ESPECE* tab_espece;
  27. int* abondances;
  28. int* seuil;
  29. int* seuil_critique;
  30. float* biomasse;
  31. float* cout;
  32. float Bio_tot;
  33. float Cout_tot;
  34. float** interactions;
  35. } EI;



Fichier Fonctions "creer_etat.c"

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "liste_structures.h"
  5. EI creer_etat(EI etat)
  6. {
  7. int nb_sp, i, j;
  8. FILE *milieu_marin;
  9. milieu_marin = fopen ("fichier_test2.txt","r" );
  10. /* Je scanne d'abord le premier nombre qui est le nombre d'espèces dans le milieu */
  11. fscanf(milieu_marin,"%d",&etat.nb_sp);
  12. nb_sp = etat.nb_sp;
  13. etat.tab_espece = (ESPECE*)malloc(nb_sp*sizeof(ESPECE));
  14. etat.abondances = (int*)malloc(nb_sp*sizeof(int));
  15. etat.seuil = (int*)malloc(nb_sp*sizeof(int));
  16. etat.seuil_critique = (int*)malloc(nb_sp*sizeof(int));
  17. etat.biomasse = (float*)malloc(nb_sp*sizeof(float));
  18. etat.cout = (float*)malloc(nb_sp*sizeof(float));
  19. etat.interactions = (float**)malloc(nb_sp*sizeof(float));
  20. float** temp = etat.interactions;
  21. for (i=0; i<nb_sp; i++)
  22. {
  23. *temp = (float*)malloc(nb_sp*sizeof(float));
  24. temp++;
  25. }
  26. for (i=0; i<nb_sp; i++)
  27. {
  28.  fscanf(milieu_marin,"%s", etat.tab_espece[i].nom_espece);
  29.  fscanf(milieu_marin,"%d", &etat.abondances[i]);
  30.  fscanf(milieu_marin,"%d", &etat.seuil[i]);
  31.  fscanf(milieu_marin,"%d", &etat.seuil_critique[i]);
  32.  fscanf(milieu_marin,"%f", &etat.biomasse[i]);
  33.  fscanf(milieu_marin,"%f", &etat.cout[i]);
  34.   }
  35.  fscanf(milieu_marin,"%f", &etat.Bio_tot);
  36.  fscanf(milieu_marin,"%f", &etat.Cout_tot);
  37. for (i=0; i<nb_sp; i++)
  38. {
  39.  for (j=0; j<nb_sp; j++)
  40.  {
  41.  fscanf(milieu_marin,"%f", &etat.interactions[i][j]);
  42.  }
  43. }
  44. fclose(milieu_marin);
  45. return etat;
  46. }


 
Fichier "creer_etat.h"

Code :
  1. EI creer_etat(EI etat);


 
Fichier Foncions "affiche_tableau.c"

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "liste_structures.h"
  4. int i, j;
  5. /* Fonction qui permet d'afficher les tableaux d'entiers */
  6. void aff_tab_entier(int* tableau, ESPECE* tab_sp, int nb_sp)
  7. {
  8. for (i=0; i<nb_sp; i++)
  9. printf("%s : %d\n",tab_sp[i].nom_espece, tableau[i]);
  10. }
  11. /* Fonction qui permet d'afficher les tableaux de réels*/
  12. void aff_tab_reel(float* tableau, ESPECE* tab_sp, int nb_sp)
  13. {
  14. for (i=0; i<nb_sp; i++)
  15. printf("%s : %g\n",tab_sp[i].nom_espece, tableau[i]);
  16. }
  17. /* Fonction qui permet d'afficher les tableaux de réels (double)*/
  18. void aff_tab_dbl(double* tableau, ESPECE* tab_sp, int nb_sp)
  19. {
  20. for (i=0; i<nb_sp; i++)
  21. printf("%s : %lf\n",tab_sp[i].nom_espece, tableau[i]);
  22. }
  23. /* Fonction qui permet d'afficher les matrices */
  24. void aff_matrice(float tableau[5][5])
  25. {
  26. ESPECE tab_espece[5]= {"Phytoplancton", "Crevettes", "Maquereaux", "Requins", "Oursins"};
  27. for (i=0; i<5; i++)
  28. {
  29. for (j=0; j<5; j++){
  30.  if (tab_espece[i].nom_espece != tab_espece[j].nom_espece)
  31.  printf("%s -> %s = %.1f\n",tab_espece[i].nom_espece, tab_espece[j].nom_espece, tableau[i][j]);}
  32. printf("\n" );
  33. }
  34. }


 
Fichier "affiche_tableau.h"

Code :
  1. void aff_tab_entier(int* tableau, ESPECE* tab_sp, int nb_sp);
  2. void aff_tab_reel(float* tableau, ESPECE* tab_sp, int nb_sp);
  3. void aff_tab_dbl(double* tableau, ESPECE* tab_sp, int nb_sp);


 
Mon programme Principal "test2.c

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "liste_structures.h"
  5. #include "affiche_tableau.h"
  6. #include "creer_etat.h"
  7. int main()
  8. {
  9. EI etat;
  10. int i, j;
  11. etat = creer_etat(etat);
  12. aff_tab_entier (etat.abondances, etat.tab_espece, etat.nb_sp);
  13. aff_tab_entier (etat.seuil, etat.tab_espece, etat.nb_sp);
  14. aff_tab_entier (etat.seuil_critique, etat.tab_espece, etat.nb_sp);
  15. aff_tab_reel (etat.biomasse, etat.tab_espece, etat.nb_sp);
  16. aff_tab_reel (etat.cout, etat.tab_espece, etat.nb_sp);
  17. for (i=0; i<etat.nb_sp; i++)
  18. {
  19. for (j=0; j<etat.nb_sp; j++){
  20.  if (etat.tab_espece[i].nom_espece != etat.tab_espece[j].nom_espece)
  21.  printf("%s -> %s = %.1f\n",etat.tab_espece[i].nom_espece, etat.tab_espece[j].nom_espece, etat.interactions[i][j]);}
  22. printf("\n" );
  23. }
  24. return 0;
  25. }


 
Pour finir mon fichier de données "Fichier_test2.txt"

Code :
  1. 8
  2. Phytoplancton 10000000 5000 800 0.00001 0.000001
  3. Crevettes 100000 1000 200 12 2
  4. Maquereaux 2500 500 100 750 50
  5. Requins 100 20 5 1000000 200
  6. Oursins 7000 3000 70 40 15
  7. Coral 10000000 5000 800 0.00001 0.000001
  8. Algues 100000 1000 200 12 2
  9. Bigorneaux 2500 500 100 750 50
  10. 0
  11. 0
  12. 0 1 -0.4 -0.1 0.1 2 2 2
  13. -0.4 0 1 -0.3 -0.4 2 2 2
  14. 0.3 -0.5 0 1 -0.1 2 2 2
  15. -0.5 -0.3 -0.5 0 0.3 2 2 2
  16. -0.1 -0.4 -0.2 -0.9 0 2 2 2
  17. 2 2 2 2 2 2 2 2
  18. 2 2 2 2 2 2 2 2
  19. 2 2 2 2 2 2 2 2


 
MErci d'avance pour votre aide.
Axelle
 

Reply

Marsh Posté le 21-11-2015 à 13:37:37   

Reply

Marsh Posté le 22-11-2015 à 00:29:12    

Je subodore que l'une des machines est en 32 bits et l'autre en 64, non?
J'ai survolé brièvement le code, mais à vue de nez ce devrait être ceci la ligne fautive, je pense:
etat.interactions = (float**)malloc(nb_sp*sizeof(float));
a remplacer par
etat.interactions = (float**)malloc(nb_sp*sizeof(float*));
 
 
En général (mais la norme ne l'impose pas je pense) sizeof(float) = 4 (32 bits) pour rester compatible avec la norme IEEE-754
Par contre, en 32 bits, sizeof(float*) = 4 (32 bits) (comme tout pointeur)
Mais en 64 bits, sizeof(float*) = 8 (64 bits) (comme tout pointeur)
Et donc si par chance l'allocation marchait bien en 32 bits, elle ne va pas marcher en 64 bits, et a la moitié des allocations, a cette ligne la:
*temp = (float*)malloc(nb_sp*sizeof(float));
on devrait déborder de la zone allouée à l'allocation de etat.interactions
 
Bon, ma machine en 64 bits est pas dispo pour l'instant pour tester cela.
 
Sinon, une petite remarque: il serait plus efficace de modifier creer_etat afin que sa signature soit void creer_etat(EI *etat) et passer la structure par adresse à l'appel, parce que la vous passer la structure par copie à l'appel et au retour.
 
A+,


Message édité par gilou le 22-11-2015 à 00:42:05

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 22-11-2015 à 09:00:55    

Bonjour Gilou,
Merci beaucoup pour ton aide. C'était bien le problème. Ma machine est en effet en 64 bits. Le rajout du pointeur dans la ligne indiquée a résolu le problème.
Pour une première demande d'aide sur un forum, je suis vraiment ravie.
Merci beaucoup aussi pur ton aide sur la remarque faite, la version affichée ici était un test pour savoir si notre fonction creer-etat s'executait. Nous avons bien l'intention de passer la fonction creer_etat en procédure et faire appel au fichier de données en argument lors de l’exécution du programme.
 
Encore merci beaucoup.
Bonne continuation.
Axelle

Reply

Marsh Posté le 22-11-2015 à 18:26:14    

[:implosion du tibia] Je n'avais pas trouvé

Reply

Sujets relatifs:

Leave a Replay

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