Gérer le forum:  Aide  •  Rechercher  •  Liste des Membres  •  Groupes d'utilisateurs   •  S'enregistrer  •  Profil  •  Se connecter pour vérifier ses messages privés  •  Connexion 
 [C] Faire un carnet d'adresse Voir le sujet suivant
Voir le sujet précédent
Poster un nouveau sujetRépondre au sujet
Auteur Message
Orakkle
Forumeur fréquent
Forumeur fréquent


BTS IG - Option réseau 1ère année
Sexe: Sexe:Féminin
Messages: 98

MessagePosté le: Sam 14 Mar 2009 - 12:39 Répondre en citantRevenir en haut

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

help.gif help.gif help.gif help.gif


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?

help.gif help.gif help.gif help.gif
[:boulet]
[:dehors]

_________________
Image

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
Voir le profil de l'utilisateurEnvoyer un message privé

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
Accro à Web-IG


Post-BTS
Sexe: Sexe:Masculin
Messages: 225
Localisation: Oise

MessagePosté le: Sam 14 Mar 2009 - 13:16 Répondre en citantRevenir en haut

Il faut le "&" même pour un struct étant donné que la fonction scanf demande l'adresse de la variable et non sa valeur. Smile

_________________
Image
Voir le profil de l'utilisateurEnvoyer un message privé
Orakkle
Forumeur fréquent
Forumeur fréquent


BTS IG - Option réseau 1ère année
Sexe: Sexe:Féminin
Messages: 98

MessagePosté le: Sam 14 Mar 2009 - 14:41 Répondre en citantRevenir en haut

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

_________________
Image

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.
Voir le profil de l'utilisateurEnvoyer un message privé
United
Accro à Web-IG
Accro à Web-IG


Post-BTS
Sexe: Sexe:Masculin
Messages: 225
Localisation: Oise

MessagePosté le: Sam 14 Mar 2009 - 14:46 Répondre en citantRevenir en haut

Je viens te tester et je n'ai aucune erreur en ajoutant un contact ni en compil ni en exécution. Very Happy
Donne ce que tu mets exactement pour que je reproduise l'erreur. Wink

_________________
Image
Voir le profil de l'utilisateurEnvoyer un message privé
Orakkle
Forumeur fréquent
Forumeur fréquent


BTS IG - Option réseau 1ère année
Sexe: Sexe:Féminin
Messages: 98

MessagePosté le: Sam 14 Mar 2009 - 15:00 Répondre en citantRevenir en haut

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

_________________
Image

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.
Voir le profil de l'utilisateurEnvoyer un message privé
United
Accro à Web-IG
Accro à Web-IG


Post-BTS
Sexe: Sexe:Masculin
Messages: 225
Localisation: Oise

MessagePosté le: Sam 14 Mar 2009 - 15:05 Répondre en citantRevenir en haut

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

_________________
Image
Voir le profil de l'utilisateurEnvoyer un message privé
Orakkle
Forumeur fréquent
Forumeur fréquent


BTS IG - Option réseau 1ère année
Sexe: Sexe:Féminin
Messages: 98

MessagePosté le: Sam 14 Mar 2009 - 15:07 Répondre en citantRevenir en haut

Alors j'ai essayé: 3 , 8, ... euh en fait tous les chiffres sur le clavier...

C'est bizarre quand même Ô.o

_________________
Image

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.
Voir le profil de l'utilisateurEnvoyer un message privé
United
Accro à Web-IG
Accro à Web-IG


Post-BTS
Sexe: Sexe:Masculin
Messages: 225
Localisation: Oise

MessagePosté le: Sam 14 Mar 2009 - 15:20 Répondre en citantRevenir en haut

Image

Very Happy
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. Confused

_________________
Image
Voir le profil de l'utilisateurEnvoyer un message privé
Orakkle
Forumeur fréquent
Forumeur fréquent


BTS IG - Option réseau 1ère année
Sexe: Sexe:Féminin
Messages: 98

MessagePosté le: Sam 14 Mar 2009 - 16:41 Répondre en citantRevenir en haut

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

_________________
Image

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.
Voir le profil de l'utilisateurEnvoyer un message privé
GrSec
Forumeur fréquent
Forumeur fréquent



Sexe: Sexe:Masculin
Messages: 64

MessagePosté le: Ven 17 Avr 2009 - 16:04 Répondre en citantRevenir en haut

message en retard mais bon .. Wink

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 Very Happy
Voir le profil de l'utilisateurEnvoyer un message privéVisiter le site web du posteur
Orakkle
Forumeur fréquent
Forumeur fréquent


BTS IG - Option réseau 1ère année
Sexe: Sexe:Féminin
Messages: 98

MessagePosté le: Ven 17 Avr 2009 - 19:41 Répondre en citantRevenir en haut

A l'époque on n'avait pas encore vu les structures dynamiques, donc...
... et de toute façon, ce n'était pas noté! =)

_________________
Image

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.
Voir le profil de l'utilisateurEnvoyer un message privé
Montrer les messages depuis:      
Poster un nouveau sujetRépondre au sujet
 Sauter vers:   



Voir le sujet suivant
Voir le sujet précédent
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum