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 paramètre en cascade


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2008
    Messages : 464
    Par défaut Passage de paramètre en cascade
    Bonjour, je débute en C et j'ai quelques questions à poser sur le passage de paramètre par valeur :

    Si je prend l'exercice qu'on voit souvent sur internet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    main()
    {
    int i, j, k ;
    add(i,j,&k) ;
    }
     
    void add(int a, int b, int *c)
    {
    *c = a + b ;
    }
    Bien je comprends le principe

    Je veux maintenant compléxifier le programme pour faire du passage de paramètre en cascade :
    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
    main()
    {
    int i, j, k ;
    passage(i,j,[]k) ;
    }
     
    void passage(int a, int b, int []c)
    {
    add(x,y,[]z) ;
    }
     
    void add(int a1, int b1, int []c1)
    {
    []c1 = a1 + b1 ;
    }
    Ma question est la suivante :
    Que dois je mettre dans les []
    Je vous remercie pour votre aide

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    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
    void add(int a1, int b1, int *c1)
    {
    *c1 = a1 + b1 ;
    }
    
    void passage(int a, int b, int *c)
    {
    add(a,b,c) ;
    }
    
    int main(void)
    {
    int i, j, k ;
    passage(i,j,&k) ;
    return 0;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Mais ça paraîtra tout de suite plus clair si tu utilises une convention de nommage pour les pointeurs:
    Code C : 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
    void add(int a1, int b1, int *pc1)
    {
    	*pc1 = a1 + b1 ;
    }
     
    void passage(int a, int b, int *pc)
    {
    	add(a, b, pc) ;
    }
     
    int main(void)
    {
    	int i, j, k ;
    	passage(i, j, &k) ;
    	return 0;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2008
    Messages : 464
    Par défaut Un dernier coup de pouce
    Merci medinoc pour ta réponse rapide et fiable (jai testé , ça marche)
    J'aimerai maintenant complexifié le code de la manière suivante :

    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
     
    void add(int a1, int b1, int []c1)
    {
    	[]c1 = a1 + b1 ;
    }
     
    void passage(int a, int b, int []c)
    {
    	add(a, b, []c) ;
    }
     
    int main(void)
    {
    	int i, j, *k ;
    	passage(i, j, []k) ;
    	return 0;
    }
    En fait je ne déclare plus k comme variable dans le programme principal mais comme pointeur. (Dans ce que tu as proposé, j'ai volontairement retiré les convention de nommage "p" car je ne sais plus bien quoi est quoi!!)

    Si on pourrait m'éclaircir sur ce dernier point cela m'aiderait à plus facilement comprendre la notion de pointeur en c (j'ai regardé dans la doc mais cela manque cruellement d'exemple un peu plus développé que les simples exemples que nous avons dans les docs).

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu ne peux pas faire ça, car dans ton code k se retrouve être un pointeur qui ne pointe sur rien.
    Dans ce code, k (renommé en pk pour bien montrer que c'est un pointeur) pointera sur une nouvelle valeur, ii:
    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
    #include <stdio.h>
     
    void add(int a1, int b1, int * pc1)
    {
    	*pc1 = a1 + b1 ;
    }
     
    void passage(int a, int b, int *^pc)
    {
    	add(a, b, pc) ;
    }
     
    int main(void)
    {
    	int i=1, j=2, *pk ;
    	int ii;
    	pk = &ii;
    	passage(i, j, pk) ;
    	printf("%d\n", ii);
    	return 0;
    }
    Si je ne me suis pas trompé, ce code devrait afficher 3.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(void)
    {
    	int i, j, *k ;
    	passage(i, j, []k) ;
    	return 0;
    }
    Qu'estce que c'est que ce []k ?

    Si tu veux stocker une valeur, il te faut un espace de stockage.
    Si tu veux modifier cette valeur par une fonction tu peux,
    - utiliser la valeur de retour de la fonction (mais ce n'est pas ici le but de l'exercice)
    - passer l'adresse de la variable à la fonction. Si la fonction sait où se trouve la variable elle peut y accéder. Tu peux passer soit directement l'adresse de la variable, soit mettre l'adresse dans un pointeur et passer ce pointeur. C'est équivalent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     	int i, j,resultat;
            int * k = &resultat;
    ....
    	passage(i, j, &resultat) ; // l'adresse est mise directement
            passage(i, j, k) ;         // l'adresse est dans le pointeur
    Dans les deux cas, la fonction passage est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void passage(int a, int b, int * res)
    {
        add(a,b,res);
    }
    La fonction add reçoit les deux nombres et l'adresse où mettre le résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void add(int a1, int b1, int * c1)
    {
    	*c1 = a1 + b1 ; // modifie la variable d'adresse c1.
                            // c1 est la valeur du res de la fonction add
                            // qui est l'adresse du resultat du main
    }

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

Discussions similaires

  1. [Lazarus] Probable problème de passage de paramètres en cascade
    Par tourlourou dans le forum Lazarus
    Réponses: 5
    Dernier message: 09/09/2012, 16h37
  2. Passage de paramètres par pointeur, en cascade
    Par babykichon dans le forum Débuter
    Réponses: 34
    Dernier message: 27/05/2011, 16h02
  3. [XSL] Passage de paramètres à un template
    Par pantin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 27/06/2003, 13h28
  4. passage de paramètres
    Par pram dans le forum XMLRAD
    Réponses: 5
    Dernier message: 18/02/2003, 17h28
  5. passage en paramètre d'un array dynamique 2D
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 27/11/2002, 19h47

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