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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 130
    Points : 146
    Points
    146
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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 ?
    Pas de Wi-Fi à la maison : CPL

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 130
    Points : 146
    Points
    146
    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 éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

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

    Comment est définie PTR?

    Montre nous le typedef.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 130
    Points : 146
    Points
    146
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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 */
       }
    }
    Pas de Wi-Fi à la maison : CPL

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 130
    Points : 146
    Points
    146
    Par défaut
    ma version de la fonction trier (issue d'une fonction opérant sur un tableau) n'est donc pas adaptable sous cette forme aux listes ?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par tomasi
    ma version de la fonction trier (issue d'une fonction opérant sur un tableau) n'est donc pas adaptable sous cette forme aux listes ?
    Les tableaux et les listes, ça ne se traite pas du tout de la même façon. Le fait que l'on puisse facilement insérer dans une liste fait qu'on utilise des méthode de tri par insertion très différentes de ce qu'on fait avec un tableau.

    Mettons qu'on ait une liste contenant B, A, D, C a trier.

    On va créer une deuxième liste, et deplacer le premier élément de l'ancienne dans la première :

    ancien : A->D->C->NIL
    nouveau : B->NIL

    ensuite, on prend le suivant , et on l'insère au bon endroit :

    ancien : D->C->NIL
    nouveau : A->B->NIL

    etc. Ca se termine comme ça :

    ancien : ->NIL
    nouveau : A->B->C->D->NIL
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut probleme de tableaux et de pointeurs et des fonctions
    bonjour
    je demande de l'aide de votre part je sais pas c'est qyoi un e fonction et j'ai un petit devoir en fonction le mardi.
    s'ils vous plait aidez moi et expliqué moi en detaille c quoi les fonction ect...

  10. #10
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    Citation Envoyé par sniper-r
    bonjour
    je demande de l'aide de votre part je sais pas c'est qyoi un e fonction et j'ai un petit devoir en fonction le mardi.
    s'ils vous plait aidez moi et expliqué moi en detaille c quoi les fonction ect...
    lol, t'es pas dans la m... toi !y'a des cours ici

    ps: la prochaine fois, ouvres un nouveau topic hein !
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

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