slt les amis , pouvez vous m'aider j'ai un probleme avec mon programme; je doit creer une fonction nommee Trie_selection qui prend un tableau quelconque le trie et affiche le resultat
mais mon programme ne marche pas.
voila mon code source :
#include <stdio.h>
#include <stdlib.h>
float Trie_selection(double *ptr, int Taille)
{
double *tab;
int i,j,max;
double tm;
tab=malloc(Taille*sizeof(double));
if (tab==NULL)
{
printf(" erreur d'allocation\n");
return EXIT_FAILURE;
}
for (i = 0;i< Taille-1;i++)
{
max = i;
for (j=i+1;j<Taille;j++)
{
if (*(ptr+max)< *(ptr+j))
{
max=j;
tm= *(ptr+i);
*(ptr+i) = *(ptr+max);
*(ptr+max)= tm;
}
}
for (i=0;i<Taille;i++)
{
printf("tab[%d]=%f\n",i+1,*(ptr+i));
}
}
}
int main()
{
int i,N;
double *tab;
printf("taille du tableau :\n");
scanf("%d",&N);
tab=malloc(N*sizeof(double));
if (tab==NULL)
{
printf(" erreur d'allocation\n");
return(EXIT_FAILURE);
}
for (i=0;i<N;i++)
{
printf(" tab[%d]:",i);
scanf("%f",tab+i);
}
printf("tableau non trie\n");
for (i=0;i<N;i++)
{
printf("tab[%d]:%f\n",i,tab[i]);
}
printf("tableau trie\n");
Trie_selection(&tab,N);
free(tab);
return 0;
}
# peut-etre faudrait il en savoir plus ?
Posté par NeoX . Évalué à 3. Dernière modification le 01 octobre 2014 à 22:22.
il compile ?
il s'execute ?
si tu fais des tableaux simples genre avec 3 elements A/B/C ou 10/20/30
cela fonctionne-t-il ?
tu as essayé avec un debugger ?
et sinon il dit quoi ton cours ?
chez moi (OSX) ca compile avec 3 Warnings sur les types
et ca marche, enfin le programme s'execute sans erreur,
juste qu'il ne fait pas ce que tu esperes qu'il va faire
# epitech
Posté par max22 . Évalué à 5.
toi aussi tu es dans la piscine C à epitech ? ;)
[^] # Re: epitech
Posté par yohann (site web personnel) . Évalué à 1.
ça m'étonnerais, on utilise pas de libs à la piscine d'epitech
# Corrections
Posté par max22 . Évalué à 2.
Après tout ca, il reste sans doute une petite erreur quelque part car il y a un élément qui n'est pas trié avec les nombres que j'ai testés.
[^] # Re: Corrections
Posté par lasher . Évalué à 2.
Nope,
%f
fonctionne pourfloat
etdouble
(en fait%f
prend implicitement undouble
).Tu as raison pour le reste, et même non seulement
tab
est inutilisé dansTrie_selection
, mais en plus il n'est libéré.Je me demande aussi pourquoi jhonbouda utilise la notation pointeur
*(ptr+deplacement)
plutôt que la notation tableauptr[deplacement]
.[^] # Re: Corrections
Posté par lasher . Évalué à 2. Dernière modification le 08 octobre 2014 à 04:24.
Je te réponds de nouveau, et autant utiliser
%f
dansprintf
visiblement ça marche, autant pourscanf
pas du tout et tu as raison, il faut%lf
.# Commentaire supprimé
Posté par Anonyme . Évalué à 3.
Ce commentaire a été supprimé par l’équipe de modération.
[^] # Re: Suite à une relecture
Posté par François GUÉRIN (Mastodon) . Évalué à 2.
Salut,
Pour rebondir suer ce post :
Je ne sais pas coder en C (enfin, c'est très vieux), mais je suis développeur quand même (en python > no_troll).
Il y a un truc qui me choque dans le code présenté ci dessus :
* mélange de casses (camel + '_') pour le nom de fonction !?
* noms de variables en français et / ou inconsistant (*ptr, c'est quoi ?)
* … au moins l'indentation à l'air correcte … mais c'est peut-être le site qui l'a faite
Ça n'est pas grand chose, mais ça pique aux yeux :)
Autant prendre tout de suit les bonnes habitudes !
https://linuxfr.org/users/niconico/journaux/beaute-du-code
Bon courage pour les études !
# puisque tout le monde s'y met
Posté par fearan . Évalué à 2. Dernière modification le 02 octobre 2014 à 18:55.
un malloc sans free c'est une très mauvaise pratique tu devrai être pendu !!!! on écrit un malloc, on gère le free immédiatement après avoir écrit le malloc, c'est pas dans un TODO qu'on fera si on a le temps.
pas de majuscule pour les noms de fonctions/variable, bon c'est pas absolu, notamment si c'est des initiales, mais pour une fonction de tri, on va juste dire tri_selection ou triSelection.
le tri peu être fait différemment mais ça c'est une autre histoire, et pleins d'autre cours
sinon tu peux aussi utiliser
mais c'est tricher ;)
Il ne faut pas décorner les boeufs avant d'avoir semé le vent
[^] # Re: puisque tout le monde s'y met
Posté par Michaël (site web personnel) . Évalué à 3.
C'est peut-être une affaire de goût, mais je préfère écrire
que la version avec l'opérateur ternaire.
# Il faut apprendre à respecter les règles !
Posté par Single . Évalué à 0.
Je n'ai même pas regardé ton source… Quand je vois à quel point tu ne respectes pas les règles de grammaire que tu as pourtant dû apprendre et réviser pendant des années et des années, tu vas avoir énormément de mal à te faire comprendre d'un compilateur.
[^] # Re: Il faut apprendre à respecter les règles !
Posté par Enzo Bricolo 🛠⚙🛠 . Évalué à 5.
N°7
[^] # Re: Il faut apprendre à respecter les règles !
Posté par freem . Évalué à 4.
Un source, ça n'existe pas. Une source, à la rigueur… mais ce n'est pas la même chose.
[^] # Re: Il faut apprendre à respecter les règles !
Posté par lasher . Évalué à 2.
Euh, si en fait c'est clairement utilisé aussi.
[^] # Re: Il faut apprendre à respecter les règles !
Posté par freem . Évalué à 2.
C'est utilisé, oui, mais c'est un abus de langage. De la part de quelqu'un qui fait chier le monde à faire le grammar nazi, je trouve ça incorrect.
# Quelques commentaires additionnels
Posté par lasher . Évalué à 3.
Salut,
En plus des commentaires que les gens t'ont donné, j'en rajoute une couche. :-)
gcc
ouclang
, je te conseille fortement l'utilisation de ces options de compilation sur la ligne de commande :-Wall -Wextra -pedantic -Werror
. Si tu apprends sous Windows, Visual C++ peut aussi se régler avec un niveau d'avertissement maximal. Pour les projets qu'on donne aux élèves en fac/IUT/école d'ingé, il y n'y a jamais de bonne raison de laisser un warning/avertissement du compilateur traîner. Dans la vraie vie non plus d'ailleurs, m'enfin parfois on a pas le choix…scanf
retourne une valeur qui peut-être utilisée pour savoir s'il y a eu une erreur de lecture. J'avais oublié de rentrer la taille du tableau avant de lire les nombres, et du coup scanf a gobé mon "10.4" goulûment sans sourciller. Et du coup il a évidemment tronqué l'entrée dansstdin
.scanf
est la fonction du diable, tellement que des gens dédient des pages complètes à son sujet. Je suppose que tes profs te demandent de l'utiliser, mais je te conseille fortement d'utiliserfgets
etstrtol
à la place (je donne un exemple en bas).sscanf
,fscanf
, etc., sont « sûres » en supposant que les entrées soient déjà formatées comme il faut (hint: en C il ne faut jamais assumer quoi que ce soit sauf si on maîtrise la chaîne complète de production/consommation — et encore, même ainsi il faut rester vigilant).for
dans une autre bouclefor
, ce qui fait que tu mélanges les valeurs pour la variablei
.ptr
comme à un tableau, la notation indicée me semble plus indiquée.Voici une version utilisant la notation C89 pour déclarer les variables au plus près de leur utilisation dans le code. Je n'ai pas touché à la logique du code lui-même, sauf pour la boucle imbriquée pour pouvoir lui donner un indice différent de
i
(qui est un bug hein !). J'ai aussi transformé les accès « pointeur » en accès « tableau » pour que ce soit plus lisible :Voici le même code, version C99 :
Enfin, en utilisant les options que je préconise au-dessus, je me fais engueuler par
gcc
:En regardant chaque erreur sortie par le compilateur, je peux réparer une bonne partie de tes bugs (je garde la forme C99) :
J'ai remplacé le retour de ta fonction de tri par
void
(vu que tu ne retournes pas de valeur et quegcc
se plaint). Du coup, j'utilise la fonctionexit
dans ta fonction de tri au lieu dureturn EXIT_FAILURE
. J'ai enlevé le&
devanttab
dans tonmain
puisque le compilateur nous dit qu'on passedouble **
alors que la fonction de tri prend undouble *
. J'ai changé%f
pour%lf
aussi.Malgré tout ça, il y a de sérieux problèmes de logique liés à l'algorithmique.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.