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

  FORUM HardWare.fr
  Programmation
  C++

  ERREUR SEGMENTATION CORE DUMPED

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

ERREUR SEGMENTATION CORE DUMPED

n°2270053
axelle3003
Posté le 21-11-2015 à 13:37:37  profilanswer
 

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
 

mood
Publicité
Posté le 21-11-2015 à 13:37:37  profilanswer
 

n°2270063
gilou
Modérateur
Modzilla
Posté le 22-11-2015 à 00:29:12  profilanswer
 

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é!  --
n°2270065
axelle3003
Posté le 22-11-2015 à 09:00:55  profilanswer
 

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

n°2270075
caps lock
Posté le 22-11-2015 à 18:26:14  profilanswer
 

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


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

  ERREUR SEGMENTATION CORE DUMPED

 

Sujets relatifs
FreeMem() provoque une erreur sans plantageErreur SQL ( Oracle ) 00936
Erreur 183 sur un CopyFile()erreur code php pour accès localhost
[SQL Server] Insert - erreur "Illegal data"Automate & Minimisation - ou est l'erreur ?
erreur php génère 404 et non inscription avec MLMScript Wheel mouse, éviter les erreur de scroll
VBA erreur dépassement de capacité bizarre[ C ] Erreur de segmentation (core dumped)
Plus de sujets relatifs à : ERREUR SEGMENTATION CORE DUMPED


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