Problème en compilation avec c++....

Problème en compilation avec c++.... - C++ - Programmation

Marsh Posté le 22-04-2003 à 09:59:32    

Bon voila, je dois rendre un projet qui consiste à faire un carnet d'adresse sous C++, on doit aussi pouvoir extraire des adresses mail d'un texte mais bon j'en suis pas encore là....
 
Le prob c'est que là mon prog ne marche pas chez moi alors qu'à l'école je pouvais l'exécuter, peut être est-ce parce ke j'ai installé une bibliothèque de mon école. Enfin lors de l'éxécution j'ai le mess : "ce prog va être arreter car opération non conforme etc....." savez vous pkoi ???
Voici ce ke j'ai fait jusqu'à présent :
 
#include "stdafx.h"
#include "math.h"
#include "biblio.h"
#include "iostream.h"
#include "string.h"
 
 
 
 
typedef struct  
{
 char ident[30];
 int tcontact;
 char nom[20];
 char pre[20];
 char adr[100];
 char ville[20];
 int cp;
 char pays[20];
 char boite[30];
 char heb[10];
 char ext[5];
 int valide;
} contact;
 
void sauvez_sur_fichier(contact*carnet,int dim)
{
 FILE*fichier;
 fichier=fopen("projet info","w+" );
 fwrite(carnet,sizeof(contact),dim,fichier);
 fclose(fichier);
}
 
void lire_sur_fichier(contact*carnet,int dim)
{
 FILE*fichier;
 int num;
 fichier=fopen("projet info","r+" );
 num=fread(carnet,sizeof(contact),dim,fichier);
 cout<<num<<endl;
 fclose(fichier);
}
 
 
/* Fonction servant à saisir chaque champ de la zone pointée */
 
void saisie(contact *pt)
{
 cout<<"Identificateur"<<endl<<flush;
 cin>>(*pt).ident;
 //cout<<"Type de contact"<<endl<<flush;
 //cin>>(*pt).tcontact;
 cout<<"Nom"<<endl<<flush;
 cin>>(*pt).nom;
 cout<<"Prenom"<<endl<<flush;
 cin>>(*pt).pre;
 //cout<<"Adresse"<<endl<<flush;
 //cin>>(*pt).adr;
 //cout<<"Ville"<<endl<<flush;
 //cin>>(*pt).ville;
 //cout<<"Code postal"<<endl<<flush;
 //cin>>(*pt).cp;
 //cout<<"Pays"<<endl<<flush;
 //cin>>(*pt).pays;
 //cout<<"Pays"<<endl<<flush;
 //cin>>(*pt).pays;
 cout<<"Boite"<<endl<<flush;
 cin>>(*pt).boite;
 cout<<"Hebergeur"<<endl<<flush;
 cin>>(*pt).heb;
 cout<<"Ext"<<endl<<flush;
 cin>>(*pt).ext;
 //cout<<"Validite "<<endl<<flush;
 (*pt).valide=1;
 
}
 
void initialisation(contact carnet[],int l)
{
 int i;
 for (i=0;i<l;i++)
 {
  carnet[i].tcontact=-1;
  strcpy(carnet[i].ident , "" );
  strcpy(carnet[i].boite ,"" );
  strcpy(carnet[i].heb , "" );
  strcpy(carnet[i].ext , "" );
  carnet[i].valide=0;
 }
}
 
 
 void affstr(contact *pt)
{
 
 cout<<"NOM          "<<(*pt).nom<<endl<<flush;
 cout<<"PRENOM          "<<(*pt).pre<<endl<<flush;
 cout<<"BOITE E-MAIL          "<<(*pt).boite<<"@"<<(*pt).heb<<"."<<(*pt).ext<<endl<<flush;
 
}
 
 
 
void vider_le_tableau(contact t[], int dim)   /* ne sert à rien car la fct affstr le fait déjà*/
{
 
 int i;
 for (i=0;i<dim;i++)
 {
  t[i].valide=0;
 }
}
 
int validation (contact *pt)    /* Fonction pour savoir s'il y a ou non un contact dans une case donnée */
 
{ int c;
 c=0;
 do
 {
  c=c+1;
 }while((*pt).valide==1);
 return c;
 
}
 
 
 
 
 
void affichage (contact carnet[],int a)     /* Fonction qui sert à afficher les contacts */
 { int i;
 for(i=0;i<a;i++)
 {
  if (carnet[i].valide!=0)
  {
   cout<<carnet[i].ident<<endl;
   cout<<carnet[i].boite<<"@";
   cout<<carnet[i].heb<<".";
   cout<<carnet[i].ext<<endl;
 
 
  }
 }
}
 
void modifier (contact t[], int dimension)
 {
  contact *pt;
  char nom[100];
  int i,a;
  pt=t;
  cout<<"entrez le nom de la personne que vous souhaitez modifier"<<endl;
  cin>>nom;
  i=0;
  while (strcmp(nom,(*pt).ident)!=0)  /*  strcmp est un outil de comparaison (voir cours)  
  Tant que le nom qu'on a entré et le nom que l'on veut modifier sont différents, on passe dans la boucle  */
   {
    pt++;
    i=i+1;
   };
 
 cout<<"Taper le numéro correspondant au menu pour lequel vous souhaitez modifier quelque chose."<<endl;
 cout<<"1 - Identification"<<endl ;
 cout<<"2 - Boite"<<endl ;
 cout<<"3 - Hebergeur"<<endl;
 cout<<"4 - Ext"<<endl;
 
 cin>>a;
 
 switch(a)
 {
 case 1:
  {
   char  nom[30];
   cout<<"Entrer le nouveau nom"<<endl;
   cin>>nom;
   strcpy((*pt).ident,"nom" );
  break;
  }
 case 2:
  {
   char  boite[10];
   cout<<"Entrer la nouvelle boite e-mail"<<endl;
   cin>>boite;
   strcpy((*pt).ident,"boite" );
  break;
  }
 case 3:
  {
   char heb[20];
   cout<<"Entrer le nouvel hébergeur correspondant à votre boite mail"<<endl;
   cin>>heb;
   strcpy((*pt).ident,"heb" );
  break;
  }
 case 4:
  {
   char ext[5];
   cout<<"Entrer l'extension de votre voite mail"<<endl;
   cin>>ext ;
   strcpy((*pt).ext,"ext" ) ;
 
  break;
  }
 }
 
   
     
   
 }
 
 
 
int menu(contact carnet[], int dim)
{
 cout<<"QUE VOULEZ VOUS FAIRE ?"<<endl;
 cout<<" 0 - Sortir du programme"<<endl;
 cout<<" 1 - Saisir un nouveau contact"<<endl;
 cout<<" 2 - Affichage "<<endl;
 cout<<" 3 - Modifier "<<endl;
 cout<<" 4 - Suppression d'un nouveau contact "<<endl;
 cout<<" 5 - Suppression d'un doublon "<<endl;
 
 int n;
 cin>>n;
 switch(n)
 {
 
 
 case 0:
  {
   break;
  }
 
 case 1:
  {
   saisie (carnet+1);
   break;
  }
 case 2:
  {
   affichage(carnet+1,100);
   break;
  }
 case 3:
  {
   modifier(carnet+1,100);
   break;
  }
 }
 case 4 :
  {
   supprimer(carnet+1,100);
   break;
  }
 return n;
}
 
 
 
 
 
 
 
 
 
 
void supprimer (contact t[], int dim)   /* Fonction servant à supprimer un contact */
 {
  contact *pt;
  char nom[100];
  int i;
  pt=t;
  cout<<"Entrer le nom de la personne que vous souhaitez supprimer de votre liste de contacts"<<endl;
  cin>>nom;
  i=0;
  while (strcmp(nom,(*pt).ident)!=0)  
   {
    pt++;
    i=i+1;
   };
   
 (*(pt)).valide=0;
   
     
   
 }
 
 
 
 
 
 
 
 
void main()
{
 
 
 
 
 
 
 contact carnet[100];
 
// vider_le_tableau(carnet,100);  
 initialisation(carnet,100);
 
 
 lire_sur_fichier(carnet,100);
 
 
 int n;
 
 do  
 {
  n=menu(carnet,5);
 
 }
 while (n != 0);
 
 
 
 
 sauvez_sur_fichier(carnet,100);
 
 
 
 
 
 
 
 
 
}
 
 
 


---------------
Be myself, I have nothing to prove...
Reply

Marsh Posté le 22-04-2003 à 09:59:32   

Reply

Marsh Posté le 22-04-2003 à 10:08:08    

Je comprend pas j'arrive à le compiler, mais lors de l'éxécution voici ce ke j'ai :
PROJECT INFO SPé a causé une défaillance de page dans
 le module PROJECT INFO SPé.EXE à 0167:0040248c.
Registres :
EAX=00000000 CS=0167 EIP=0040248c EFLGS=00010202
EBX=00560000 SS=016f ESP=006692c8 EBP=006692ec
ECX=00006a40 DS=016f ESI=8168eb68 FS=4dff
EDX=00006a40 ES=016f EDI=00669358 GS=0000
Octets à CS : EIP :
8b 48 0c 81 e1 0c 01 00 00 85 c9 74 0b 8b 55 14  
État de la pile :
0042e2d8 00669358 8168eb68 00560000 00000000 00006a40 00006a40 006693b8 0042a01c 00669358 00401173 006693b8 00000110 00000064 00000000 0066fdf8  
 


---------------
Be myself, I have nothing to prove...
Reply

Marsh Posté le 22-04-2003 à 10:13:40    

Ca ressemble à un pb de mémoire ca...Je me permets de remttre ton code  pour le lire un peu mieux:

Code :
  1. #include "stdafx.h"
  2. #include "math.h"
  3. #include "biblio.h"
  4. #include "iostream.h"
  5. #include "string.h"
  6. typedef struct 
  7. {
  8. char ident[30];
  9. int tcontact;
  10. char nom[20];
  11. char pre[20];
  12. char adr[100];
  13. char ville[20];
  14. int cp;
  15. char pays[20];
  16. char boite[30];
  17. char heb[10];
  18. char ext[5];
  19. int valide;
  20. } contact;
  21. void sauvez_sur_fichier(contact*carnet,int dim)
  22. {
  23. FILE*fichier;
  24. fichier=fopen("projet info","w+" );
  25. fwrite(carnet,sizeof(contact),dim,fichier);
  26. fclose(fichier);
  27. }
  28. void lire_sur_fichier(contact*carnet,int dim)
  29. {
  30. FILE*fichier;
  31. int num;
  32. fichier=fopen("projet info","r+" );
  33. num=fread(carnet,sizeof(contact),dim,fichier);
  34. cout<<num<<endl;
  35. fclose(fichier);
  36. }
  37. /* Fonction servant à saisir chaque champ de la zone pointée */
  38. void saisie(contact *pt)
  39. {
  40. cout<<"Identificateur"<<endl<<flush;
  41. cin>>(*pt).ident;
  42. //cout<<"Type de contact"<<endl<<flush;  
  43. //cin>>(*pt).tcontact;  
  44. cout<<"Nom"<<endl<<flush;
  45. cin>>(*pt).nom;
  46. cout<<"Prenom"<<endl<<flush;
  47. cin>>(*pt).pre;
  48. //cout<<"Adresse"<<endl<<flush;  
  49. //cin>>(*pt).adr;  
  50. //cout<<"Ville"<<endl<<flush;  
  51. //cin>>(*pt).ville;  
  52. //cout<<"Code postal"<<endl<<flush;  
  53. //cin>>(*pt).cp;  
  54. //cout<<"Pays"<<endl<<flush;  
  55. //cin>>(*pt).pays;  
  56. //cout<<"Pays"<<endl<<flush;  
  57. //cin>>(*pt).pays;  
  58. cout<<"Boite"<<endl<<flush;
  59. cin>>(*pt).boite;
  60. cout<<"Hebergeur"<<endl<<flush;
  61. cin>>(*pt).heb;
  62. cout<<"Ext"<<endl<<flush;
  63. cin>>(*pt).ext;
  64. //cout<<"Validite "<<endl<<flush;  
  65. (*pt).valide=1;
  66. }
  67. void initialisation(contact carnet[],int l)
  68. {
  69. int i;
  70. for (i=0;i<l;i++)
  71. {
  72. carnet[i].tcontact=-1;
  73. strcpy(carnet[i].ident , "" );
  74. strcpy(carnet[i].boite ,"" );
  75. strcpy(carnet[i].heb , "" );
  76. strcpy(carnet[i].ext , "" );
  77. carnet[i].valide=0;
  78. }
  79. }
  80. void affstr(contact *pt)
  81. {
  82. cout<<"NOM          "<<(*pt).nom<<endl<<flush;
  83. cout<<"PRENOM          "<<(*pt).pre<<endl<<flush;
  84. cout<<"BOITE E-MAIL          "<<(*pt).boite<<"@"<<(*pt).heb<<"."<<(*pt).ext<<endl<<flush;
  85. }
  86. void vider_le_tableau(contact t[], int dim)   /* ne sert à rien car la fct affstr le fait déjà*/
  87. {
  88. int i;
  89. for (i=0;i<dim;i++)
  90. {
  91. t[i].valide=0;
  92. }
  93. }
  94. int validation (contact *pt)    /* Fonction pour savoir s'il y a ou non un contact dans une case donnée */
  95. { int c;
  96. c=0;
  97. do
  98. {
  99. c=c+1;
  100. }while((*pt).valide==1);
  101. return c;
  102. }
  103. void affichage (contact carnet[],int a)     /* Fonction qui sert à afficher les contacts */
  104. { int i;
  105. for(i=0;i<a;i++)
  106. {
  107. if (carnet[i].valide!=0)
  108. {
  109.   cout<<carnet[i].ident<<endl;
  110.   cout<<carnet[i].boite<<"@";
  111.   cout<<carnet[i].heb<<".";
  112.   cout<<carnet[i].ext<<endl;
  113. }
  114. }
  115. }
  116. void modifier (contact t[], int dimension)
  117. {
  118. contact *pt;
  119. char nom[100];
  120. int i,a;
  121. pt=t;
  122. cout<<"entrez le nom de la personne que vous souhaitez modifier"<<endl;
  123. cin>>nom;
  124. i=0;
  125. while (strcmp(nom,(*pt).ident)!=0)  /*  strcmp est un outil de comparaison (voir cours)   
  126. Tant que le nom qu'on a entré et le nom que l'on veut modifier sont différents, on passe dans la boucle  */
  127.   {
  128.    pt++;
  129.    i=i+1;
  130.   };
  131. cout<<"Taper le numéro correspondant au menu pour lequel vous souhaitez modifier quelque chose."<<endl;
  132. cout<<"1 - Identification"<<endl ;
  133. cout<<"2 - Boite"<<endl ;
  134. cout<<"3 - Hebergeur"<<endl;
  135. cout<<"4 - Ext"<<endl;
  136. cin>>a;
  137. switch(a)
  138. {
  139. case 1:
  140. {
  141.   char  nom[30];
  142.   cout<<"Entrer le nouveau nom"<<endl;
  143.   cin>>nom;
  144.   strcpy((*pt).ident,"nom" );
  145. break;
  146. }
  147. case 2:
  148. {
  149.   char  boite[10];
  150.   cout<<"Entrer la nouvelle boite e-mail"<<endl;
  151.   cin>>boite;
  152.   strcpy((*pt).ident,"boite" );
  153. break;
  154. }
  155. case 3:
  156. {
  157.   char heb[20];
  158.   cout<<"Entrer le nouvel hébergeur correspondant à votre boite mail"<<endl;
  159.   cin>>heb;
  160.   strcpy((*pt).ident,"heb" );
  161. break;
  162. }
  163. case 4:
  164. {
  165.   char ext[5];
  166.   cout<<"Entrer l'extension de votre voite mail"<<endl;
  167.   cin>>ext ;
  168.   strcpy((*pt).ext,"ext" ) ;
  169. break;
  170. }
  171. }
  172. int menu(contact carnet[], int dim)
  173. {
  174. cout<<"QUE VOULEZ VOUS FAIRE ?"<<endl;
  175. cout<<" 0 - Sortir du programme"<<endl;
  176. cout<<" 1 - Saisir un nouveau contact"<<endl;
  177. cout<<" 2 - Affichage "<<endl;
  178. cout<<" 3 - Modifier "<<endl;
  179. cout<<" 4 - Suppression d'un nouveau contact "<<endl;
  180. cout<<" 5 - Suppression d'un doublon "<<endl;
  181. int n;
  182. cin>>n;
  183. switch(n)
  184. {
  185. case 0:
  186. {
  187.   break;
  188. }
  189. case 1:
  190. {
  191.   saisie (carnet+1);
  192.   break;
  193. }
  194. case 2:
  195. {
  196.   affichage(carnet+1,100);
  197.   break;
  198. }
  199. case 3:
  200. {
  201.   modifier(carnet+1,100);
  202.   break;
  203. }
  204. }
  205. case 4 :
  206. {
  207.   supprimer(carnet+1,100);
  208.   break;
  209. }
  210. return n;
  211. }
  212. void supprimer (contact t[], int dim)   /* Fonction servant à supprimer un contact */
  213. {
  214. contact *pt;
  215. char nom[100];
  216. int i;
  217. pt=t;
  218. cout<<"Entrer le nom de la personne que vous souhaitez supprimer de votre liste de contacts"<<endl;
  219. cin>>nom;
  220. i=0;
  221. while (strcmp(nom,(*pt).ident)!=0) 
  222.   {
  223.    pt++;
  224.    i=i+1;
  225.   };
  226.  
  227. (*(pt)).valide=0;
  228. }
  229. void main()
  230. {
  231. contact carnet[100];
  232. // vider_le_tableau(carnet,100);   
  233. initialisation(carnet,100);
  234. lire_sur_fichier(carnet,100);
  235. int n;
  236. do 
  237. {
  238. n=menu(carnet,5);
  239. }
  240. while (n != 0);
  241. sauvez_sur_fichier(carnet,100);
  242. }


Message édité par skeye le 22-04-2003 à 10:16:40
Reply

Marsh Posté le 22-04-2003 à 10:21:17    

Avec tous les pointeurs et tableaux que tu as, ça ne m'étonnerait pas que tu finisses par écrire ou lire là ou il ne faut pas. J'ai pas le temps de me parser ton source, mais vérifie bien si tu ne débordes pas d'un tableau ou si tu n'utilises pas un pointeur fou.
 
Une astuce : quand tu as ce genre de message d'erreur, utilise un débugger qui t'affiche le source désassemblé.
En effet, il faut savoir que le registre EIP contient l'adresse de la prochaine instruction a exécuter. Ainsi, pour trouver la ligne qui pose problème, utilise un désassembleur ou un débugger adéquat, puis positionne toi à l'adresse indiquée par EIP. Pour peu que tu aies activé les options de débuggage, tu tombes sur l'équivalent assembleur de ton source C pile à l'endroit où l'erreur se produit. A toi ensuite de remonter et de trapper le bug.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 22-04-2003 à 10:22:42    

Aussi un truc si ton fichier "projet info" n'existe pas tu crashes comem tu test pas sa presence.


Message édité par VisualC++ le 22-04-2003 à 10:23:04
Reply

Marsh Posté le 22-04-2003 à 22:10:35    

c pas terrible de melanger du C et du C++, choisis un des 2 langages une fois pour toute... on sait pas trop en quel langage tu code la, c'est un peu normal que ca marche pas... :pfff:
 
Edit: la t'es plus proche du C que du C++
En C++ tu devrais faire une classe avec ses accesseurs...


Message édité par ToxicAvenger le 22-04-2003 à 22:13:01
Reply

Sujets relatifs:

Leave a Replay

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