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 :

utilisation d'un pointeur passé en paramètre dans une fonction


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Points : 10
    Points
    10
    Par défaut utilisation d'un pointeur passé en paramètre dans une fonction
    Bonjour
    je vous expose mon problème qui est très simple j'ai deux fichiers séparer un pour la fonction main() et le deuxième pour le traitement. Dans le deuxième fichier j'ai une fonction qui a deux paramètres d’entré (uint64_t message[2], char* asterix_mes) et son type de retour est void. dans la fonction main je veux récupérer le pointeur asterix_mes donc j'ai ecrit ce code mais lors de l'affichage j'ai des valeurs de 0 voila le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void  ident_message ( uint64_t  message[2], char* asterix_mes )
    {
    asterix_mes=ident_to_asterix_sub(message) ;
    /* ici asterix_mes contient l'information nécessaire */
    ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main()
    {  
    char * asterix_mes;  
    asterix_mes= (char*) malloc(30);    
    ident_message(vect_test, &asterix_mes);
    /* asterix_mes est vide */ 
    }
    quoi faire??

  2. #2
    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
    Normalement, le compilateur aurait dû émettre un avertissement sur la différence entre le type de l'argument lors de l'appel (char **) et lors de la déclaration de la fonction (char*) ce qui vous aurait mis sur la voie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void  ident_message ( uint64_t  message[2], char** asterix_mes )
    {
      *asterix_mes=ident_to_asterix_sub(message) ;
    /* ici asterix_mes contient l'information nécessaire */
    ...
    }

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Non ca ne marche pas et j'ai pensé a une autre solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char* ident_message ( uint64_t  message[2])
    {
    char* asterix_mes;
    asterix_mes=ident_to_asterix_sub(message) ;
    /* ici asterix_mes contient l'information nécessaire */
    return (asterix_mes)
    ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main()
    {  
    char * asterix_mes_main;   
    asterix_mes_main = ident_message(vect_test ); 
    }
    dans ce cas il me renvoi une erreur: On ne peut pas affecter une valeur de char* (dans ce cas asterix_mes_main) a une valeur de int (dans ce cas le type de retour de la fonction ident_message) j'ai rien compris de tout cela!!
    Le fait d'avoir ces deux fonctions dans deux fichiers différents ça pose ce genre de problèmes??

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    a savoir que j'ai fait le même type d'appel de fonction avec deux fonctions qui se trouvent dans le même fichier et je n'ai pas cette erreur

  5. #5
    Membre du Club Avatar de nanox
    Homme Profil pro
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Points : 61
    Points
    61
    Par défaut
    char* ident_message ( uint64_t message[2])
    {
    char* asterix_mes;
    asterix_mes=ident_to_asterix_sub(message) ;
    /* ici asterix_mes contient l'information nécessaire */
    return (asterix_mes)
    ...
    }
    On ne peut pas affecter une valeur de char* (dans ce cas asterix_mes_main) a une valeur de int (dans ce cas le type de retour de la fonction ident_message) j'ai rien compris de tout cela!!
    Ici ta fonction ident_message renvoie un char*

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Merci pour votre réponse nanox mais tu pense que c'est une bonne idée d'utiliser une variable globale et comme ça je n'aurai pas de problème avec ce pointeur entre deux fichiers différents

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    j 'ai fait un cast et ca fonctionne a merveille merci pour votre aide tout le monde

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SearchProblem Voir le message
    j 'ai fait un cast
    Salut
    Tu n'as fait que masquer le problème. Le compilo te dit qu'une de tes fonctions renvoie un type incohérent (donc à priori une valeur incorrecte) et toi, au lieu d'essayer de comprendre, tu dis au compilo "t'inquiète pas je maitrise" alors que tu ne maitrises rien du tout.

    Citation Envoyé par SearchProblem Voir le message
    et ca fonctionne a merveille
    Mouais. Le pire des cas. Ca semble bien fonctionner (par chance, parce qu'un int a la même taille qu'un char *) mais un jour tu portes ton code sur une plateforme différente et là clash. Ou bien ça continuera à bien fonctionner mais tu auras pris une bien mauvaise habitude que tu payeras plus tard...

    Citation Envoyé par SearchProblem Voir le message
    j'ai pensé a une autre solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    char* ident_message ( uint64_t  message[2])
    {
    char* asterix_mes;
    asterix_mes=ident_to_asterix_sub(message) ;
    /* ici asterix_mes contient l'information nécessaire */
    return (asterix_mes)
    ...
    }
     
    int main()
    {  
    char * asterix_mes_main;   
    asterix_mes_main = ident_message(vect_test ); 
    }
    dans ce cas il me renvoi une erreur: On ne peut pas affecter une valeur de char* (dans ce cas asterix_mes_main) a une valeur de int (dans ce cas le type de retour de la fonction ident_message) j'ai rien compris de tout cela!!
    Une fonction non déclarée est vue "int" par défaut. Si le compilo voit apparaitre "ident_message" ou "ident_to_asterix_sub" avant qu'elles aient été déclarées (comme par exemple si le main était compilé en premier), il les considère "int" et te dit que t'as pas le droit de copier un int dans un char*
    C'est pour ça qu'il te faut soit définir tes fonctions, soit les prototyper avant de les appeler

    PS: j'espère que dans "ident_to_asterix_sub()" il y a bien le malloc qu'il faut. Et tu n'oublieras pas de faire un free(asterix_mes_main) quand tu n'en auras plus besoin...

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 31/05/2008, 15h45
  2. comment passé un paramètre dans une requête sql
    Par java2008 dans le forum BIRT
    Réponses: 0
    Dernier message: 03/03/2008, 12h11
  3. [PL/SQL] Multi paramètre dans une fonction
    Par wiLL_ dans le forum Oracle
    Réponses: 2
    Dernier message: 28/02/2006, 17h31
  4. Réponses: 4
    Dernier message: 05/10/2005, 18h19
  5. Réponses: 9
    Dernier message: 13/05/2005, 03h13

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