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 :

Question sur les pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut Question sur les pointeurs
    bonjours , j'ai voulu m'entrainer un peu sur les pointeur et j'ai fait un petit programme tous simple qui affiche les resultats d'un tableau double dimension :
    le probleme est qu'il m'affiche un warning meme si sa marche
    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
     
    #include <stdio.h>
     
    void print(int **p);
     
    int main(void){
        int multi[3][4]= {{1,2,3,4},
                          {5,6,7,8},
                          {9,10,11,12}
                        };
       print(multi);
       return 0;
    }
     
    void print(int **p){
        int i=0;
        int *pp = (int*)p;
        for(i=0;i<12;i++){
            printf("%d ",*pp);
            (pp)++;
        }
    }
    voila le warning
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    C\main.c:12: warning: passing arg 1 of `print' from incompatible pointer type
    j'aimerais savoir pourquoi il me l'affiche s'il vous plait .
    Merci

  2. #2
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    bonjour,
    c'est un print ou un printf????
    je pense que c'est ici l'erreur

  3. #3
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Tu passes un tableau (~pointeur) d'entiers à une fonction qui attend un pointeur de pointeur d'entiers. Tu n'as pas de problème parce que tu castes par la suite ton int **p en int *pp .

  4. #4
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Ah oui en effet, ton '**' ne sert à rien, en fait ton code est équivalent à ça :

    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
     
    #include <stdio.h>
     
    void print(int *p);
     
    int main(void){
        int multi[12]= {1,2,3,4,5,6,7,8,9,10,11,12};
       print(multi);
       return 0;
    }
     
    void print(int *p){
        int i=0;
        for(i=0;i<12;i++){
            printf("%d ",*p);
            (p)++;
        }
    }

    ton cast t'a induits en erreur, il ne sert à rien et ton pointeur de pointeur non plus.

    Si je ne raconte pas de connerie, un pointeur de pointeur n'est pas un tableau à 2 dimensions. Il faut que tu vois un pointeur de pointeur comme un tableau de pointeurs (qui eux-mêmes peuvent être un tableau à 1 dimension).
    Ce n'est pas tout à fait la même chose.

  5. #5
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut
    @cyrine : print est une fonction que j'ai cree .
    @spout : oui c'est pour sa je ne comprend pas le warning .
    @fregolo : je veut travailler avec un tableau double dimension et non une dimension c'est pourquoi je n'ai vraiement pas compris ce que tu a dit

  6. #6
    Membre très actif Avatar de elmcherqui
    Profil pro
    Inscrit en
    Février 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2008
    Messages : 281
    Par défaut
    sujet resolu :
    en effet avec un cast (int**) il n'ya plus de warning .
    merci en tous cas pour vos reponses .

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par elmcherqui Voir le message
    @cyrine : print est une fonction que j'ai cree .
    @spout : oui c'est pour sa je ne comprend pas le warning .
    @fregolo : je veut travailler avec un tableau double dimension et non une dimension c'est pourquoi je n'ai vraiement pas compris ce que tu a dit
    int **: un pointeur sur des pointeurs de int
    int [][]: un tableau à 2 dimensions. Un tableau à deux dimensions reste un pointeur sur un int. C'est comme un tableau à une dimension. La différence est que quand tu écris tab[i][j] c'est traduit en tab[i*NbCol + j].

  8. #8
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Dans ton exemple le type de multi est int [][4]

    Pour ne pas avoir de warning sans faire de trantypage, il aurait fallu que ta fonction prenne ce type comme argument.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void printTab4(int tab[][4], size_t x){
        size_t i,j;
        for(i=0;i<x;i++)
           for(j=0;j<4;j++)
              printf("%d ",tab[i][j]);
    }
    (la deuxième dimention est passée en argument de la fonction)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Question sur les pointeurs génériques
    Par mikedavem dans le forum C
    Réponses: 16
    Dernier message: 24/05/2006, 11h56
  2. question sur les pointeurs
    Par jd.baculard dans le forum Langage
    Réponses: 3
    Dernier message: 18/03/2006, 02h30
  3. [Debutant] Nouvelle question sur les pointeurs
    Par etiennegaloup dans le forum Débuter
    Réponses: 3
    Dernier message: 11/01/2006, 09h55
  4. Question sur les pointeurs.
    Par Chrisemi dans le forum C++
    Réponses: 5
    Dernier message: 28/10/2005, 23h47
  5. questions sur les pointeurs
    Par Hyoga dans le forum C++
    Réponses: 17
    Dernier message: 08/01/2005, 23h25

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