Auteur |
Message |
Orakkle
Forumeur fréquent
Sexe:
Messages: 98
|
Posté le:
Sam 14 Mar 2009 - 12:39 |
|
Bon... si un développeur pouvait venir à mon secours... ^^"
Je dois faire un petit programme de carnet d'adresse en C (comme le titre le laisse deviner).
Quand je compile, le compilateur (gcc) ne se manifeste pas pour signaler des erreurs (ouf!), mais quand je veux tester le programme, il y a des choses qui ne vont pas... (malheureusement).
Code: |
#include <stdio>
#include <string>
//fonction 1 - ajout contact
//fonction 2 - suppression contact
//fonction 3 - affichage de tous les contacts
//fonction 4 - affichage des informations sur le contact
//fonction 5 - affichage des contacts commençant par une lettre donnée
/*
structures adresse
*/
typedef char chaine [100];
typedef char numero [10];
//Définition des structures qu'on va utiliser
typedef struct
{
chaine numadresse;
chaine codepostal;
chaine rue;
chaine ville;
} adresse;
typedef struct
{chaine age;
chaine nom;
numero numtel;
chaine mail;
adresse adresseindividu;
} contact;
typedef struct
{
contact tab[100]; //contact est le type du tableau, tab son nom
int nombredecontacts;
} repertoire; //le tableau de contacts et le nombre de contacts sont liés, on les réunit
|
Code: |
void ajoutcontact (repertoire carnet) //paramètre d'entrée: le carnet vide
{
contact individu;// on déclare sur quoi on va agir: l'individu
printf("Veuillez entrer un nom\n");
scanf("%s",individu.nom); // &nom[0]
printf("Veuillez entrer un age\n");
scanf("%s",individu.age);
printf("Veuillez entrer le numero de telephone\n");
scanf("%s",individu.numtel);
printf("Veuillez entrer l'adresse mail\n");
scanf("%s", individu.mail);
printf("Veuillez entrer l'adresse postale:\n");
printf("Entrez le numero\n");
scanf("%s",individu.adresseindividu.numadresse); |
//ICI Segmentation fault (en tout cas, je suppose que le problème vient de là)!!!!!!! Mais je ne comprend pas pourquoi... c'est la structure chaine qui marche pas? l'accès à adresseindividu? à numadresse? *comprend pas... help!* //
Code: |
//Fin de la fonction:
carnet.tab[carnet.nombredecontacts]=individu; //Premier contact dans la case 0; deuxieme ds la case 1 etc...
carnet.nombredecontacts++; // à chaque ajout, la taille augmente, donc on n'écrasera pas les précédents
}
|
Code: |
repertoire suppressioncontact (repertoire carnet) // paramètre d'entrée: le carnet contenant des contacts!
{
//La fonction supprime un contact de la case j en mettant à sa place celui qui est dans i+1
int i;
int j;
contact individu;
carnet.tab[i]=individu;
for(j=i;j<carnet.nombredecontacts;j++)
carnet.tab[j]=carnet.tab[j+1];
return carnet;
} |
Code: |
repertoire affichertouscontacts (repertoire carnet)
{
int i=0;
for (i=0; i<carnet.nombredecontacts; i++) //Fonction qui fait le tour du carnet et affiche les noms au fur et à mesure
printf("%s", carnet.tab[i].nom);
} |
Code: |
void afficheinfocontacts (repertoire carnet)
{
int i = 0;
chaine nom;
printf("Entrez le nom d'un contact\n");
scanf("%s",nom);
for(i=0;i<carnet.nombredecontacts;i++)//Fonction faisant le tour du carnet
if(strcmp(carnet.tab[i].nom , nom ) ==0) //Fonction comparant les noms
{
printf("L'age est %d\n",carnet.tab[i].age);
printf("Le numero de telephone est %s\n", carnet.tab[i].numtel);
printf("Le numero de l'adresse est %s\n", carnet.tab[i].adresseindividu.numadresse);
printf("La rue est %s\n",carnet.tab[i].adresseindividu.rue);
printf("Le code postal est %s\n",carnet.tab[i].adresseindividu.codepostal);
printf("La ville est %s\n",carnet.tab[i].adresseindividu.ville);
printf("L'adresse mail est %s\n",carnet.tab[i].mail);
}
} |
Code: |
void affichecontactlettre (repertoire carnet)
{
chaine lettre;
int i =0;
printf("Entrez une lettre... UNE LETTRE! Merci =)\n");
scanf("%s",&lettre);
for(i=0; i<carnet.nombredecontacts; i++) //boucle qui cherche dans tous les noms jusqu'à trouver la lettre
if (strcmp(carnet.tab[i].nom , lettre ) ==0)
{printf("Le contact commençant par la lettre %s est %s\n",lettre, carnet.tab[i].nom);}
}
|
Mon main donne un truc de ce genre là:
Code: |
int main()
{
repertoire carnet;
int n = 0;
printf("\n\n Bienvenue dans votre répertoire \n\n");
printf("-------------------------\n\n");
{
printf("Choisissez l'opération à effectuer en entrant le nombre lui correspondant \n\n");
printf("1 pour ajouter un contact\n");
printf("2 pour supprimer un contact\n");
printf("3 pour afficher tous les noms de contacts\n");
printf("4 pour afficher toutes les infos d'un contact\n");
printf("5 pour afficher les noms des contacts commençant par une lettre donnée \n");
scanf("%d",&n);
if(n==1) ajoutcontact(carnet);
if(n==2) suppressioncontact(carnet);
if(n==3) affichertouscontacts(carnet);
if(n==4) afficheinfocontacts(carnet);
if(n==5) affichecontactlettre(carnet);
else while (n!= (1 && 2 && 3 && 4 && 5))
{
printf("Veuillez choisir une opération valide\n");
printf("Choisissez l'opération à effectuer en entrant le nombre lui correspondant \n\n");
printf("1 pour ajouter un contact\n");
printf("2 pour supprimer un contact\n");
printf("3 pour afficher tous les noms de contacts\n");
printf("4 pour afficher toutes les infos d'un contact\n");
printf("5 pour afficher les noms des contacts commençant par une lettre donnée \n");
scanf("%d",&n);}
}
}
/*"1" pour Ajouter un contact \n
"2" pour Supprimer un contact\n
"3" pour Afficher tous les noms de tous les contacts\n
"4" pour Afficher les informations sur un contact donné\n
"5" pour Afficher les noms des contacts commençant par une lettre donnée \n");
*/
}
|
Si quelqu'un a des suggestions, des idées, des ajouts... n'hésitez pas...
Ah, et est-ce qu'il y a assez de commentaires? Est-ce que le code est compréhensible?
|
_________________
2008: Bac S
2008-2009: L1 Math-Info (validée)
2009-2010: BTS IG 1
Désespérée cherche désespérément espoir.
Dernière édition par Orakkle le Sam 14 Mar 2009 - 14:50; édité 1 fois |
|
|
|
N'oubliez pas de vous inscrire à la communauté pour participer. Si vous êtes déjà membre, connectez-vous pour faire disparaître ce bandeau publicitaire. |
United
Accro à Web-IG
Sexe:
Messages: 225
Localisation: Oise
|
Posté le:
Sam 14 Mar 2009 - 13:16 |
|
Il faut le "&" même pour un struct étant donné que la fonction scanf demande l'adresse de la variable et non sa valeur. |
_________________
|
|
|
|
Orakkle
Forumeur fréquent
Sexe:
Messages: 98
|
Posté le:
Sam 14 Mar 2009 - 14:41 |
|
Justement, scanf demande une adresse...
Bon, je vais essayer d'expliquer quelque chose qui n'est pas vraiment clair dans ce fouilli de code:
Je travaille avec un carnet, qui est de type repertoire.
Dans repertoire j'ai un tableau de contacts, et comme le tableau c'est l'adresse du premier élément, les premiers "&" dans scanf, ben faut pas les mettre (quand c'est rédigé comme ça) -en tout cas d'après ce que j'ai compris...
Et j'ai essayé, mais j'ai re-segmentation fault... |
_________________
2008: Bac S
2008-2009: L1 Math-Info (validée)
2009-2010: BTS IG 1
Désespérée cherche désespérément espoir. |
|
|
|
United
Accro à Web-IG
Sexe:
Messages: 225
Localisation: Oise
|
Posté le:
Sam 14 Mar 2009 - 14:46 |
|
Je viens te tester et je n'ai aucune erreur en ajoutant un contact ni en compil ni en exécution.
Donne ce que tu mets exactement pour que je reproduise l'erreur. |
_________________
|
|
|
|
Orakkle
Forumeur fréquent
Sexe:
Messages: 98
|
Posté le:
Sam 14 Mar 2009 - 15:00 |
|
En compil j'ai pas d'erreur non plus *fière*
Par contre, à l'exécution, c'est la catastrophe (comment ça, j'exagère?)
Je vais un copier/coller général, le compilateur (gcc) n'indique aucune erreur (de nouveau).
Code: |
#include <stdio>
#include <string>
//fonction 1 - ajout contact
//fonction 2 - suppression contact
//fonction 3 - affichage de tous les contacts
//fonction 4 - affichage des informations sur le contact
//fonction 5 - affichage des contacts commençant par une lettre donnée
/*
structures adresse
*/
typedef char chaine [100];
typedef char numero [10];
//Définition des structures qu'on va utiliser
typedef struct
{
chaine numadresse;
chaine codepostal;
chaine rue;
chaine ville;
} adresse;
typedef struct
{chaine age;
chaine nom;
numero numtel;
chaine mail;
adresse adresseindividu;
} contact;
typedef struct
{
contact tab[100]; //contact est le type du tableau, tab son nom
int nombredecontacts;
} repertoire; //le tableau de contacts et le nombre de contacts sont liés, on les réunit
void ajoutcontact (repertoire carnet) //paramètre d'entrée: le carnet vide
{
contact individu;// on déclare sur quoi on va agir: l'individu
printf("Veuillez entrer un nom\n");
scanf("%s",&individu.nom); // &nom[0]
printf("Veuillez entrer un age\n");
scanf("%s",&individu.age);
printf("Veuillez entrer le numero de telephone\n");
scanf("%s",&individu.numtel);
printf("Veuillez entrer l'adresse mail\n");
scanf("%s",&individu.mail);
printf("Veuillez entrer l'adresse postale:\n");
printf("Entrez le numero\n");
scanf("%s",&individu.adresseindividu.numadresse);
carnet.tab[carnet.nombredecontacts]=individu; //Premier contact dans la case 0; deuxieme ds la case 1 etc...
carnet.nombredecontacts++; // à chaque ajout, la taille augmente, donc on n'écrasera pas les précédents
}
repertoire suppressioncontact (repertoire carnet) // paramètre d'entrée: le carnet contenant des contacts!
{
//La fonction supprime un contact de la case j en mettant à sa place celui qui est dans i+1
int i;
int j;
contact individu;
carnet.tab[i]=individu;
for(j=i;j<carnet.nombredecontacts;j++)
carnet.tab[j]=carnet.tab[j+1];
return carnet;
}
repertoire affichertouscontacts (repertoire carnet)
{
int i=0;
for (i=0; i<carnet.nombredecontacts; i++) //Fonction qui fait le tour du carnet et affiche les noms au fur et à mesure
printf("%s", carnet.tab[i].nom);
}
void afficheinfocontacts (repertoire carnet)
{
int i = 0;
chaine nom;
printf("Entrez le nom d'un contact\n");
scanf("%s",nom);
for(i=0;i<carnet.nombredecontacts;i++)//Fonction faisant le tour du carnet
if(strcmp(carnet.tab[i].nom , nom ) ==0) //Fonction comparant les noms
{
printf("L'age est %d\n",carnet.tab[i].age);
printf("Le numero de telephone est %s\n", carnet.tab[i].numtel);
printf("Le numero de l'adresse est %s\n", carnet.tab[i].adresseindividu.numadresse);
printf("La rue est %s\n",carnet.tab[i].adresseindividu.rue);
printf("Le code postal est %s\n",carnet.tab[i].adresseindividu.codepostal);
printf("La ville est %s\n",carnet.tab[i].adresseindividu.ville);
printf("L'adresse mail est %s\n",carnet.tab[i].mail);
}
}
void affichecontactlettre (repertoire carnet)
{
chaine lettre;
int i =0;
printf("Entrez une lettre... UNE LETTRE! Merci =)\n");
scanf("%s",&lettre);
for(i=0; i<carnet.nombredecontacts; i++) //boucle qui cherche dans tous les noms jusqu'à trouver la lettre
if (strcmp(carnet.tab[i].nom , lettre ) ==0)
{printf("Le contact commençant par la lettre %s est %s\n",lettre, carnet.tab[i].nom);}
}
int main()
{
repertoire carnet;
int n = 0;
printf("\n\n Bienvenue dans votre répertoire \n\n");
printf("-------------------------\n\n");
{
printf("Choisissez l'opération à effectuer en entrant le nombre lui correspondant \n\n");
printf("1 pour ajouter un contact\n");
printf("2 pour supprimer un contact\n");
printf("3 pour afficher tous les noms de contacts\n");
printf("4 pour afficher toutes les infos d'un contact\n");
printf("5 pour afficher les noms des contacts commençant par une lettre donnée \n");
scanf("%d",&n);
if(n==1) ajoutcontact(carnet);
if(n==2) suppressioncontact(carnet);
if(n==3) affichertouscontacts(carnet);
if(n==4) afficheinfocontacts(carnet);
if(n==5) affichecontactlettre(carnet);
else while (n!= (1 && 2 && 3 && 4 && 5))
{
printf("Veuillez choisir une opération valide\n");
printf("Choisissez l'opération à effectuer en entrant le nombre lui correspondant \n\n");
printf("1 pour ajouter un contact\n");
printf("2 pour supprimer un contact\n");
printf("3 pour afficher tous les noms de contacts\n");
printf("4 pour afficher toutes les infos d'un contact\n");
printf("5 pour afficher les noms des contacts commençant par une lettre donnée \n");
scanf("%d",&n);}
}
/*"1" pour Ajouter un contact \n
"2" pour Supprimer un contact\n
"3" pour Afficher tous les noms de tous les contacts\n
"4" pour Afficher les informations sur un contact donné\n
"5" pour Afficher les noms des contacts commençant par une lettre donnée \n");
*/
}
|
A l'exécution, ça segmente-faulte (je viens de l'inventer celui-là), après la partie où je demande le numéro d'adresse (j'entre un truc, je fais entrer puis... segmentation fault... TT-TT).
Si tu pouvais m'éclairer? Parce que là, je commence à ne plus comprendre mon propre programme! TT-TT |
_________________
2008: Bac S
2008-2009: L1 Math-Info (validée)
2009-2010: BTS IG 1
Désespérée cherche désespérément espoir. |
|
|
|
United
Accro à Web-IG
Sexe:
Messages: 225
Localisation: Oise
|
Posté le:
Sam 14 Mar 2009 - 15:05 |
|
Citation: |
A l'exécution, ça segmente-faulte (je viens de l'inventer celui-là), après la partie où je demande le numéro d'adresse (j'entre un truc, je fais entrer puis... segmentation fault... TT-TT). |
Tu mets quoi comme valeur là en saisissant ? Car qu'importe ce que je rentre, ça passe. |
_________________
|
|
|
|
Orakkle
Forumeur fréquent
Sexe:
Messages: 98
|
Posté le:
Sam 14 Mar 2009 - 15:07 |
|
Alors j'ai essayé: 3 , 8, ... euh en fait tous les chiffres sur le clavier...
C'est bizarre quand même Ô.o |
_________________
2008: Bac S
2008-2009: L1 Math-Info (validée)
2009-2010: BTS IG 1
Désespérée cherche désespérément espoir. |
|
|
|
United
Accro à Web-IG
Sexe:
Messages: 225
Localisation: Oise
|
Posté le:
Sam 14 Mar 2009 - 15:20 |
|
Ca peut venir du tableau aussi, si tu sors de la taille défini, mais bon, avec une taille de 100, ça fait de la marge quand même.
Et j'utilise GCC aussi en plus. |
_________________
|
|
|
|
Orakkle
Forumeur fréquent
Sexe:
Messages: 98
|
Posté le:
Sam 14 Mar 2009 - 16:41 |
|
Ô.o
Etonnant...
remarque, un truc du même genre m'était déjà arrivé avec ce prog là:
Les structures ne fonctionnaient pas (le compilateur ne voulait pas), deux jours après (sur un autre ordinateur), ça avait décidé de passer...
C'est peut-être les options de gcc? (on m'a appris à mettre -o -wall)
Ca peut pas venir du fait que j'ai compilé puis testé sous mac OS X? C'est pas possible ça, normalement, non?
Merci pour l'aide, au passage =). |
_________________
2008: Bac S
2008-2009: L1 Math-Info (validée)
2009-2010: BTS IG 1
Désespérée cherche désespérément espoir. |
|
|
|
GrSec
Forumeur fréquent
Sexe:
Messages: 64
|
Posté le:
Ven 17 Avr 2009 - 16:04 |
|
message en retard mais bon ..
si c'est un truc noté pour avoir meilleur note tu peux faire ton carnet d'adresse via la structure de donnée sequentiel : liste chainée le tout geré avec memoire dynamique |
|
|
|
|
Orakkle
Forumeur fréquent
Sexe:
Messages: 98
|
Posté le:
Ven 17 Avr 2009 - 19:41 |
|
A l'époque on n'avait pas encore vu les structures dynamiques, donc...
... et de toute façon, ce n'était pas noté! =) |
_________________
2008: Bac S
2008-2009: L1 Math-Info (validée)
2009-2010: BTS IG 1
Désespérée cherche désespérément espoir. |
|
|
|
|