IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

probleme avec les pointeurs


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Points : 4
    Points
    4
    Par défaut probleme avec les pointeurs
    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 source1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    #include<stdio.h>
    #include<stdlib.h>
     
     
    void Trie_selection(float *ptr, int Taille)
    {
        float *tab;
        int i,j,max;
        //double tm;
        tab=(float *)malloc(Taille*sizeof(float));
        if (tab==NULL)
        {
            printf(" erreur d'allocation\n");
            exit(EXIT_FAILURE);
        }
     
        for (i = 0;i< Taille-1;i++)
        {
            max = i;
            for (j=i+1;j<Taille;j++)
            {
                if (*(ptr+i) < *(ptr+j))
                {
                    max=j;
     
                *(ptr+i) = *(ptr+i)+*(ptr+max);
                *(ptr+max)= *(ptr+i)-*(ptr+max);
                *(ptr+i)= *(ptr+i)-*(ptr+max);
                }
     
            }
            for (i=0;i<Taille;i++)
            {
                printf("tab[%d]=%f\n",i+1,*(ptr+i));
            }
        }
    }
     
    int main()
    {
        float *tab;
        int N,i;
        printf("entrez taille");
        scanf("%d", &N);
        for (i=0;i<N;i++)
        {
            printf("tab[%d]=\n",i);
            scanf("%f",tab+i);
        }
        Trie_selection(&tab,N);
        free(tab);
        return 0;
    }
    code source 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    void Trie_selection(int *ptr, int Taille)
    {
        int *tab;
        int i,j,max;
        //int tm;
        tab=(int*)malloc(Taille*sizeof(int));
        if (tab==NULL)
        {
            printf(" erreur d'allocation\n");
            return EXIT_FAILURE;
        }
        //ptr = tab;
        for (i = 0;i< Taille-1;i++)
        {
            max = i;
            for (j=i+1;j<Taille;j++)
            {
                if (*(ptr+i)< *(ptr+j))
                {
                    max=j;
                *(ptr+i) = *(ptr+i)+*(ptr+max);
                *(ptr+max)= *(ptr+i)-*(ptr+max);
                *(ptr+i)= *(ptr+i)-*(ptr+max);
                }
                /*tm= *(ptr+i);
                *(ptr+i) = *(ptr+max);
                *(ptr+max)= tm;*/
            }
            for (i=0;i<Taille;i++)
            {
                printf("tab[%d]=%d \n",i+1,*(ptr+i));
            }
        }
       // free(tab);
    }
     
     
    int main()
    {
        int i,N;
        int *tab;
        printf("taille du tableau :\n");
        scanf("%d",&N);
        tab=(int*)malloc(N*sizeof(int));
        if (tab==NULL)
        {
            printf(" erreur d'allocation\n");
            return EXIT_FAILURE;
        }
        for (i=0;i<N;i++)
        {
            printf(" tab[%d]:\n",i);
            scanf("%d",tab+i);
        }
        printf("tableau non trie\n");
        for (i=0;i<N;i++)
        {
            printf("tab[%d]:%d \n",i,*(tab+i));
        }
        printf("tableau trie\n");
        Trie_selection(tab,N);
        free(tab);
        return 0;
    }

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    Caster malloc(); n'a aucun intérêt en C.

    La fonction Trie_selection(); reçoit en paramètres un pointeur. Tu ne vérifies à aucun moment que ce pointeur est valide. un petit if (!ptr) return; par exemple.

    Pour améliorer un peu la lecture de ton code tu peux indexer un pointeur sous la forme d'un tableau. Par exemple la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (*(ptr+i)< *(ptr+j))
    On peut l'écrire aussi comme ceci :
    Pour finir je n'ai pas exécuté ton code pour voir son fonctionnement interne. Pourrais-tu nous détailler le "Ca ne marche pas" ? C'est à dire est-ce que ton programme crashe ? Ou alors est-ce le résultat qui n'est pas à la hauteur de tes attentes ?

  3. #3
    Membre averti Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Points : 333
    Points
    333
    Par défaut
    Pourquoi faire 2 codes sources ? Essayes déjà d'en faire un qui fonctionne plutôt que deux qui ne fonctionne pas .
    Je n'ai pas beaucoup de temps alors je vais parler du 1er code source , peut être du second quand j'aurais 10 minutes .

    Tout d'abord tu as des erreurs à la compilation que tu aurais pu regler sans problème ...
    test.c: In function ‘main’:
    test.c:51:20: attention : passing argument 1 of ‘Trie_selection’ from incompatible pointer type
    Trie_selection(&tab,N);
    ^
    test.c:6:6: note: expected ‘float *’ but argument is of type ‘float **’
    void Trie_selection(float *ptr, int Taille)
    ^
    tu passe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Trie_selection(&tab,N);
    à ta fonction , ici le & est inutile , et crée une erreur . Lorsque tu passe "tab" à ta fonction , c'est déjà l'adresse du premier élément du tableau , il n'y a donc pas besoin de & .

    Maintenant que ton code compile ...

    Veux-tu que ton tableau soit trié dans l'ordre inverse ? si oui , c'est le cas .
    Ensuite tu as une erreur de segmentation , l'erreur vient de ton ton dans le main , ce tableau n'a pas été alloué dynamiquement donc le free(tab) est inutile .
    Le tableau alloué dynamiquement se trouve dans la fonction Trie_selection , c'est donc ici que tu dois mettre ton .

  4. #4
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut probleme avec les pointeurs
    Bonjour
    Tu ne tiens pas compte des remarques que l'ont tes faites, brefs pour faire simple voici un code source que je poste en partant sur la base de quelques éléments de ton code sources tu pourras par la suite comparer au tien pour comprendre ce qui ne marche pas et en plus de ce qui a été mentioner comme remarque précédente, tu pouvais tout aussi bien utiliser les indices du tableau c'est-à-dire tab[i] au lieu de manipuler les pointeurs de la sorte ( mais c'est une question de choix) et ta variable "max" ne sert pas à grand-chose limite à elle ne sert à rien.
    à bientôt

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    #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 - 1 ; 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 ) );	
    	srand( time(NULL) );
     
    	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 );
    }
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  5. #5
    Membre actif

    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 87
    Points : 217
    Points
    217
    Par défaut
    Mis à part le probleme de compilation (lors du passage de tab à ta fonction Trie...), ton problème n'est pas avec les pointeurs.
    dans ce bout de code (extrait du tien):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        for (i = 0;i< Taille-1;i++)
        {...
            for (j=i+1;j<Taille;j++)
            {
              /*permutation...*/
            }
            /* la boucle qui affiche ton résultat finale est inclue dans le traitement de permutation... */        for (i=0;i<Taille;i++)
            {
                printf("tab[%d]=%f\n",i+1,*(ptr+i));
            }
            /* A sa fin le i sera égale à taille!!!)*/    }
    du coup lors de la première itération i =0 la boucle d'affichage est atteinte, ce qui met le i à la valeur max "taille" et du coup la deuxième itération sera bloquée par le i< Taille-1...

Discussions similaires

  1. un 'petit' probleme avec les pointeurs
    Par gss3000 dans le forum C++
    Réponses: 4
    Dernier message: 04/01/2010, 15h39
  2. Problem avec les pointeurs
    Par Pellodu21 dans le forum C++
    Réponses: 4
    Dernier message: 28/10/2007, 00h37
  3. Réponses: 27
    Dernier message: 24/05/2007, 23h29
  4. problem avec les pointeurs
    Par Halloula dans le forum C
    Réponses: 3
    Dernier message: 22/01/2007, 16h54
  5. [Débutant] Probleme avec les pointeurs
    Par amira dans le forum C
    Réponses: 14
    Dernier message: 04/12/2006, 14h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo