IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

tableau de pointeur de structure


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 60
    Points
    60
    Par défaut tableau de pointeur de structure
    Bonjour,

    voilà j'ai une fonction de recherche qui doit recuperer l'adresse dans le tableau de pointeur une adresse qui pointera sur la structure donnée et la comparer avec le gets.

    probleme: je n'arrive pas à m'en sortir au niveau du code.
    Au niveau du declaration du tableau.
    aussi lorsque je veux mettre la donnée lu par zln dans pnom
    est ce qu'il me manque un malloc aussi?

    Pouvez vous m'aidez svp?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    #include "stdafx.h"
    #include "stdlib.h"
    #include "string.h"
    #include "stdio.h"
     
     
    struct pers						//declaration de la structure repertoire
    {
    	char * pnom; 				//nom dans le repertoire
    	char tel;    				// n° de tel
    	int dpt;     				// n° departement
    	int indv;    				//ind de la ville par [j]
    };
     
    void main()
    { 
    	rep *Tp[50];
    	char zln[11];				// zone de lecture pour le nom
    	int n=0;					// nombre de nom
    	pers rep;
     
     
    	int RECHNOM(char [],pers *,int);
     
     
    	int RECHNOM(char [] zln,pers *ps,int n)							//Fonction RECHNOM
    		{
    			int c;
    			int i;
    			c=strcmp(zln,ps->pnom);
    			for (i=0;i<n && c!=0;i+=1);
    					if (i<n)
    					{//trouvé
    						printf ("NOM DEJA ENREGISTRE\n")
    						return (i);
    					}
    					else
    					{
    					for (i=n-1;i>=0&&c)<0;i=i-1)
    							{
    								Trep[i+1]=Trep[i]; //a ce niveau je ne sais pas comment faire
    							}
    						i=i+1;
    						Trep[i].pnom=strdup(zln);
    					return (-1);
    					}
    		}

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Salut,

    Il y a beaucoup de problemes de syntaxe, ton code ne compile pas ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        rep *Tp[50];  
        char zln[11];   // zone de lecture pour le nom
        int n=0;	    // nombre de nom
        pers rep;
    pers et rep ne sont pas des types definis. si je comprends bien, tu veux declarer Tp comme un tableau de pointeur vers des pers? Tu peux faire comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef struct personne pers; //declaration du type pers (une structure de personne)
    struct personne //declaration de la structure repertoire
    {
        char * pnom;//nom dans le repertoire
        char tel;   // n° de tel
        int dpt;    // n° departement
        int indv;   //ind de la ville par [j]
    };
     
    int main()
    {
        pers *Tp[50];
    /* ... */
    Autre probleme: tu declares une fonction dans une autre fonction. C'est interdit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void main()
    { 
    /* ... */
        int RECHNOM(char [],pers *,int);
     
        int RECHNOM(char [] zln,pers *ps,int n) //Fonction RECHNOM
        {
         /* ... */
    Tu dois faire quelque chose comme ca pour rendre ton code compilable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    /* Declaration des variables*/
    struct personne //declaration de la structure repertoire
    {
        char * pnom;//nom dans le repertoire
        char tel;   // n° de tel
        int dpt;    // n° departement
        int indv;   //ind de la ville par [j]
    };
    /* Declaration des fonctions */
    int RECHNOM(char [] zln,pers *ps,int n) 
     
    /* definition des fonctions */
    int main() {
       /* code */
    }
     
    int RECHNOM(char [] zln,pers *ps,int n) {
         /* code */
    }
    Et puis par convention on met les fonction en minuscule et les constantes et macros en majuscule (ca n'a rien d'obligatoire, c'est l'usage).

    Commence par corriger la syntaxe, on verra le reste plus tard

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 60
    Points
    60
    Par défaut
    Merci je vais corriger ça.

  4. #4
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 60
    Points
    60
    Par défaut
    Me revoilà.

    j'ai corrigé, mais j'ai toujours un probleme lors de la compile.
    je me retrouve avec ça comme erreur, je n'y comprends rien :

    Error 2 error C2664: 'rechnom' : cannot convert parameter 2 from 'pers *(*__w64 )[50]' to 'pers *[]' c:\users\kinwai\documents\visual studio 2005\projects\repertoire\repertoire\repertoire.cpp 64
    Error 3 error C2664: 'rechville' : cannot convert parameter 2 from 'ville *(*__w64 )[50]' to 'ville *[]' c:\users\kinwai\documents\visual studio 2005\projects\repertoire\repertoire\repertoire.cpp 77
    Error 4 error C2664: 'strcpy' : cannot convert parameter 1 from 'char' to 'char *' c:\users\kinwai\documents\visual studio 2005\projects\repertoire\repertoire\repertoire.cpp 93

    Aidez moi svp.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
    // Repertoire.cpp : Defines the entry point for the console application.
    //
     
     
    #include "stdafx.h"
    #include "stdlib.h"
    #include "string.h"
    #include "stdio.h"
     
     
    struct pers						//declaration de la structure repertoire
    {
    	char *pnom; 				//nom dans le repertoire
    	char tel;    				// n° de tel
    	int dpt;     				// n° departement
    	int indv;    				//ind de la ville
    };
    struct ville					//declaration de la structure ville
    {
    	char *pville;				//nom de la ville
    	int occ;					//nombre d'occurence d'une ville
    };
     
     
     
     
    void main()
    { 
    	pers *tp[50];
    	ville *tv[50];
    	int tabc[50];				// tableau d'indice servant au tri alphabetique des noms de ville.
    	int n=0;					// nombre de nom
    	int v=0;					// nombre de ville
    	int a=0;
    	int i,r,t;
    	int rechnom(char[],pers *[],int);
    	int rechville(char[],ville *[],int);
     
    	char zl[15];				// zone de lecture
    	char code;
     
    	system ("cls"); 			// nettoie l ecran
    	printf ("\n*****************************************\n\n");
    	printf ("* REPERTOIRE TELEPHONIQUE METROPOLITAIN *\n\n");
    	printf ("*****************************************\n\n\n\n\n");
    	printf ("I - Inscription d'une personne\n\n");
    	printf ("S - Suppression d'une personne\n\n");
    	printf ("C - Consultation concernant une personne\n\n");
    	printf ("V - Visualisation des villes referencees\n\n");
    	printf ("Q - Arret du progamme\n\n\n\n\n");
    	printf ("VEUILLEZ SAISIR LA LETTRE CORRESPONDANT\n   A L'EVENEMENT SOUHAITE ET CLIQUER SUR ENTRER: \n\n\n");
    	code=getchar();
    		while(code != 'q' && code != 'Q')
    		{
    			switch(code)
    			{
    				case'i':
    				case'I':
    				{
    					system ("cls");
    					printf("\nVeuillez saisir le nom: \n");
    					fflush(stdin);
    					gets(zl);
    					r= rechnom(zl,&tp,n);
    					if (r==-1)
    					{	
    						printf("\nINSCRIPTION EFFECTUEE:\n %s-10",zl);
    						for (i=n-1;i>=0&&strcmp(zl,tp[i]->pnom)<0;i--) // boucle tri par insertion
    							{
    								tp[i+1]=tp[i];
    							}
    						i=i+1;
    						tp[i]=(pers*)malloc(sizeof(pers));
    						tp[i]->pnom=strdup(zl);
    						printf("\nVeuillez saisir la ville: \n");
    						gets(zl);
    						t= rechville(zl,&tv,v);
    						if (t==v)
    						{
    							tv[v]=(ville *)malloc(sizeof(ville));
    							tv[v]->pville=strdup(zl);
    							tv[v]->occ=1;
    							v++;
    							printf("\nNouvelle ville : %-15s\n",zl);
    						}
    						tp[n]->indv=t;
    						printf("\nVeuillez saisir le department: \n");
    						gets(zl);
    						scanf("%d",tp[n]->dpt);
    						printf("\nVeuillez saisir le numero de telephone: \n");
    						fflush(stdin);
    						gets(zl);
    						strcpy(tp[n]->tel,zl);
    						n++;
    					}
    					fflush(stdin);
    					printf("\n Nom deja enregistre\n");
    				break;
    				}
     
    			}
    		}
    }
    int rechnom(char zl[],pers *tp[],int n)							//Fonction RECHNOM
    		{
     
    			int i;
    			for (i=0;i<n && strcmp(zl,tp[i]->pnom)!=0;i++);
    					if (i<n)
    					{//trouvé
    						return (i);
    					}
    					return (-1);
    		}
     
    int rechville(char zl[],ville *tv[],int v)					//Fonction RECHVILLE
    	{
     
    		int i;
    		for (i=0;i<v && strcmp(zl,tv[i]->pville)!=0;i++);
    				if (i<v)
    				{//trouvé
    					tv[i]->occ++;
    				}
    				return (i);
    	}

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Le problème se situe dans l'appel aux fonctions rechnom() et rechville() sur le 2eme paramètre.

    Tu donnes l'adresse d'un tableau de 50 pointeur de "pers" alors que la fonction veut un tableau de 50 pointeurs de "pers". Enlève le caractère '&' et cela ira mieux.

    Au fait, j'ai vu un "fflush(stdin);" dans ton code, c'est pas correct, cela à un comportement indéfini, on ne peut flusher que les flux de sortie. Voir dans la FAQ

    Tu mets les prototypes des fonctions rechnom() et rechville() à l'intérieur de la fonction main(). C'est bien mais ils devraient être à l'extérieur en haut de module afin que ces prototypes soient visibles de toutes les fonctions et pas seulement de main().

    Les noms des paramètres et des variables, c'est pas très parlant, "zl" et "tp", je voie pas bien ce que cela peut être en première lecture.

    Tes structures "pers" et "ville", change leur nom, on les confond avec des variables. Tu peux essayer Pers_s (voire même Personne_s ), Ville_s. mais adopte une règle de nommage sans ambiguité pour ne pas les confondre.

    Cordialement
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 60
    Points
    60
    Par défaut
    Merci pour la réponse
    concernant les noms tp,tv et zl je les remplacerai lorsque j'aurai fini mon programme, et oui je suis un peu paresseux

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tableau de pointeurs sur Structure
    Par kenzo75 dans le forum C
    Réponses: 18
    Dernier message: 02/02/2013, 09h24
  2. Tableau de pointeurs de structures
    Par zeracoa dans le forum C
    Réponses: 7
    Dernier message: 20/12/2012, 15h49
  3. Tableau de pointeurs de structures
    Par jovds dans le forum C
    Réponses: 2
    Dernier message: 11/11/2007, 21h01
  4. Réponses: 67
    Dernier message: 13/02/2007, 18h08
  5. structure, tableau et pointeur
    Par Phil' dans le forum GTK+ avec C & C++
    Réponses: 16
    Dernier message: 26/05/2006, 17h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo