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 de pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 132
    Par défaut probleme de pointeurs
    bonjour,

    je suis en train d'essayer d'implémenter le tri par fusion sur une liste chainée

    pour cela j'ai ecrit une fonction récursive trier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void trier(PTR tete, PTR queue)
    {
      if(tete->indice > queue->indice)
      {
       trier(tete->indice, (tete->indice + queue->indice)/2);
       trier((((tete->indice + queue->indice)/2)+1), tete->indice);
       //fusion(tete->indice, queue->indice);
      }
     
      return;
    }
    lors des appels récursifs de la fonction trier les paramètres sont des entiers
    et bien sur à la compilation cela me donne "'trier' makes pointer from integer without a cast" car la fonction n'est appellée avec les bons paramètres.

    Mais j'ai besoin des pointeurs tete et queue pour pouvoir lire la valeur de l'entier indice...

    comment résoudre ce problème ?

    Merci

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tomasi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void trier(PTR tete, PTR queue)
    {
    }
    lors des appels récursifs de la fonction trier les paramètres sont des entiers
    et bien sur à la compilation cela me donne "'trier' makes pointer from integer without a cast" car la fonction n'est appellée avec les bons paramètres.
    i
    Pourquoi ne pas mettre le bon type au lieu de ce PTR dont la définition n'est pas visible ?

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 132
    Par défaut
    le bon type ?

    c'est à dire int ?

    j'ai essayé et voila ce que ca donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void trier(int tete, int queue)
    {
      if(tete->indice > queue->indice)
      {
       trier(tete->indice, (tete->indice + queue->indice)/2);
       trier((((tete->indice + queue->indice)/2)+1), tete->indice);
       //fusion(tete->indice, queue->indice);
      }
     
      return;
    }
    et ca me retourne un paquet d'erreurs

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Peut-être parce que PTR, c'est pas un int.

    Comment est définie PTR?

    Montre nous le typedef.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 132
    Par défaut
    voici le code en entier

    la fonction fusion n'est pas encore écrite, je ne sais pas trop encore comment m'y prendre...

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    //longueur de la liste
    #define N 5
     
    //définition de l'identificateur MAILLON
    typedef struct maillon MAILLON;
    ////définition de l'identificateur PTR comme pointeur vers un MAILLON
    typedef MAILLON *PTR;
     
    /*définition de la structure maillon composée d'un entier
      et d'un pointeur vers une structure définie comme celle-ci
    */
    struct maillon
    {
      int valeur;
      int indice;
      struct maillon *suivant;
    };
     
    /*au commencement la liste est vide,
      le pointeur de tete pointe donc vers NULL
    */
    PTR tete = NULL, queue;
     
     
    void creer_liste(PTR p)
    {
      int i,j=0;
     
    /*permet d'avoir une séquence différente à chaque lancement du programme,
      passage une valeur 'changeante' à srand(),
      utilisation de la valeur retournée par time()
      qui change une fois par seconde indépendemment du programme
    */
      srand((unsigned) time(NULL));
     
      for(i = 0; i < N; ++i)
      {
        p = malloc(sizeof(MAILLON));
        if(p == NULL)
        {
          printf("Probleme d'allocation de mémoire \n");
          exit(-1);
        }
     
        p->valeur = rand() % (N+1);
        p->indice = j++;
        p->suivant = NULL;
        if(tete == NULL)
          tete = p;
        else
          //recupération du dernier élément de la liste avec le pointeur queue
          queue->suivant = p;
        queue = p;
      }
     
      return;
    }
     
     
    void trier(int tete, int queue)
    {
      if(tete->indice > queue->indice)
      {
       trier(tete->indice, (tete->indice + queue->indice)/2);
       trier((((tete->indice + queue->indice)/2)+1), tete->indice);
       //fusion(tete->indice, queue->indice);
      }
     
      return;
    }
     
     
    void fusion(PTR tete, PTR queue)
    {
     
     
      return;
    }
     
     
    void afficher(int cas, PTR p)
    {
      if(cas == 1)
      printf("Voici la liste non triée : \n");
      else if(cas == 2)
      printf("Voici la liste triée : \n");
     
      for(p = tete; p != NULL; p = p->suivant)
        printf(" *%d - %d* ", p->valeur, p->indice);
        //printf(" *%d* ", p->valeur);
      printf("\n");
     
      return;
    }
     
     
    int main()
    {
      PTR p;
     
      creer_liste(p);
     
      afficher(1, p);
     
      system("pause")
     
      return EXIT_SUCCESS;
    }

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tomasi
    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
     
    struct maillon
    {
      int valeur;
      int indice;
      struct maillon *suivant;
    };
     
    void trier(PTR tete, PTR queue)
    {
      if(tete->indice > queue->indice)
      {
       trier(tete->indice, (tete->indice + queue->indice)/2);
       trier((((tete->indice + queue->indice)/2)+1), tete->indice);
       //fusion(tete->indice, queue->indice);
      }
     
      return;
    }
    Les paramètres de trier() sont de type PTR . Le seul pointeur que je vois dans un PTR est "struct maillon *suivant;".

    Mais j'ai un peu du mal à comprendre ta liste, et notamment le rôle de indice...

    Un parcours récursif de liste se fait en principe comme ceci :
    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
     
    struct node
    {
       struct node *p_next;
     
       /* data... */
    };
     
    void parcourir (struct node *p)
    {
       if (p != NULL)
       {
         /* traitement en croissant */
          parcourir (p->p_next);
         /* traitement en decroissant */
       }
    }

Discussions similaires

  1. probleme de pointeur ....
    Par berg dans le forum C
    Réponses: 6
    Dernier message: 12/01/2006, 22h46
  2. Probleme de pointeur
    Par Naruto_kun dans le forum C
    Réponses: 17
    Dernier message: 14/12/2005, 20h47
  3. Probleme de pointeurs
    Par mickyoun dans le forum C++
    Réponses: 9
    Dernier message: 10/08/2004, 17h15
  4. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26
  5. probleme avec pointeurs de structures
    Par remi77 dans le forum C
    Réponses: 2
    Dernier message: 20/10/2003, 13h19

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