Bonsoir a tous,
voila, j'avais un travail a faire pour jusqu'a ce soir minuit concernant la gestion d'une fiche patient (struct)
bref, le général m'as l'air "fini"
le problème c'est que ma fonction d'insertion n'as pas l'air de fonctionner et je ne trouve pas pourquoi... ca me rend dingue et le temps m'est compté, donc, si un de vous à le temps de jeter un coup d’œil ca serait magnifique.
je précise, le tri par insertion fonctionne sur les fiches déja encodé (qui sont déclarées à la création du vecteur de fiche) par contre, l'insertion ne se fait pas bien (ligne 413);
Au lieu de s’enserrer correctement dans le vecteur (donc de s’insérer en se triant) il se contente de l’insérer à la fin...
http://paste.maxux.net/203540331
en vous remerciant d'avance ![]()
J'abandonne à la ligne 7. Aucun espoir que le code marche quand je vois une macro pareille.
En vrai, je suis quand même allé plus loin par curiosité :
« void main() »
PAN ! main doit TOUJOURS retourner un "code d'erreur" de type int.
« printf("\n En esp%crant que ce programme vous auras %ct%c utile et agr%cable %c l'utilisation \n",138,130,130,130,133); »
il n'aura pas été agréable à programmer en tout cas. Si les accents ne passent pas directement, change d'éditeur de texte pour coder.
« fflush(stdin); »
c'est pas un truc complètement absurde ça ? (ceci est une vraie question)
« gets » ligne 737
donc absolument TOUT peux arriver en exécutant ton code.
« memcpy »
WOW. Tu es sûr de devoir utiliser un truc aussi ba niveau ? Et tu es sûr de t'en servir comme il faut ?
Il ne manquerait pas un else ligne 933 ?
Quant au "blindage"... bravo... faire autant d'effort pour à peu près rien est remarquable. Si d'aventure tu devais refaire une chose pareil, préviens moi et je t'expliquerai comment utiliser lex/yacc (histoire d'en avoir pour 50 lignes maxi).
Bref, tout ça pour dire que je ne comprends pas la logique entre les lignes 1180 et 1182. Tu compares insert à une case du tableau, ok... mais pourquoi tu échanges deux cases du tableau juste en dessous ? ![]()
PS: bonjour, et désolé pour le ton agressif de mon message précédent. Tu n'as pas à profiter de ma journée de merde (à déboguer du code bien pire que le tiens... et pourtant écrit par quelqu'un qui est censé savoir codé
)
tout d'abord, merci pour tes critiques, j'avais complètement zappé le gets de insertiondate,
concernant le void main, vu que c'est une application console de bas niveaux, nous n'utilisons aucun retour de valeur.
concernant les %c pour l'affichage, c'est tout simplement parce que nous ne somme pas obligé de travailler avec accent, c'est juste moi qui passe mon temps à le faire pour le plaisir.
concernant fflush(stdin) je me demande si ce n'est pas plutôt ta question qui est absurde, si tu n'en voi pas l'utilité, c'est que dois être en partie à mon avis (3éme mois d'apprentissage en cours du soir).
memcpy n'est pas de moi, c'est un ami qui m'as passé son code de tri par insertion, je l'ai donc juste adapté au minimum à mon programme, je sait juste qu'il copie la structure entière pour eviter de passer son temps à recopier la structure champs par champs.
il me semble qu'il y'a bien un else pour la ligne 933
concernant le blindage, j'ai demandé de l'aide sur ce forum, puis j'ai fini par tenter moi même un blindage de mon coté, n sachant que je ne peut pas me contenter d'un blindage de niveaux "verif=scanf(...);" vu que je dois retourner une phrases d'erreur bien définie à l'user.
entre la ligne 1180 et 1182 se trouve la logique même du tri par insertion
si la case est plus petite, je l'efface en prenant la case suivante.
en te remerciant d'avoir pris le temps de lire mon programme.
pas de problème, on à tous un jour pourris de temps en temps :D
ca fait 2 jours que je tente de trouver pourquoi il ne trie pas les fiches encodées et ca me rend malade, j'en perd patience aussi...
surtout que je me suis retrouvé avec un code trop lourd pour si peu...
« nous n'utilisons aucun retour de valeur. »
mais il en FAUT une. Le système est en droit de la récupérer et d'en faire des choses utiles, même si toi tu n'en fais jamais rien.
« nous ne somme pas obligé de travailler avec accent, c'est juste moi qui passe mon temps à le faire pour le plaisir. »
oui, enfin ta technique pour afficher des accents elle n'est plus utilisée depuis 1975. ![]()
Normalement, tu peux mettre directement des accents dans le premier champ de ton printf, et ça marche.
« memcpy n'est pas de moi »
dans ce cas, tu ferais mieux de l'éviter. Un struct, ça peut se manipuler comme un int normalement. Typiquement,
struct INDEX insert = tableau[i];
ou
tableau[i] = tableau[i+1];
ça devrait marcher.
« si la case est plus petite, je l'efface en prenant la case suivante. »
certes. Mais il y a une constante dans les tris (basés sur des échanges). Tu échanges TOUJOURS le deux éléments que tu viens de comparer. Hors là, tu fais autre chose, et à mon avis c'est là qu'est le soucis.
Quant au flush de stdin, je vais rechercher. Mais il me semble que c'est une énorme boulette, au sens où ça ne fait absolument pas ce qu'on attent de lui (à savoir vider l'entrée standard des données superflues).
[Si échange il y a, ] tu échanges TOUJOURS le deux éléments que tu viens de comparer. ![]()
" Tu échanges TOUJOURS le deux éléments que tu viens de comparer. "
Il le fait après la boucle while avec :
memcpy(ptindex+i+1, insert, sizeof(struct INDEX));
Le code du tri insertion, bien qu'assez fouillis, est correct, c'est ailleurs que ça merde.
j'utilise code::block pour le tout,
théoriquement, ce tri fonction pour les fiches que je déclare dans le vecteur, mais vas savoir pourquoi cela ne fonctionne pas avec les fiches que j'encode moi même.
le fflush de ce que je me souviens sert à "vidder le buffer", en gros, éviter que fgets (ou scanf,gets,getch, ...) ne prenne une valeur entrée par l'utilisateur par mégarde (et nos testeur prennent un malin plaisir a appuyer sur des touches au hasard par-ci par la, je voulais être sur que le buffer sois propre au moment de la saisie de l'user.
À la réflexion, tu fais un tri bulle en fait. Tu en es conscient ? la consigne parle explicitement d'un tri par insertion ?
Et je persiste et signe : tu as un soucis soit dans le test de ta boucle (comparer les cases i et i+1 donnerait un tri bulle), soit dans l'affectation DANS la boucle (échanger la case i et insert donnerait un tri par insertion).
Pocolo: ha zut... j'avais pas fait gaffe à l'interlocuteur. Mais non, il ne le fait pas, après la boucle, il faut la partie "insertion" du tri par insertion. Mon problème est qu'il échange les cases i et i+1 DANS la boucle alors que ces deux valeurs n'ont pas été comparées, ce qui n'a moralement aucun sens.
oui, c'est spécifiquement un tri par insertion que je dois faire (le dossier précédent était un heap sort, ce qui était mieux adapté)
le tri par insertion ressemble au tri a bulle, en commenceant par la fin, c'est juste qu'ont fait decaller toutes les cases vers la droite, jusqu'a trouvé une valeur plus grande et la, on insert le produit
poupstm2: petite précision, je suis prof d'info (même si l'état actuel de mon cerveau doit me faire descendre au niveau d'étudiant en master/école d'ingé
).
Si tu veux trouver la plus grande valeur d'un bout de tableau, tu dois donc bien comparer la case i et ta variable insert. En revanche, dans ta boucle while (ligne 1182), ce sont ces deux quantités là que tu dois échanger, pas les cases i et i+1.
car a partir de 1194 c'est la fonction insertion, elle ne fait que décaler les structures vers la droite :
while(i >= 0 && strcmp((ptindex+i)->Nom, insert->Nom) > 0)
tant que ptindex+i est inférieur a insert
une foi ces décalages fait, memcpy insert la structure "insert"
je cherche a faire comme j'ai fait a partir de la ligne 211
mais pour les structures
Désolé mais c'est bien un tri insertion et il est bien correct, je sais que c'est peut-être dur à voir ici mais j'en suis assez certain.
Et autrement regarde bien les arguments que tu transmets dans l'appel de la fonction finsertion à la ligne 413 :
finsertion((pstrucIND-nbc+1), nbc,(pstrucIND-nbc+1));
Y'a comme un problème là il me semble. ![]()
ca c'est dans mes tentatives de débugages :D
a la base il passe
finsertion(pstrucIND,nbc,&tempo);
" finsertion(pstrucIND,nbc,&tempo); "
Et là à quoi correspond chaque argument?
pstrucIND c'est l'adresse de la première cases du vecteur de structures d'index
nbc c'est le nombre de fiches existantes
&temp c'est une structure temporaire qui contient les données à indexer (NumCarteSis, nom, prénom, position)
(mais il me semble qu'elle ne sert a rien et peut être remplacé par pstruncIND+nbc-1)