Besion d'aide avec les pointeurs
Résolu/Fermé
jhonbouda
Messages postés
25
Date d'inscription
samedi 21 juin 2014
Statut
Membre
Dernière intervention
30 décembre 2014
-
29 sept. 2014 à 21:43
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 4 oct. 2014 à 17:19
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 4 oct. 2014 à 17:19
A voir également:
- Besion d'aide avec les pointeurs
- Besion de conseil pour tomorrowland - Forum Loisirs / Divertissements
- Besion d aide pour telecommande sony rm-v301 - Forum Téléviseurs
- Placer les pointeurs statistiques??? ✓ - Forum Webmastering
- Besion de convertisseur pour philips gogear - Forum Format et connectique vidéo
- Manipulation des pointeurs - Forum C
5 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
29 sept. 2014 à 21:59
29 sept. 2014 à 21:59
Bonjour,
float *tab;
Oublie les float. Je te conseille d'utiliser les double.
tab=(float*)malloc(N*sizeof(float));
Pas besoin de caster avec (float*). C'est même plutôt déconseillé en fait :-).
exit(EXIT_FAILURE);
Ta fonction main() doit retourner un int. Donc pas de exit(). Utilise plutôt : return EXIT_FAILURE;
scanf("%f",*(tab+i));
Il faut mettre l'adresse de la variable. C'est-à-dire : tab+i. *(tab+i) représente la valeur pointée se trouvant à l'adresse tab+i.
N'oublie pas de mettre des '\n'. Sinon, ça va pas être propre...
Il en faut au moins un avant le return 0;...
int tab[Taille];
Tu n'as pas le droit de faire ça. Il faut utiliser malloc() comme tu as fait dans le main().
Note : pourquoi utiliser *(tab+i) au lieu de tab[i] qui est plus concis et plus lisible ?
Cdlt,
float *tab;
Oublie les float. Je te conseille d'utiliser les double.
tab=(float*)malloc(N*sizeof(float));
Pas besoin de caster avec (float*). C'est même plutôt déconseillé en fait :-).
exit(EXIT_FAILURE);
Ta fonction main() doit retourner un int. Donc pas de exit(). Utilise plutôt : return EXIT_FAILURE;
scanf("%f",*(tab+i));
Il faut mettre l'adresse de la variable. C'est-à-dire : tab+i. *(tab+i) représente la valeur pointée se trouvant à l'adresse tab+i.
N'oublie pas de mettre des '\n'. Sinon, ça va pas être propre...
Il en faut au moins un avant le return 0;...
int tab[Taille];
Tu n'as pas le droit de faire ça. Il faut utiliser malloc() comme tu as fait dans le main().
Note : pourquoi utiliser *(tab+i) au lieu de tab[i] qui est plus concis et plus lisible ?
Cdlt,
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
29 sept. 2014 à 22:11
29 sept. 2014 à 22:11
Ouah, j'avais pas vu : ptr = tab;
Que veux-tu faire avec ça ?
Et d'ailleurs pourquoi tu fais un tableau temporaire ? Tu en as pas besoin.
Et pendant que j'y pense, n'oublie pas les free.
Cdlt,
Que veux-tu faire avec ça ?
Et d'ailleurs pourquoi tu fais un tableau temporaire ? Tu en as pas besoin.
Et pendant que j'y pense, n'oublie pas les free.
Cdlt,
jhonbouda
Messages postés
25
Date d'inscription
samedi 21 juin 2014
Statut
Membre
Dernière intervention
30 décembre 2014
1
29 sept. 2014 à 22:38
29 sept. 2014 à 22:38
j'ai utilise ptr = tab pour faire pointer ptr sur le tableau.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
29 sept. 2014 à 22:57
29 sept. 2014 à 22:57
Le problème c'est que tab ne vaut rien. Il est vide puisque tu le recrées dans la fonction. Si tu fais ça, ça sert à rien d'envoyer ptr en paramètre... Il faut que tu revoies ce point.
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
29 sept. 2014 à 23:10
29 sept. 2014 à 23:10
Je pourrais rajouter également que le float est légèrement inutile un int pourrais très bien faire le travaille mais c'est une question de choix.
La taille du tableau en paramètre à la fonction de trie doit être une constante qui ne peut être modifiée et comme dit @fiddy le tableau temporaire sert strictement à rien, la boucle qui est a la ligne 25 n'a pas ça place ici, elle est superflue et inutile sachant surtout que le rôle de la fonction est de trié et non trié & afficher.
Un bon conseil suit les remarques de @fiddy
à bientôt
La taille du tableau en paramètre à la fonction de trie doit être une constante qui ne peut être modifiée et comme dit @fiddy le tableau temporaire sert strictement à rien, la boucle qui est a la ligne 25 n'a pas ça place ici, elle est superflue et inutile sachant surtout que le rôle de la fonction est de trié et non trié & afficher.
Un bon conseil suit les remarques de @fiddy
à bientôt
jhonbouda
Messages postés
25
Date d'inscription
samedi 21 juin 2014
Statut
Membre
Dernière intervention
30 décembre 2014
1
29 sept. 2014 à 23:38
29 sept. 2014 à 23:38
d'accord merci pour votre aide
jhonbouda
Messages postés
25
Date d'inscription
samedi 21 juin 2014
Statut
Membre
Dernière intervention
30 décembre 2014
1
1 oct. 2014 à 21:53
1 oct. 2014 à 21:53
slt j'ai modifie le code comme demande mais je ne sais pas si j'ai tout respecte vous me conseillez .
#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++) {8 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; }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
2 oct. 2014 à 00:14
2 oct. 2014 à 00:14
Hello,
scanf("%f",tab+i);
tab[i] est un double. Il faut donc mettre : %lf (L minuscule) et non %f.
Trie_selection(&tab,N);
Il faut mettre tab simplement (et non & tab). tab représente l'adresse du tableau dans ce contexte.
float Trie_selection(double *ptr, int Taille)
Pourquoi mettre float Trie... ? Cette fonction ne renvoie rien. Donc autant mettre : void Trie...
Dans la fonction Trie_selection() : tu mets double *tab; mais tu ne t'en sers pas. Donc c'est inutile. Tu peux donc le retirer ainsi que le malloc, etc. Ainsi que le if().
if (*(ptr+max)< *(ptr+j))
Tu peux utiliser if(ptr[max]<ptr[j]), plus concis et plus lisible que *(ptr+max)<*(ptr+j).
(Je remets, vu que t'avais pas répondu à ma question ;-)).
for (i=0;i<Taille;i++)
{8
printf("tab[%d]=%f\n",i+1,*(ptr+i));
}
Que fait le 8 ici ?
Tu mets l'affichage dans la fonction de tri. C'est pas super... Je te conseille de faire une fonction d'affichage plutôt.
scanf("%f",tab+i);
tab[i] est un double. Il faut donc mettre : %lf (L minuscule) et non %f.
Trie_selection(&tab,N);
Il faut mettre tab simplement (et non & tab). tab représente l'adresse du tableau dans ce contexte.
float Trie_selection(double *ptr, int Taille)
Pourquoi mettre float Trie... ? Cette fonction ne renvoie rien. Donc autant mettre : void Trie...
Dans la fonction Trie_selection() : tu mets double *tab; mais tu ne t'en sers pas. Donc c'est inutile. Tu peux donc le retirer ainsi que le malloc, etc. Ainsi que le if().
if (*(ptr+max)< *(ptr+j))
Tu peux utiliser if(ptr[max]<ptr[j]), plus concis et plus lisible que *(ptr+max)<*(ptr+j).
(Je remets, vu que t'avais pas répondu à ma question ;-)).
for (i=0;i<Taille;i++)
{8
printf("tab[%d]=%f\n",i+1,*(ptr+i));
}
Que fait le 8 ici ?
Tu mets l'affichage dans la fonction de tri. C'est pas super... Je te conseille de faire une fonction d'affichage plutôt.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
4 oct. 2014 à 15:54
4 oct. 2014 à 15:54
Bonjour
Tu ne tiens pas compte des remarques de @fiddy bref
voici un programme qui marche.
Pour ce qui est des pointeurs et comme ce que @fiddy à souligner pour faire simple tu pouvais tout aussi bien utiliser les indice du tableau c'est-à-dire
à bientôt
Tu ne tiens pas compte des remarques de @fiddy bref
voici un programme qui marche.
Pour ce qui est des pointeurs et comme ce que @fiddy à souligner pour faire simple tu pouvais tout aussi bien utiliser les indice du tableau c'est-à-dire
tab[i]et ta variable "max" ne sert pas à grand chose limite à elle ne sert a rien.
#include <time.h> #include <stdio.h> #include <stdlib.h> /*** * Fonction trie selectif ***/ void f_TrieSelection( int *pTab, unsigned int const iSize ){ unsigned int i = 0; unsigned int j = 0; unsigned int k = 0; for( i = 0; i < iSize; i++ ){ for( j = i+1; j < iSize; j++ ){ if( *(pTab+i) > *(pTab+j) ){ k = *(pTab+i); *(pTab+i) = *(pTab+j); *(pTab+j) = k; } } } } /*** * Fonction principale ***/ int main( void ){ int *pTab = NULL; pTab = (int*)calloc( 10, sizeof( int ) ); static unsigned int iSeed = 0; if( !iSeed ){ srand( time(NULL) ); iSeed = 1; } unsigned int i = 0; for( i = 0; i < 10; i++ ){ *(pTab+i) = rand()%20; } //Affichage du tableau non trier for( i = 0; i < 10; i++ ){ printf(" %d ", *(pTab+i) ); } printf("\n"); f_TrieSelection( pTab, 10 ); for( i = 0; i < 10; i++ ){ printf(" %d ", *(pTab+i) ); } printf("\n"); free( pTab ); return ( 0 ); }
à bientôt
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
4 oct. 2014 à 16:14
4 oct. 2014 à 16:14
Salut sambia39,
(int*)calloc
Cast inutile en ISO C :-).
Attention à bien mettre tes déclarations de variables en début de bloc et pas en plein milieu (exemple pour static int iSeed, pour unsigned i)
static unsigned int iSeed = 0;
Sinon, je ne vois pas l'intérêt de cette variable ? La fonction main() n'est lancée qu'une fois. Donc autant mettre directement srand(time(NULL)); A moins que ?
for( i = 0; i < iSize; i++ ){
for( j = i+1; j < iSize; j++ ){
Attention avec les indices dans les for...
i prendra iSize - 1 en max. Donc j vaudra iSize.
Donc si tu fais pTab[j] => débordement. Risque d'erreur dans le code...
Cdlt,
(int*)calloc
Cast inutile en ISO C :-).
Attention à bien mettre tes déclarations de variables en début de bloc et pas en plein milieu (exemple pour static int iSeed, pour unsigned i)
static unsigned int iSeed = 0;
Sinon, je ne vois pas l'intérêt de cette variable ? La fonction main() n'est lancée qu'une fois. Donc autant mettre directement srand(time(NULL)); A moins que ?
for( i = 0; i < iSize; i++ ){
for( j = i+1; j < iSize; j++ ){
Attention avec les indices dans les for...
i prendra iSize - 1 en max. Donc j vaudra iSize.
Donc si tu fais pTab[j] => débordement. Risque d'erreur dans le code...
Cdlt,
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
4 oct. 2014 à 17:19
4 oct. 2014 à 17:19
Salut @ fiddy ;)
Pour la boucle "for" tu as raison mais comme je le fais défois de tête alors j'ai posté directement le code quant au seed c'est pareil j'ai habitude de verrouille le seed dans une fonction pour m'assurer que j'ai plus ou moins des valeur aléatoire mais dans mon exemple ce n'est pas le cas -_- valeur répétitive bref
le calloc franchement c'est la méthode vieux jeux que j'ai pas changer et je te l'accorde et du coup j'ai rectifié mon poste enfin sur un notre forum merci @fiddy
à bientôt
Pour la boucle "for" tu as raison mais comme je le fais défois de tête alors j'ai posté directement le code quant au seed c'est pareil j'ai habitude de verrouille le seed dans une fonction pour m'assurer que j'ai plus ou moins des valeur aléatoire mais dans mon exemple ce n'est pas le cas -_- valeur répétitive bref
le calloc franchement c'est la méthode vieux jeux que j'ai pas changer et je te l'accorde et du coup j'ai rectifié mon poste enfin sur un notre forum merci @fiddy
à bientôt