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ètres


Sujet :

C

  1. #1
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 427
    Points : 43 044
    Points
    43 044
    Par défaut Passage de paramètres
    Bonjour,

    J'ai un soucis de passage de paramètres. J'ai besoin de pouvoir modifier des variables globales depuis une fonction. Dans le code ci dessous je n'arrive pas à récupérer la valeur de mon strdup dans la variable globale haine. Valeur NULL avant et arès appel de la fonction. Si qq1 peut m'expliquer ou je merde. Je n'utilise pas de return car je vais devoir modifier plusieurs variables. j'ai essayé en passant l'adresse à la fonction sans plus de résultat.

    Merci d'avance.

    Voici mon 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
    17
    18
    19
    20
    21
     
    #include <unistd.h>
    #include <string.h>
     
    char *chaine;
     
    fonction(char *string)
    {
    	printf("debut fonction\n");
    	char *tmp=strdup("remplissage");
     	string=tmp;
    }
     
    int main()
    {
    	printf("test\n");
    	chaine=NULL;
    	printf("chaine avant fonction :%s\n",chaine);
    	fonction(chaine);
    	printf("chaine après fonction :%s\n",chaine);
    }
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  2. #2
    Membre du Club Avatar de Waether
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 44
    Points : 69
    Points
    69
    Par défaut
    Personnelement je trouve pas qu'une globale soit la réponse a "je doit return plusieurs valeurs".

    En C tu as un outil qui a été spécialement fait pour ça : les structures.

    Par exemple:
    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
     
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct type_all
    {
      int   data;
      char  *str;
    }               type_all;
     
    type_all     ma_fonction(type_all ma_struct)
    {
      ma_struct.data = 42;
      ma_struct.str = strdup("Magique");
      return (ma_struct);
    }
     
    int     main()
    {
      type_all   ma_struct;
     
      ma_struct.data = 0;
      ma_struct.str = NULL;
      printf("On a str = %s et data = %d\n", ma_struct.str, ma_struct.data);
      ma_struct = ma_fonction(ma_struct);
      printf("On a str = %s et data = %d\n", ma_struct.str, ma_struct.data);
      return (0);
    }
    aether:dim. mars 08 11:38>./a.out
    On a str = (null) et data = 0
    On a str = Magique et data = 42
    Keep calm and debug ...

  3. #3
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Sans discuter le fait qu'utiliser des variables globales est une très mauvaise idée, ta fonction fonction() ne fait pas ce que tu crois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fonction(char *string)
    {
    	printf("debut fonction\n");
    	char *tmp=strdup("remplissage");
     	string=tmp;
    }
    - string est une variable locale (initialisée par l'argument lors de l'appel)
    - tmp est une variable locale (initialisée par l'appel à strdup())
    - La dernière ligne copie la variable locale tmp dans la variable locale string
    - On sort de la fonction et les variables locales sont détruites

    Conclusion : rien n'a changé dans le main(), la seule conséquence de l'appel à fonction() est d'avoir fait une fuite mémoire.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 427
    Points : 43 044
    Points
    43 044
    Par défaut
    Merci pour vos réponses.

    Je réussi déjà à changer la valeur d'une variable globale int depuis une fonction avec le même code (en passant en argument le nom de la variable avec et & (pour passer l'adresse)), c'est le char * passé en paramètre à NULL qui me pose problème. Un autre char* initialisé s'affiche correctement avec le code suivant :

    Sans discuter le fait qu'utiliser des variables locales est une très mauvaise idée
    Je penses que tu as voulu dire utiliser des variables globales.

    En C tu as un outil qui a été spécialement fait pour ça : les structures.
    Oui d'accord, mais si je souhaite faire autrement, en notant que ce n'est pas la meilleure méthode ..

    Je voudrais utiliser le passage par référence (j'ai vu le nom en effectuant des recherches), c'est je pense ce que j'utilise avec mon test int. J'ai vu que qu'avec un pointeur il ne faut pas utiliser & dans les arguments, mais je pense que j'ai soi compris quelque chose de travers, soi je ne l'applique pas correctement.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Je penses que tu as voulu dire utiliser des variables globales...
    Oui, tu as corrigé de toi-même et j'ai corrigé mon message.
    Je voudrais utiliser le passage par référence (j'ai vu le nom en effectuant des recherches),...
    Le plus simple est naturellement d'utiliser la valeur de retour de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char *fonction(void)
    {
    	printf("debut fonction\n");
    	return strdup("remplissage");
    }
    ...
     char * p = fonction();
    Mais si tu veux utiliser la liste des paramètres, tu dois passer l'adresse de destination :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void fonction(char** p)
    {
    	printf("debut fonction\n");
    	*p= strdup("remplissage");
    }
    ...
     char * p;
     fonction(&p);
    Remarque 1 : Il n'y a en C de passage par paramètres que par valeur. Dire qu'on passe "par référence" sous prétexte qu'on passe l'adresse de destination est un abus de langage.

    Remarque 2 : Il n'est plus autorisé de ne pas mentionner le type de retour d'une fonction lors de sa déclaration. Le retour "int par défaut" n'existe plus (et c'est aussi valable pour main() pour lequel ce type doit être explicitement int).
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 427
    Points : 43 044
    Points
    43 044
    Par défaut
    Merci Diogene, ça fonctionne nickel : il me manquait le double *.

    Comme ça m'a été, je vais revoir ma fonction en gérant des return et en le morcelant, car j'ai des erreurs glibc munmap_chunks (je fais des allocations et utilise memmove qui provoquent de la fragmentation. J'ai pas trouvé le bug, j’effectue bien les désallocations (sauf si une est passée à la trappe)).

    Il n'est plus autorisé de ne pas mentionner le type de retour d'une fonction lors de sa déclaration.
    J'avais cru comprendre que c'était autorisé en C mais pas en C++.

    Ca compile par contre j'ai des warning qui doivent correspondre à ce que tu me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    warning: return type defaults to ‘int[-Wreturn-type]
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

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

Discussions similaires

  1. [Forms]Passage de paramètre entre Forms et Reports
    Par jack554 dans le forum Reports
    Réponses: 4
    Dernier message: 30/03/2004, 13h58
  2. probleme lors du passage de paramètre
    Par maxmj dans le forum ASP
    Réponses: 4
    Dernier message: 18/11/2003, 00h15
  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