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 :

Passer un pointeur en paramètre d'une fonction


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut Passer un pointeur en paramètre d'une fonction
    Bonjour,

    Voila un peut près ce que je souhaiterai faire, mais ça ne passe pas :

    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
    #include "stdio.h"
     
     
    struct _test {
    	int x;
    	int y;
    	int *p;
    };
    typedef struct _test test;
     
    int main()
    {
    	test ts;
     
    	ts.x = 4;
    	ts.y = 2;
    	ts.p = &ts.y;
     
    	printf("%i", add(ts.x, ts.y, ts.p));
     
    	return 0;
    }
     
    int add(int x, int y, int *p)
    {
    	return x+y+(*p);
    }

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    déjà printf("%d" serait pas mal..

    et aussi

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Et si tu rajoutais une seconde parenthèse à la fin de printf...

    Citation Envoyé par souviron34 Voir le message
    déjà printf("%d" serait pas mal..
    %d ou %i c'est pareil mais on utilise plus couramment %d effectivement.

    Ce serait mieux que tu déclares (par forcément définisses) add avant main.

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    En déclarant la fonction add(), et en faisant attention à ne pas oublier de parenthèses, on 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct test_ {
    	int x;
    	int y;
    	int *p;
    } test_s;
     
    int add(int x, int y, int *p);
     
    int main(void)
    {
    	test_s ts;
     
    	ts.x = 4;
    	ts.y = 2;
    	ts.p = &ts.y;
     
    	printf("%d\n", add(ts.x, ts.y, ts.p));
     
    	return EXIT_SUCCESS;
    }
     
    int add(int x, int y, int *p)
    {
    	return x + y + (*p);
    }
    qui fonctionne comme attendu.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut
    Effectivement il y avais plein de fautes, merci.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut
    ah, j'ai encore une question, il y a t-il un avantage à utiliser un pointeur sur structure à la place ?

    exemple, si on on reprend celui de Thierry :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    test_s *ts;
     
    au lieu de
     
    test_s ts

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    ben là la place mémoire n'est pas réservée.. Donc il te faut faire une allocation...

  8. #8
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Certes, c'est plus plus lisible, mais
    ou
    sont équivalents.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    ben là la place mémoire n'est pas réservée.. Donc il te faut faire une allocation...
    C'est tout ce que ça change c'est juste l'allocation en +, au niveau de l'occupation mémoire il n'y a aucun avantage, la taille sera la même ?

  10. #10
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par oranoutan Voir le message
    ah, j'ai encore une question, il y a t-il un avantage à utiliser un pointeur sur structure à la place ?

    exemple, si on on reprend celui de Thierry :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    test_s *ts;
     
    au lieu de
     
    test_s ts
    Dans ce cas, il te faut faire une allocation dynamique et ne pas oublier de libérer la mémoire alloué le cas échéant:

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct test_
    {
        int x;
        int y;
        int *p;
    } test_s;
     
    int add(int x, int y, int *p);
     
    int main(void)
    {
        test_s *ts = NULL;
        int err = EXIT_SUCCESS;
     
        ts = malloc(sizeof *ts);
        if (ts != NULL)
        {
            ts->x = 4;
            ts->y = 2;
            ts->p = &(ts->y);
     
            printf("%d\n", add(ts->x, ts->y, ts->p));
     
            free(ts), ts = NULL;
        }
        else
        {
            fprintf(stderr, "Allocation de mémoire impossible!\n");
            err = EXIT_FAILURE;
        }
     
        return err;
    }
     
    int add(int x, int y, int *p)
    {
        return x + y + (*p);
    }
    Il s'agit là d'une approche inutilement compliquée pour un exemple aussi simple. L'allocation dynamique de mémoire est avant tout utile lorsque qu'il s'agit de créer une structure de donnée, e.g. un tableau ou une chaîne de caractères, dont on ne connaît pas à l'avance le nombre d'éléments ou la longueur.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  11. #11
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par oranoutan Voir le message
    C'est tout ce que ça change c'est juste l'allocation en +, au niveau de l'occupation mémoire il n'y a aucun avantage, la taille sera la même ?
    Il y aura sizeof(struct test_s *) bytes de mémoire supplémentaire allouée sur la pile. Sinon, c'est tout pareil. L'allocation dynamique via malloc() est plus toutefois plus lente qu'une allocation statique.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Certes, c'est plus plus lisible, mais
    ou
    sont équivalents.

    Thierry
    absolument...

    Mais je préfère indiquer avec les parenthèses, car dès que l'on rentre dans un second niveau, ou qu'on dé-référence, les parenthèses deviennent obligatoires, et donc il me semble plus didactique de dire tout de suite avec les parenthèses, comme ça c'est homogène...

    car

    risque fortement de ne pas donner ce qui est attendu... surtout si c'est

    ou

    ou encore pire


  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut
    Bon ok alors, il me semble avoir lu dans un tuto que le fait de passer
    un pointeur en argument d'une fonction permettait d'économiser des ressources ou quelque chose dans ce genre, au lieu de faire passer des variables directement, car c'est uniquement l'adresse que l'on fait passer.

  14. #14
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par oranoutan Voir le message
    Bon ok alors, il me semble avoir lu dans un tuto que le fait de passer
    un pointeur en argument d'une fonction permettait d'économiser des ressources ou quelque chose dans ce genre, au lieu de faire passer des variables directement, car c'est uniquement l'adresse que l'on fait passer.
    Oui, mais ce n'est pas sous cette forme que tu as posté ta question. Effectivement, lorsqu'il s'agit de passer une structure à une fonction, utiliser un pointeur te permet d'éviter que la structure entière ne soit recopiée sur la pile. Prenons les fonctions suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int add(test_s t)
    {
        return t.x + t.y + *(t.p);
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int add(test_s *t)
    {
        int rv = 0; /* return value */
     
        if (t != NULL)
        {
            rv = t->x + t->y + *(t->p);
        }
        return rv;
    }
    Dans le premier cas, la structure test_s est copiée en intégralité (le passage des arguments en C se fait par copie, toujours!) sur la pile. Tandis que dans le deuxième cas, seule l'adresse de la structure est copiée sur la pile. Selon la taille de cette dernière, cela peut engendrer une différence considérable du point de vue de la performance. Les mêmes remarques sont naturellement valables au sujet de la transmission par valeur de retour.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  15. #15
    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 oranoutan Voir le message
    Voila un peut près ce que je souhaiterai faire, mais ça ne passe pas :
    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
    #include "stdio.h"
     
    struct _test {
    	int x;
    	int y;
    	int *p;
    };
    typedef struct _test test;
     
    int main()
    {
    	test ts;
     
    	ts.x = 4;
    	ts.y = 2;
    	ts.p = &ts.y;
     
    	printf("%i", add(ts.x, ts.y, ts.p));
     
    	return 0;
    }
     
    int add(int x, int y, int *p)
    {
    	return x+y+(*p);
    }
    Le programme est court, alors procédons par étapes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:19: warning: implicit declaration of function `add'
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 1 seconds)
    0 errors, 1 warnings
    • Pour pouvoir appeler une fonction correctement, elle doit être déclarée avant l'appel. Ici (programme monolithique : 1 seul fichier source), il suffit de la définir avant usage.
    • Les identificateurs commençant par _ sont réservés à l'implémentation.
    • Pour s'afficher correctement, une ligne de texte doit être termnée par un \n.
    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
     
    #include "stdio.h"
     
    struct test
    {
       int x;
       int y;
       int *p;
    };
     
    typedef struct test test;
     
    int add (int x, int y, int *p)
    {
       return x + y + (*p);
    }
     
    int main (void)
    {
       test ts;
     
       ts.x = 4;
       ts.y = 2;
       ts.p = &ts.y;
     
       printf ("%i\n", add (ts.x, ts.y, ts.p));
     
       return 0;
    }
    Qu'entends-tu par "mais ça ne passe pas" ?

    La fonction faut la somme des valeurs de ts.x, ts.y et ts.y (d'une façon tordue), ce qui fait 4 + 2 + 2 = 8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    8
     
    Press ENTER to continue.

  16. #16
    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 souviron34 Voir le message
    déjà printf("%d" serait pas mal..
    et
    Ca ne change strictement rien.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut
    ok c'est compris pour le pointeur de structure, merci.

    Citation Envoyé par Emmanuel Delahaye
    Qu'entends-tu par "mais ça ne passe pas" ?
    J'avais oublié une parenthèse, que j'ai édité par la suite.

    Citation Envoyé par Emmanuel Delahaye
    Les identificateurs commençant par _ sont réservés à l'implémentation.
    Qu'es ce que l'implémentation ?

  18. #18
    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 oranoutan Voir le message
    Qu'es ce que l'implémentation ?
    Un raccourci (dans ce contexte) pour "l'implémentation du langage C", c'est à dire la 'concrétisation' de ce langage (qui n'est qu'une définition abstraite dans un document) par un environnement de développement constitué de :
    • Machine
    • Système
    • Compilateur + Editeur de liens

    bref, toute la chaine qui permet de transformer un ou plusieurs fichiers source C en exécutable.

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut
    ah ok bon à savoir.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/01/2008, 12h36
  2. [Débutant] Comment passer un fichier en paramètre d'une fonction?
    Par Rires et Chansons dans le forum MATLAB
    Réponses: 4
    Dernier message: 23/10/2007, 21h12
  3. Réponses: 14
    Dernier message: 07/06/2007, 19h40
  4. Passer un curseur en paramètre d'une fonction?
    Par Lafoudre dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2007, 15h00
  5. Passer un buffer en paramètre d'une fonction
    Par jomeo dans le forum C++
    Réponses: 3
    Dernier message: 26/02/2007, 17h00

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