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 :

comment faire fonctionner: ma_fonction("teste"); ?


Sujet :

C

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 347
    Points : 203
    Points
    203
    Par défaut comment faire fonctionner: ma_fonction("teste"); ?
    Bonjour,

    j'ai crée une fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void ma_function(char *message)
    {
      char *cmd;
     
      sprintf(cmd, "echo %s > log.txt", message);
      system(cmd);
    }
    mais voilà, lorsque je l'appel, ça fonctionne pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma_function("erreur dans la partie 1");
    j'ai dû oublier quelque(s) chose(s)...

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 347
    Points : 203
    Points
    203
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void ma_function(const char *message)
    {
      char *cmd;
     
      sprintf(cmd, "echo %s > log.txt", message);
      system(cmd);
    }
    il manqué le const char

    oky, bah merci quand même, je savais bien que j'avais oublié quelque chose

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par dtcSearch Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void ma_function(const char *message)
    {
      char *cmd;
     
      sprintf(cmd, "echo %s > log.txt", message);
      system(cmd);
    }
    il manqué le const char

    oky, bah merci quand même, je savais bien que j'avais oublié quelque chose
    Je serais surpris que ça marche. cmd étant un pointeur non initialisé et sprintf copiant le résultat dans l'adresse de ce premier argument.

    En C++, tu ferais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <string>
    #include <sstream>
     
    void ma_function(std::string const &message_)
    {
      std::ostringstream commande;
      commande << "echo "<<message_<<" > log.txt";
     
      system(commande.str().c_str());
    }
    Pour des char (const)* et des sprintf voir le forum C.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 347
    Points : 203
    Points
    203
    Par défaut
    Oui, désolé,

    je me suis trompé de forum, ça aurai du être dans le forum C.

    Et dans le poste au dessus, effectivement, c'est pas un pointeur qu'il faut pour cmd.

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void ma_function(const char *message)
    {
      char cmd;
     
      sprintf(cmd, "echo %s > log.txt", message);
      system(cmd);
    }

  5. #5
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par dtcSearch Voir le message
    Oui, désolé,

    je me suis trompé de forum, ça aurai du être dans le forum C.

    Et dans le poste au dessus, effectivement, c'est pas un pointeur qu'il faut pour cmd.

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void ma_function(const char *message)
    {
      char cmd;
     
      sprintf(cmd, "echo %s > log.txt", message);
      system(cmd);
    }
    Marche ce code la ?

    - sprintf copie ton texte dans cmd
    - mais cmd ici est 1 caratère (char)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par laflak Voir le message
    Marche ce code la ?

    - sprintf copie ton texte dans cmd
    - mais cmd ici est 1 caratère (char)
    +1 .....

  7. #7
    Membre habitué Avatar de Gui13
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 133
    Points
    133
    Par défaut
    Clair, je me demande comment ca pète pas!

    Faut initialiser cmd avec une taille convenable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void ma_function(const char *message)
    {
      char cmd[1024]; // un chiffre assez grand pour contenir ta commande
     
      sprintf(cmd, "echo %s > log.txt", message);
      system(cmd);
    }
    Note qu'un truc beaucoup plus propre serait de calculer à la volée le nombre de caractères à allouer pour cmd...

  8. #8
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    Citation Envoyé par Gui13 Voir le message

    Note qu'un truc beaucoup plus propre serait de calculer à la volée le nombre de caractères à allouer pour cmd...
    La méthode "propre" serait justement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char*cmd=(char*)malloc((strlen(message)+
           strlen("echo  > log.txt")+1)*sizeof(char));
           /*Le premier strlen permet d'allouer pour la longueur de message, 
             Le deuxième pour la longueur de ton autre texte
             et le +1 pour \0.*/
    Après tu peux garder le reste de ton code.... Avec ce code tu peux avoir un nombre infini (en réalité sa dépend de ta mémoire) de caractères dans message. Plus propre encore serait de tester la valeur de retour de malloc...

  9. #9
    Membre habitué Avatar de Gui13
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 133
    Points
    133
    Par défaut
    Et encore plus propre: libérer la mémoire après l'avoir utilisée

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 347
    Points : 203
    Points
    203
    Par défaut
    désolé, mais on fait comment pour la libérer la mémoire après?

    je vous remercie pour votre aide, mes messages étant assez court, je l'initialise à 1024 mais je garde en tête la méthode propre

  11. #11
    Membre régulier Avatar de mikhailo
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 78
    Points : 75
    Points
    75
    Par défaut
    Pour libérer la mémoire, après ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* cmd=(char*)malloc((strlen(message) + strlen("echo  > log.txt") + 1)*sizeof(char));
    une fois que tu as fait tout ce que tu voulais avec ton cmd, tu fais:
    Et pour faire encore plus propre, il convient de tester si malloc() a bel et bien réussi à allouer la mémoire demandée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (cmd == NULL) 
    { 
             perror("Memoire non allouée");
    }
    "Les hommes et les femmes qui, sans bouger de leur bureau ou de leur bibliotheque, sans développer leur puissance corporelle et leurs infinies dimensions, parviennent, par une opération de la conscience, à une tristesse pessimiste qui se pretend lucide ne font que constater, sans le savoir, que toute identification du multiple de la vie à la vacuite de la conscience mène inévitablement à ce pessimisme et cette impuissance."

    extrait de "La fragilité" de Benasayag

  12. #12
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par NoIdea Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char*cmd=(char*)malloc((strlen(message)+
           strlen("echo  > log.txt")+1)*sizeof(char));
    En complément des remarques précédentes :
    • sizeof(char) vaut 1 par définition. Personnellement je recommande plutôt sizeof *cmd).
    • En C, le cast du retour de malloc() n'est pas obligatoire.

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

Discussions similaires

  1. Comment faire fonctionner une scroll bar ???
    Par toto4650 dans le forum MFC
    Réponses: 10
    Dernier message: 18/07/2005, 16h47
  2. [Chat] Comment faire fonctionner Flash 7 sous Debian ?
    Par piff62 dans le forum Evolutions du club
    Réponses: 22
    Dernier message: 07/03/2005, 15h27
  3. comment faire fonctionner l'exe sur une autre machine
    Par brian79 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/05/2004, 14h00

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