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
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(float *ptr, int Taille)
{
    int tab[Taille];
    int i,j,max;
    float tmp;

    ptr = tab;
    for (i = 0;i< Taille-1;i++)
    {
        max = i;
        for (j=i+1;j<Taille;j++)
        {
            if (*(ptr+max)< *(ptr+j))
            {
                max=j;
            }
            tmp= *(ptr+i);
            *(ptr+i) = *(ptr+max);
            *(ptr+max)= tmp;
        }
        for (i=0;i<Taille;i++)
        {
            printf("tab[%d]=%f",i+1,*(ptr+i));
        }
    }
}


int main()
{
    int i,N;
    float *tab;
    printf("taille du tableau :\n");
    scanf("%d",&N);
    tab=(float*)malloc(N*sizeof(float));
    if (tab==NULL)
    {
        printf(" erreur d'allocation");
        exit(EXIT_FAILURE);
    }
    for (i=0;i<N;i++)
    {
        printf(" tab[%d]:",i);
        scanf("%f",*(tab+i));
    }
    printf("tableau non trie");
    for (i=0;i<N;i++)
    {
        printf("tab[%d]:%f",i,*(tab+i));
    }
    printf("tableau trie");
    Trie_selection(tab,N);
    return 0;
}

merci pour votre aide

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
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,
1
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
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,
1
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
j'ai utilise ptr = tab pour faire pointer ptr sur le tableau.
0
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
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.
0
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
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
0
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
d'accord merci pour votre aide
0
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
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;
}
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
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.
0

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
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
 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
0
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
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,
0
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
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
0