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

Réseau C Discussion :

[newbie]chaine de caracteres en parametres


Sujet :

Réseau C

  1. #1
    Membre régulier Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Points : 122
    Points
    122
    Par défaut [newbie]chaine de caracteres en parametres
    Bonjour,
    Je vou drais que ma chaine soit modifiee dans le prog principale ....
    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
     
    #include <stdio.h>
     
    void test(char *chaine, int *a)
    {
    	*a = 0;
    	chaine = "salut";
    	printf("chaine: %s, a: %i\n", chaine, *a);
    }
     
    int main(int argc, char *argv[])
    {
    	char *chaine;
    	int a = 10;
     
    	chaine = "Bonjour";
    	printf("chaine: %s, a: %i\n", chaine, a);
    	test(chaine, &a);
    	printf("chaine: %s, a: %i\n", chaine, a);
    }

  2. #2
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    C'est à dire?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    Membre régulier Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Points : 122
    Points
    122
    Par défaut
    Je voudrais que la modification que je fais a ma chaine dans la fonction test soit prise en compte dans le main. En d autres termes que ma chaine contienne 'Salut" a la fin du prog.

  4. #4
    Membre averti Avatar de niglo
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 379
    Points : 383
    Points
    383
    Par défaut
    Déclare ta focntion test comme ca (passage par référence) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void test(char &chaine, int *a)

  5. #5
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Attention c'est pas du C++.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  6. #6
    Membre régulier Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par seriousme
    Attention c'est pas du C++.
    tu t'adresses a qui ?

  7. #7
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Niglo.

    Les références n'existent pas en C.
    Il n'y a que les pointeurs.

    EDIT:en tout cas en C++ avec les références ça marche!
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  8. #8
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut Re: [newbie]chaine de caracteres en parametres
    Citation Envoyé par Tex-Twil
    Bonjour,
    Je vou drais que ma chaine soit modifiee dans le prog principale ....
    Il faudrait peut-être utiliser strcpy à la place de l'opérateur d'affectation...
    Ta solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void test(char *chaine, int *a)
    {
    	*a = 0;
    	chaine = "salut";
    	printf("chaine: %s, a: %i\n", chaine, *a);
    }
    Modifie la valeur du pointeur, donc effectivement, le printf va afficher "salut". Mais ce qui se trouve dans la zone mémoire pointée par la variable chaine de ton main ne sera pas modifiée...

    Pour cela, il faut utiliser la fonction strcpy. Par contre, il faut allouer une zone mémoire, pour le moment tu pointes vers des zones qui ne sont pas forcément en écriture, donc il n'est pas conseillé de les modifier...

    Une version correcte serait:
    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 <string.h>
     
    #include <stdio.h>
     
    void test(char *chaine, int *a)
    {
       *a = 0;
       strcpy(chaine,"salut");
       printf("chaine: %s, a: %i\n", chaine, *a);
    }
     
    int main()
    {
       char chaine[] = "Bonjour";
       int a = 10;
     
       printf("chaine: %s, a: %i\n", chaine, a);
       test(chaine, &a);
       printf("chaine: %s, a: %i\n", chaine, a);
       return 0;
    }
    Mais avant de continuer le C, révise bien les chaînes de caractères...

    Jc

  9. #9
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Mais ce qui se trouve dans la zone mémoire pointée par la variable chaine de ton main ne sera pas modifiée...
    Pourquoi?

    En passant par pointeur la zone mémoire pointée est unique normalement.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  10. #10
    Membre averti Avatar de niglo
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 379
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par seriousme
    Les références n'existent pas en C.
    Il n'y a que les pointeurs.
    Désolé je ne savais pas

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: [newbie]chaine de caracteres en parametres
    Citation Envoyé par Tex-Twil
    Je vou drais que ma chaine soit modifiee dans le prog principale ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void test(char *chaine, int *a)
    {
    	chaine = "salut";
    }
    Pour copier une chaine, on utilise strcpy(). Attention aux débordements toujours possibles et non contrôlés en C.

    La destination doit être un tableau de char et non une chaine littérale, qui n'est pas modifiable.

    Si tu veux que la fonction modifie le pointeur, c'est autre chose. Il faut passer l'adresse du pointeur
    ou retourner la nouvelle valeur
    et modifier les paramètres et le codage en conséquence...
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par seriousme
    Mais ce qui se trouve dans la zone mémoire pointée par la variable chaine de ton main ne sera pas modifiée...
    Pourquoi?
    Parce que comme toujours, modifier la valeur d'un paramètre n'affecte pas la valeur originale de celui-ci. Rien de nouveau...

    Rappel :en C, tous les paramètrtes sont passés par valeur (aka copie). La valeur originale n'est jamais modifiée.
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par seriousme
    Mais ce qui se trouve dans la zone mémoire pointée par la variable chaine de ton main ne sera pas modifiée...
    Pourquoi?

    En passant par pointeur la zone mémoire pointée est unique normalement.
    Non, juste parce que tu as un pointeur ne veut pas dire que tout ce que tu fais avec un pointeur va modifier la zone pointée!

    Si j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void f(int *a)
    {
    a = NULL;
    }
     
    void g(int *ptr)
    {
    f(ptr);
    }
    L'adresse de ptr dans la fonction g ne sera pas changé et *ptr non plus puisque tout est passé par valeur en C.

  14. #14
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Merci de vos explications.

    Cela marche donc:
    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 test(char **chaine, int *a)
    {
       *a = 0;
       *chaine = "salut";
       printf("chaine: %s, a: %i\n", *chaine, *a);
    }
     
    int main(int argc, char *argv[])
    {
       char *chaine=(char *)malloc(100);
       int a = 10;
     
       chaine = "Bonjour";
       printf("chaine: %s, a: %i\n", chaine, a);
       test(&chaine, &a);
       printf("chaine: %s, a: %i\n", chaine, a);
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  15. #15
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par seriousme
    Merci de vos explications.

    Cela marche donc:
    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 test(char **chaine, int *a)
    {
       *a = 0;
       *chaine = "salut";
       printf("chaine: %s, a: %i\n", *chaine, *a);
    }
     
    int main(int argc, char *argv[])
    {
       char *chaine=(char *)malloc(100);
       int a = 10;
     
       chaine = "Bonjour";
       printf("chaine: %s, a: %i\n", chaine, a);
       test(&chaine, &a);
       printf("chaine: %s, a: %i\n", chaine, a);
    Arg quelle idée! Et tu fais comment pour désallouer ta mémoire?

    Jc

  16. #16
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Je pose surement encore une question con mais c'est pareil avec strcpy?

    La désallocation de mémoire ne peut être gérée que après une allocation dynamique?

    Non?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  17. #17
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par seriousme
    Je pose surement encore une question con mais c'est pareil avec strcpy?

    La désallocation de mémoire ne peut être gérée que après une allocation dynamique?

    Non?
    Je ne comprends pas ce que tu veux dire.

    strcpy ne change que ce qui se trouve dans une zone mémoire en copiant les données d'une autre zone mémoire...

    Par contre, pour chaque malloc il faut qu'il y ait un free donc lorsqu'on change la valeur d'un pointeur, il faut être sûr qu'on n'est pas en train de perdre une adresse rendue par un malloc pour de bon. Car sinon, on ne pourra jamais faire le free adéquat.

    Jc

  18. #18
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Et tu fais comment pour désallouer ta mémoire?
    Je vois pas le probleme que pose cette méthode.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  19. #19
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par seriousme
    Cela marche donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       char *chaine=(char *)malloc(100);
       chaine = "Bonjour";
    Absurde. Le bloc alloué est perdu. Rester simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       char *chaine = "Bonjour";
    Pas de Wi-Fi à la maison : CPL

  20. #20
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par seriousme
    Et tu fais comment pour désallouer ta mémoire?
    Je vois pas le probleme que pose cette méthode.
    Ca, c'est grave... Tu ne vois pas que tu sauves l'adresse d'un bloc alloué (inutilement, d'ailleurs), et qu'ensuite, tu remplaces l'adresse de ce bloc par l'adresse d"une chaine littérale ? C'est pourtant exactement ce que tu as ecrit.
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/11/2011, 11h30
  2. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  3. Pb Update avec chaine de caractere
    Par JuJu° dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/05/2003, 15h58
  4. [LG]comparaison de chaines de caracteres
    Par thesam dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2003, 22h41
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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