: Problème de paramètres avec fonctions qui appelent fonctions [C] - C++ - Programmation
Marsh Posté le 22-03-2003 à 17:18:03
Code :
|
Ca sort d'ou ca?
Marsh Posté le 22-03-2003 à 17:37:23
Code :
|
il faut bien que je mette mon client dans la liste au rang que je viens de calculer non
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.
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...
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 ...
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
Marsh Posté le 23-03-2003 à 00:42:03
Code :
|
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.
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, ... |
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);
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
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.
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 ?
Marsh Posté le 23-03-2003 à 16:50:42
Bah un compilo a jour? Par exemple Gcc sous linux, sous win je sais pas.
Marsh Posté le 23-03-2003 à 18:00:35
c bon, c mon compilo qui merdait, chui bien déçu par Dev C++
avec borland c++ 5.01 c ok
je sens que je v prendre visual moi
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?
Message édité par schumacher le 22-03-2003 à 16:39:27