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 :

Donner des valeurs à Argc et Argv dans le code


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Par défaut Donner des valeurs à Argc et Argv dans le code
    Bonjour,

    Alors je m'explique, j'ai récupérer un programme qui permet de faire du POST en passant en ligne de commande l'url et les paramètre :
    exemple : ./Appli URL param1=1 param2=13 ...

    Le code code main commence donc évidement comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main(int argc, char** argv)
    {
    ...
    }
    Voici ce que je souhaite faire :

    En fait le but et de faire appel à la fonction qui fait le post, sans la modifier (je veut la laiser tel que je l'ai trouvé, mis à part le fait de changer son nom en "post" à la place de "main"). Le but et de lui passer les paramètres en dure depuis mon programme principale au lieu de lancer manuellement la fonction en ligne de commande et tapper les paramètres.

    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
    31
    32
    33
    34
    35
    int main ()
    {
      int argc;
      char **argv;
      char *url;
      char *param1;
      char *param2;
     
     
      //Ici le code de mon programme principale
     
     
      // Préparation des paramètres à envoyer à la fonction post
      param1="Num=22\0";
      param2="Dossier=22025\0";
     
      argv[0]="Appli\0"; 
      argv[1]=url;
      argv[2]=param1;
      argv[3]=param2;
     
      // appel d ela fonction post
      post(argc, argv):
     
      return 0;
    }
     
     
     
     
    //fonction qui fait le post (celle que j'ai récupéré)
    int post(int argc, char** argv)
    {
    ...
    }
    Hors ca ne marche pas, les paramètres sont bien transmis de mon main à la fonction post, mais la fonction plante par la suite. (erreur de segmentation)


    Je suppose que je ne passe pas les parmètres comme il le faut. pourtant quand je les print dans la fonction post, ils ont l'air d'être bienb passé. Mais bon je sais qu'il est tjs délicat de toucher aux tableaux de pointer. Ou est l'erreur?

    Un petit coup de main ne ma ferait pas de mal.
    Merci d'avance !

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Le probleme est que si lors de l'appel de ton programme, argc vaut 1 (i.e. pas d'arguments), alors le tableau de pointeurs sur char argv[] a la dimension 2 (avec argv[1] = NULL). Du coup, inutile d'esperer acceder a argv[3] et suivants...
    Tu vas devoir allouer la memoire de argv[].

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Par défaut
    Citation Envoyé par DaZumba
    Le probleme est que si lors de l'appel de ton programme, argc vaut 1 (i.e. pas d'arguments), alors le tableau de pointeurs sur char argv[] a la dimension 2 (avec argv[1] = NULL). Du coup, inutile d'esperer acceder a argv[3] et suivants...
    Tu vas devoir allouer la memoire de argv[].

    Merde désolé j'ai oublier ca dans mon exemple, mais je l'ai bien fait en fait, le pb ne vient pas de là.
    Mais merci tout de même.

    Modification :
    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
    31
    32
    33
    34
    35
    int main ()
    {
      int argc;
      char **argv;
      char *url;
      char *param1;
      char *param2;
      
    
      //Ici le code de mon programme principale
    
    
      // Préparation des paramètres à envoyer à la fonction post
      param1="Num=22\0";
      param2="Dossier=22025\0";
      argc=4;
      argv[0]="Appli\0"; 
      argv[1]=url;
      argv[2]=param1;
      argv[3]=param2;
    
      // appel d ela fonction post
      post(argc, argv):
    
      return 0;
    }
    
    
    
    
    //fonction qui fait le post (celle que j'ai récupéré)
    int post(int argc, char** argv)
    {
    ...
    }
    Voilà c'est mieux comme çà!

  4. #4
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par olivier857
    argc=4
    Ben c'est pas comme ca que argv[] va magiquement devenir un tableau de quatre elements. malloc() est necessaire...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Par défaut
    Citation Envoyé par DaZumba
    Ben c'est pas comme ca que argv[] va magiquement devenir un tableau de quatre elements. malloc() est necessaire...

    Ok d'accord.
    Mais j'arrive pas a utiliser malloc.

    Serait t'il possible de m'écrire le code avec malloc(), pour que je comprenne comment ca marche. Désolé je suis débutant. J'essaye d'utiliser malloc mais je n'y arrive pas.

    Merci de ton aide !

  6. #6
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par olivier857
    Serait t'il possible de m'écrire le code avec malloc(), pour que je comprenne comment ca marche. Désolé je suis débutant. J'essaye d'utiliser malloc mais je n'y arrive pas.
    J'ai un peu reflechi, et meme si la norme assure que argc et argv sont accessibles en ecriture, je ne sais pas si argv[] est alloue ou non par le symbole _start (celui qui appelle main() au lancement du programme). Donc je ne sais pas si faire un malloc() sur argv va entrainer une fuite memoire ou non...
    Dans le doute, je te conseille de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int my_argc;
    char *my_argv[10];
    puis envoyer my_argc et my_argv a post() (apres avoir donne une valeur, evidemment).

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par olivier857
    Serait t'il possible de m'écrire le code avec malloc(), pour que je comprenne comment ca marche. Désolé je suis débutant. J'essaye d'utiliser malloc mais je n'y arrive pas.
    Description des mécanismes d'allocation dynamique de mémoire en langage C

    J'ai un peu reflechi, et meme si la norme assure que argc et argv sont accessibles en ecriture, je ne sais pas si argv[] est alloue ou non par le symbole _start (celui qui appelle main() au lancement du programme). Donc je ne sais pas si faire un malloc() sur argv va entrainer une fuite memoire ou non...
    Dans le doute, je te conseille de faire:
    Code DaZumba : Sélectionner tout - Visualiser dans une fenêtre à part
    int my_argc; char *my_argv[10];
    puis envoyer my_argc et my_argv a post() (apres avoir donne une valeur, evidemment).
    Si le prototype de main est :
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main (int nb_arg, char **arg_value)
    rien ne t'empêche d'utiliser argc et argv comme nom de variable.

    Ne pas oublier que argv est un tableau de argc+1 éléments avec le dernier élément à NULL.

    Si tu veux te passer le l'allocation dynamique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdlib.h>
     
    int main (void)
    {
      char argv[4][5] = {"arg1", "arg2", "arg3", NULL};
      int argc = sizeof (argv) / sizeof (*argv) - 1;
    [...]
      return 0;
    }

  8. #8
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par olivier857
    Merde désolé j'ai oublier ca dans mon exemple, mais je l'ai bien fait en fait, le pb ne vient pas de là.
    Mais merci tout de même.

    Modification :
    Les 2 protos valides dans un programme C standard sont int main(void) et int main(int argc, char **argv). Si tu veux récupérer des paramètres de la ligne de commande, tu es obligé de prendre la seconde, c'est le point d'entree de ton programme.

    Citation Envoyé par olivier857
    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
    {
      int argc;
      char **argv;
      char *url;
      char *param1;
      char *param2;
      
    
      //Ici le code de mon programme principale
    
    
      // Préparation des paramètres à envoyer à la fonction post
      param1="Num=22\0";
      param2="Dossier=22025\0";
      argc=4;
    Ici, il faut bien de l'espace pour argv, pour les pointeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    argv = malloc((argc+1)*sizeof*argv);
    if (!argv) {
      fprintf(stderr,"Erreur allocation\n");
      exit(EXIT_FAILURE);
    }
    Citation Envoyé par olivier857
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      argv[0]="Appli\0"; 
      argv[1]=url;
      argv[2]=param1;
      argv[3]=param2;
     
      // appel d ela fonction post
      post(argc, argv):
    Ici, il faut liberer la memoire. Ne pas oublier d'include <stdlib.h>.

    Citation Envoyé par olivier857

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      return 0;
    }
     
     
     
     
     
    //fonction qui fait le post (celle que j'ai récupéré)
    int post(int argc, char** argv)
    {
    ...
    }
    Voilà c'est mieux comme çà!
    A+

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par olivier857
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main ()
    {
      char **argv;
      argv[0]="Appli\0";
    argv est un pointeur non initialisé. Le comportement est indéfini.

    Tu veux sans doute un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      /* Definition d'un tableau de 10 pointeurs sur char */
      char *argv[10];
     
      argv[0]="Appli"; 
      <...>
      argv[9]="...";

Discussions similaires

  1. recupérer des valeurs d'un fichier dans un tableau de string
    Par Kansuke dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 07/04/2008, 13h54
  2. Réponses: 11
    Dernier message: 28/02/2008, 10h44
  3. Réponses: 13
    Dernier message: 27/11/2007, 11h06
  4. Réponses: 3
    Dernier message: 21/05/2007, 15h37
  5. Réponses: 1
    Dernier message: 19/03/2006, 20h52

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