[C] : Problème de paramètres avec fonctions qui appelent fonctions

: Problème de paramètres avec fonctions qui appelent fonctions [C] - C++ - Programmation

Marsh Posté le 22-03-2003 à 16:31:15    

salut all
 
j'ai un problème assez con, que j'arrive à résoudre en contournnant le pb mais je dois respecter une certaine facon de programmer donc j'aurais besoin de votre aide
 
le pb :
 
je dois insérer un struct qui correspond à un client (avec nom, adresse etc) dans une struct liste qui contient elle tous les clients
 
Exemple :
 
Liste :
 
   indice 1 :  dupon, telle adresse, tel n°  
   indice 2 :  martin, telle adresse, tel n°
 
Bon, le pb c que cette liste est trié sur le nom du client
 
Lorsque j'insère un nouveau client, grosso modo la méthode est : je recherche le rang d'insertion, puis j'insère mon client à ce rang
 
je dois me débrouiller avec 3 fonctions :  
 
rg_dicho(l, c) : calcule le rang d'insertion du client "c" dans la liste "l"
 
ajouter_client(l, rg, c) : ajoute le client "c" dans la liste "l" au rang "rg"
 
ajouter_client_alph(l, c) : ajoute le client "c" ds la liste "l" en conservant l'ordre  
 
Lorsque je fait comme ça, ca marche :
 
(dans le prog principal)  
 
struct client cli;
struct liste_client liste
 
rang=rg_dicho(liste, cli)
 
puis jappele ajouter_client avec en paramètre le rang que je viens de trouver juste avant
 
Et là c bon, ça marchemais à ce moment là, je ne me sert pas de la fonction ajouter_client_alph  :(
 
Et lorsque j'essaye de m'en servir, j'arrive pas à bien le faire :/
 
J'ai essayé de créer cette fonction comme ca :
 
struct ListeClient ajouterClient (struct ListeClient l, struct Client c)
/**
 N : ajouterClient
 R : Ajout d'un client dans une liste de Clients en conservant la liste
   dans l'ordre alphabétique par recherche du rang d'insertion
 E :   l : la liste (Liste Client) où c doit etre ajouté
   c : Client à ajouter
 S : l avec c ajouté
 Prec : non listePleine (l)
    non estPresentClient (l, c.nom)
**/
{
    int rang;
     
    rang=rg_dicho(l,c);
     
    l=ajouterListe(l,rang,c);
     
    return(l);
}
 
Puis je l'appele dans mon prog principal en faisant ajouterClient(liste, cli);
 
Mais ça merde, au moment de l'appel, le prog se ferme tout seul
 
J'ai dû me planter qque part, doit yavoir une histoire de variable globale ou un truc du genre
 
qqun pourrait m'aider svp? :hello:


Message édité par schumacher le 22-03-2003 à 16:39:27
Reply

Marsh Posté le 22-03-2003 à 16:31:15   

Reply

Marsh Posté le 22-03-2003 à 16:40:45    

:bounce:

Reply

Marsh Posté le 22-03-2003 à 16:45:54    

:cry:

Reply

Marsh Posté le 22-03-2003 à 17:18:03    

Code :
  1. {
  2.    int rang;
  3.  
  4.    rang=rg_dicho(l,c);
  5.  
  6. =====>  l=ajouterListe(l,rang,c);
  7.  
  8.    return(l);
  9. }

 
 
Ca sort d'ou ca?


Message édité par Angel_Dooglas le 22-03-2003 à 17:18:25
Reply

Marsh Posté le 22-03-2003 à 17:37:23    

Code :
  1. struct ListeClient ajouterListe (struct ListeClient l, int rg, struct Client c)
  2. /**
  3. N : ajouterListe
  4. R : Ajout d'un Client dans une liste de Clients
  5. E :   l : la liste (Liste Client) où c doit etre ajouté
  6.   rg : rang d'insertion
  7.   c : élément (Client) à ajouter
  8. S : l avec c ajouté
  9. Prec : 1 <= rg <= longueurListe(l) + 1
  10.    non listePleine (l)
  11. **/
  12. {
  13.     int i;
  14.    
  15.     (l.nbCli)++;
  16.    
  17.     for (i=l.nbCli ; i>rg ; i--)
  18.         l.tCli[i]=l.tCli[i-1];
  19.      
  20.     l.tCli[rg]=c;
  21.      
  22.     return (l);       
  23. }


 
il faut bien que je mette mon client dans la liste au rang que je viens de calculer non :??:

Reply

Marsh Posté le 22-03-2003 à 17:50:36    

Ce que je comprends pas ce sont les noms que tu emploies pour tes differentes fonctions, c'est un sacre bordel.
 
Par exemple tu parles de probleme a l'emploi de ajouter_client_alph, mais je ne la vois nulle part dans ton code.

Reply

Marsh Posté le 22-03-2003 à 18:27:14    

désolé...
 
je récapitule :
 
j'ai 3 fonctions à utiliser
 
une qui retourne le rang d'insertion de cli dans liste de facon à garder l'ordre de classement
 
une qui se contente de mettre cli dans liste en donnant en paramètre le rang d'inserion calculé par la fct° précédente
 
enfin, une dernière qui, en faisant appel aux 2 précédentes permet d'insérer cli dans liste à la bonne posisiton
 
en gros, la 3ème est inteligente, elle insère au bon endroit
 
on doit la construire à partir de la une qui soccupe juste du rang et de la 2nde qui soccupe juste dinserer
 
seulement voilà, qd je fait appel à ma fct n° 3 que voici :
 
struct ListeClient ajouterClient (struct ListeClient l, struct Client c)  
/**  
N : ajouterClient  
R : Ajout d'un client dans une liste de Clients en conservant la liste  
  dans l'ordre alphabétique par recherche du rang d'insertion  
E :   l : la liste (Liste Client) où c doit etre ajouté  
  c : Client à ajouter  
S : l avec c ajouté  
Prec : non listePleine (l)  
   non estPresentClient (l, c.nom)  
**/  
{  
   int rang;  
     
   rang=rg_dicho(l,c);  
     
   l=ajouterListe(l,rang,c);  
     
   return(l);  
}  
 
ça plante mon programme...

Reply

Marsh Posté le 22-03-2003 à 19:17:15    

ta regardé ce que je t mailé ?

Reply

Marsh Posté le 22-03-2003 à 19:29:58    

tu ne files pas grand chose pour qu'on puisse t'aider efficacement. files les définitions C des fonctions, files la source si tu peux.
 
en particulier, ça m'étonne que ajouterClient demande une struct ListeClient et non pas un pointeur.  
 
c'est pour un tp je suppose ? encore un exercice complètement inadapté au langage ...

Reply

Marsh Posté le 22-03-2003 à 20:22:04    

essaye de travailler seulement avec les pointers sur ta liste et ton client
 
void ajouterClient (struct ListeClient *l, struct Client *c)
{
   int rang;
   rang=rg_dicho(l,c);
   l=ajouterListe(l,rang,c);
}
 
... et modifie rg_dicho(struct ListeClient *l, struct Client *c)
et ajouteListe(struct ListeClient *l,int rang, struct Client *c) de la meme maniere
 

Reply

Marsh Posté le 22-03-2003 à 20:22:04   

Reply

Marsh Posté le 23-03-2003 à 00:42:03    

Code :
  1. // Fichier : CLIENT.H
  2. /**
  3. Définition de la structure Client :
  4.  nom : nom du client
  5.  tel : numéro de téléphone
  6.  numRue : nuémro de rue
  7.  adresse : libellé de l'adresse du client
  8.  codPost : code postal
  9.  ville : libelle de la ville d'habitation
  10. **/
  11. #ifndef CLIENT_H
  12. #define CLIENT_H
  13. // LGCH : longueur maximale des chaines
  14. #define LGCH 51
  15. // LGCODPOST : longueur des codes postaux
  16. #define LGCODPOST 6
  17. // LGTEL : longueur des numéros de téléphone
  18. #define LGTEL 11
  19. struct Client
  20. {
  21. char nom[LGCH];
  22. char tel [LGTEL];
  23. int numRue;
  24. char adresse[LGCH];
  25. char codPost[LGCODPOST];
  26. char ville[LGCH];
  27. };
  28. #endif
  29. // Fichier : LISTE.H
  30. /**
  31. Interface du module liste
  32. Gestion d'une liste de clients, sans ordre
  33. **/
  34. #ifndef LISTE_H
  35. #define LISTE_H
  36. #include "client.h"
  37. // NBCLI : nombre de clients maximum d'une liste de clients
  38. #define NBCLI 50
  39. /**
  40. Structure de liste de Clients
  41.  tCli : tableau de NBCLI éléments (Clients) maxi
  42.  nbCli : nombre d'éléments de tCli
  43. **/
  44. struct ListeClient
  45. {
  46. struct Client tCli [NBCLI];
  47. int nbCli;
  48. };
  49. /**
  50. N : creerListe
  51. R : Création d'une liste de Clients
  52. E : -
  53. S : la liste ListeClient créée
  54. Prec : -
  55. **/
  56. struct ListeClient creerListe (void);
  57. /**
  58. N : ajouterListe
  59. R : Ajout d'un Client dans une liste de Clients
  60. E :   l : la liste (Liste Client) où c doit etre ajouté
  61.   rg : rang d'insertion
  62.   c : élément (Client) à ajouter
  63. S : l avec c ajouté
  64. Prec : 1 <= rg <= longueurListe(l) + 1
  65.    non listePleine (l)
  66. **/
  67. struct ListeClient ajouterListe (struct ListeClient l, int rg, struct Client c);
  68. // Fichier : LISTECLI.H
  69. /**
  70. Interface du module listecli
  71. Fonctions spécifiques de gestion d'une liste de clients
  72. Ajout d'un client avec respect ordre alphabétique
  73. Suppression, Recherche à partir du nom de client
  74. **/
  75. #ifndef LISTECLI_H
  76. #define LISTECLI_H
  77. #include "client.h"
  78. #include "liste.h"
  79. /**
  80. N : ajouterClient
  81. R : Ajout d'un client dans une liste de CLients en conservant la liste
  82.   dans l'ordre alphabétique par recherche du rang d'insertion
  83. E :   l : la liste (Liste Client) où c doit etre ajouté
  84.   c : Client à ajouter
  85. S : l avec c ajouté
  86. Prec : non listePleine (l)
  87.    non estPresentClient (l, c.nom)
  88. **/
  89. struct ListeClient ajouterClient (struct ListeClient l, struct Client c);
  90. on me dde de créer un menu permetant plusieurs choses, notament dajouter un client dans la liste
  91. je dois respecter les en tete fourni, et dans ces en tete, on ne parle à aucun moment de pointeurs, c pr ca que j'hésite à en utiliser...
  92. à noter enfin que j'ai rajouté une fct° qui calcule le rang dinsertion dun client ds la liste pr garder le bon ordre...

Reply

Marsh Posté le 23-03-2003 à 01:50:10    

ton code est bourré de choses à ne pas faire : tableaux & strings de taille fixe, passage de structures par valeur, ...
 
si je pige (mais j'ai vraiment du mal) ton énoncé, ajouter_client_alph devrait être défini comme
 
ajouter_client_alph(l, c)
{
  ajouter_client(l, rg_dicho(l, c), c);
}
 
c'est tout.
 
//
 
je ne sais pas dans quelle optique tu fais ce TP (c'est bien un TP ?), de mon point de vue ça ne t'apporte que du mauvais : mauvaise gestion de l'outil (C est un langage bas niveau, complètement inadapté ici), mauvaise gestion des contraintes (si un jour plus de clients, ou nouveau format de numéro de téléphone, ... ça pète), mauvaise gestion des fonctionnalités (si client arabe/japonais/russe, impossible de rentrer son nom). j'espère que tu auras des cours de bases de données, sinon je t'encourage vivement à tester PHP & mysql, qui sont des outils très accessibles adaptés au besoin de l'exercice.
 
apprendre un langage, c'est bien, l'apprendre sans son contexte, je trouve ça contre-productif. dans l'idéal on enseignerait "à chaque langage son domaine d'application", et C n'a rien à faire ici.

Reply

Marsh Posté le 23-03-2003 à 09:10:01    

youdontcare a écrit :

ton code est bourré de choses à ne pas faire : tableaux & strings de taille fixe, passage de structures par valeur, ...
 
si je pige (mais j'ai vraiment du mal) ton énoncé, ajouter_client_alph devrait être défini comme
 
ajouter_client_alph(l, c)
{
  ajouter_client(l, rg_dicho(l, c), c);
}
 
c'est tout.
 
//
 
je ne sais pas dans quelle optique tu fais ce TP (c'est bien un TP ?), de mon point de vue ça ne t'apporte que du mauvais : mauvaise gestion de l'outil (C est un langage bas niveau, complètement inadapté ici), mauvaise gestion des contraintes (si un jour plus de clients, ou nouveau format de numéro de téléphone, ... ça pète), mauvaise gestion des fonctionnalités (si client arabe/japonais/russe, impossible de rentrer son nom). j'espère que tu auras des cours de bases de données, sinon je t'encourage vivement à tester PHP & mysql, qui sont des outils très accessibles adaptés au besoin de l'exercice.
 
apprendre un langage, c'est bien, l'apprendre sans son contexte, je trouve ça contre-productif. dans l'idéal on enseignerait "à chaque langage son domaine d'application", et C n'a rien à faire ici.


 
les en têtes que je vous ai donnés sont les en tete fournis par le prof lui même et à partir de ça on doit écrire les fonctions
 
concernant le passage par valeur c normal, dans un 1er tps on doit faire l'exo comme ça puis après on doit le refaire par adresse
 
d'ailleur l'énoncé dit : au delà d'un certain nb, ça marchera plus par valeur donc il faut passer par adresse  
 
c'est bien pr un TP, c'est un projet à rendre sur 15 jours et noté en fait, surtout pr mettre en pratique les cours de structure de données
 
on a des cours de bases de données après en 2nde année, je suis en DUT info
 
sinon oué t'as bien capté le truc, encore dsl pr la confusion
 
ça va marcher ça comme ça direct?
 
ajouter_client(l, rg_dicho(l, c), c);

Reply

Marsh Posté le 23-03-2003 à 09:14:33    


 
avec ce que tu m'a dit :
 
prog principal :
 
/ Insertion du client dans la liste
                             
                             liste=ajouterClient(liste,client);
 
fct° struct ListeClient ajouterClient (struct ListeClient l, struct Client c)
 
{
 
ajouterListe(l, rg_dicho(l, c), c);
     
return (l);
}
 
g :  
 
 [Linker error] undefined reference to `ajouter_client'
 
encore merci pr votre aide :hello:

Reply

Marsh Posté le 23-03-2003 à 13:18:58    

mais pourquoi as-tu ajouter_client et ajouterClient ? si ton prof te dit d'utiliser comme nom de fonction ajouter_client, tu utilises ça, pas ajouterClient.  
 
comme tu l'as écrit, il prend ça comme deux fonctions différentes.

Reply

Marsh Posté le 23-03-2003 à 13:58:28    

erreur de frappe...
 
bon, en fait c sur, il ne faut pas utiliser de pointeurs, c imposé puis après avoir fait cet éxo par valeur, il faut le refaire par adresse, c pr ns montrer qu'au delà d'un certain nb d'entrées avec d fct° par valeur, ça ne marche plus
 
un copain ayant un bon compilo (visual) me dit que chez lui ça marche sans pb
 
il semblerait donc que ça soit mon compilo qui merde
 
(dev c++ basé sur gcc)
 
quel programme me conseillez vous pr programmer en C ?
 

Reply

Marsh Posté le 23-03-2003 à 16:50:42    

Bah un compilo a jour? Par exemple Gcc sous linux, sous win je sais pas.

Reply

Marsh Posté le 23-03-2003 à 18:00:35    

c bon, c mon compilo qui merdait, chui bien déçu par Dev C++ :fou:  
 
avec borland c++ 5.01 c ok :hello:  
 
je sens que je v prendre visual moi  :whistle:

Reply

Sujets relatifs:

Leave a Replay

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