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 :

Passage de pointeurs (paramètre de fonction)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Par défaut Passage de pointeurs (paramètre de fonction)
    Bonjour,

    j'ai écrit quelques lignes en C, mais je ne comprends pas pourquoi elles ne marchent pas. Les voici (en simplifiant pas mal le code) :

    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
     
    // Fonction mapping
    void mapping(double * constelI, double * constelQ) {
        constelI = (double *) malloc(4*sizeof(double));
        consteQ = (double *) malloc(4*sizeof(double));
        for(i=0; i<4; i++) {
            constelI[i] = i;
            constelQ[i] = 2*i;
        }
    }
     
    // Fonction principale
    double * constelI;
    double * constelQ;
     
    mapping(constelI, constelQ);
    Après l'appel de mapping(), quand je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%f  %f\n", constelI[i], constelQ[i]);
    ça fait un segfault :-(

    Est-ce que quelqu'un pourrait m'expliquer pourquoi ! Merci d'avance.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 478
    Par défaut
    Citation Envoyé par julieng31 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // Fonction mapping
    void mapping(double * constelI, double * constelQ) {
        constelI = (double *) malloc(4*sizeof(double));
        consteQ = (double *) malloc(4*sizeof(double));
    }
     
    // Fonction principale
    double * constelI;
    double * constelQ;
     
    mapping(constelI, constelQ);
    Dans une fonction, les paramètres sont traités comme des variables locales. ConstelI et ConstelQ ne sont donc pas les mêmes que ceux de la fonction principale. Si tu veux affecter une valeur à un pointeur se trouvant en dehors de ta fonction, il faut passer à celle-ci l'adresse de ton pointeur pour qu'elle puisse écrire dedans. Autrement dit : un pointeur sur un pointeur (sur un double, en l'occurence). Puis passer explicitement l'adresse de ce pointeur à ta fonction. Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // Fonction mapping
    void mapping(double ** constelI, double ** constelQ) {
        * constelI = (double *) malloc(4*sizeof(double));
        * consteQ = (double *) malloc(4*sizeof(double));
    }
    
    // Fonction principale
    double * constelI;
    double * constelQ;
    
    mapping(&constelI, &constelQ);
    Note qu'au niveau des étoiles vertes, on déclare le type de la variable, tandis qu'au niveau des étoiles oranges^WRouges, on déréférence le pointeur sur pointeur, pour accéder directement à l'objet pointé et déposer dedans le résultat de malloc().

  3. #3
    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 Obsidian Voir le message
    Note qu'au niveau des étoiles vertes, on déclare le type de la variable, tandis qu'au niveau des étoiles oranges, on déréférence le pointeur sur pointeur, pour accéder directement à l'objet pointé et déposer dedans le résultat de malloc().
    Les étoiles oranges, je ne les voie pas... C'est normal, comme beaucoup , je voie mal cette couleur...

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Par défaut
    Merci pour vos réponses. Cela fonctionne bien. J'aurais eu le réflexe du passage de l'adresse pour une variable mais je ne l'ai pas eu pour un pointeur !

  5. #5
    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 julieng31 Voir le message
    Merci pour vos réponses. Cela fonctionne bien. J'aurais eu le réflexe du passage de l'adresse pour une variable mais je ne l'ai pas eu pour un pointeur !
    Passer l'adresse, c'est OK pour une variable . A partir de 2 ça devient lourd et peu évolutif. Je préfère une structure comme déjà indiqué.

  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 julieng31 Voir le message
    Bonjour,

    j'ai écrit quelques lignes en C, mais je ne comprends pas pourquoi elles ne marchent pas. Les voici (en simplifiant pas mal le code) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Fonction mapping
    void mapping(double * constelI, double * constelQ) {
        constelI = (double *) malloc(4*sizeof(double));
        consteQ = (double *) malloc(4*sizeof(double));
    <...>
    http://emmanuel-delahaye.developpez....ge=Page3#LXIII

    Dans ce cas, une structure est indiquée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct constel
    {
       double * I; 
       double * Q;
    };
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void mapping(struct constel *p)
    et l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    {
       struct constel c = {NULL, NULL};
       mapping (&c);

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

Discussions similaires

  1. passage de pointeur dans une fonction
    Par El Manco dans le forum Débuter
    Réponses: 10
    Dernier message: 09/02/2009, 22h13
  2. Réponses: 14
    Dernier message: 07/06/2007, 19h40
  3. Passage de pointeur a une fonction
    Par Bargaroth dans le forum C
    Réponses: 3
    Dernier message: 04/10/2006, 09h52
  4. Passage de pointeurs entre fonctions
    Par mickael.be dans le forum Langage
    Réponses: 3
    Dernier message: 02/01/2006, 21h01
  5. Paramètres de fonction : pointeurs ou valeurs ?
    Par Xandar dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 30/11/2005, 16h50

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