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 :

signification de argv, argc et envp


Sujet :

C

  1. #1
    BNS
    BNS est déconnecté
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 129
    Par défaut signification de argv, argc et envp
    Bonjour à tous,

    je cherche á comprende la signification de ces 3 arguments: argv, argc et envp. Ils sont en effet souvent appelé par la fonction main():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main(int argc, char **argv, char** envp);
    Quelle est la sigification de ces arguments? Ont-ils un rôle spécial à jouer dans le code? Quelle est l'influence de leur présence/absence? Sont-ils définis à des endroits stratégiques de la mémoire - comment les utiliser (correctement) ?

    Merci d'avance pour votre aide...

  2. #2
    Membre chevronné Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par défaut
    http://repository.voidnull.org/codin...sreseau-3.html
    (merci google)

    au passage c'est la premiere fois que je fois ce envp mais ca s'explique par la remarque sur la page web

  3. #3
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par BNS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main(int argc, char **argv, char** envp);
    Quelle est la sigification de ces arguments? Ont-ils un rôle spécial à jouer dans le code? Quelle est l'influence de leur présence/absence? Sont-ils définis à des endroits stratégiques de la mémoire - comment les utiliser (correctement) ?

    Merci d'avance pour votre aide...

    Déja je te rappelle que main est une fonction qui est appelée lors du lancement du programme c'est à dire que tu as un fichier .obj qui contient un appel à main.

    On a donc
    -argc : nombre d'argument que reçoit la fonction main
    -argv : la liste des arguments
    -envp : liste des variables d'environnement (pas portable)

    Pour leur présence/absente ca dépend si tu utilises ou pas ces paramètres auquel cas tu peux mettre int main(void)

    Pour l'emplacement mémoire c'est en ram rien de particulier à priori.

    Pour l'utilisation tu dois savoir que le tableau de pointeur sur chaine argv se termine par NULL ce qui indique la fin de la liste des arguments.

    Il n'y a rien dans la FAQ ?

  4. #4
    BNS
    BNS est déconnecté
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 129
    Par défaut
    merci pour ta (edit: vos) réponse(s)...
    Mais comment définir et utiliser ces 3 paramètres? Car main() est lancé par défaut, sans même que l'utilisateur le requiert...

  5. #5
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par BNS
    merci pour ta réponse...
    Mais comment définir ces 3 paramètres? Car main() est lancé par défaut, sans même que l'utilisateur le requiert...

    Supposons que ton programme s'appelle main.exe pour définir les paramètres tu peux lancer en ligne de commande depuis une fenetre dos cette commande : main.exe param1 param2 param3

    Tu peux parcourir ensuite ton tableau argv jusqu'a rencontrer NULL pour afficher les arguments.


    Pour envp tu n'as rien à faire le tableau est rempli pour toi argc aussi

  6. #6
    BNS
    BNS est déconnecté
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 129
    Par défaut
    ok, merci beaucoup!

  7. #7
    Membre chevronné Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par défaut
    apres compilation et link tu obtient un exe (toto par exemple)
    lors de l'appel en ligne de commande a
    argc vaudra 3
    argv[0] vaut "toto"
    argv[1] vaut "4"
    argv[2] vaut "sdfg"

    si tu utilise un environnement comme Code::block ou VC++ ou autre, il est possible de remplir ces parametres dans les options du projet (en fouillant dans les menus tu devrai trouver)

    [edit] arg trop tard [/edit]

  8. #8
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par straasha
    apres compilation et link tu obtient un exe (toto par exemple)
    lors de l'appel en ligne de commande a
    argc vaudra 3
    argv[0] vaut "toto"
    argv[1] vaut "4"
    argv[2] vaut "sdfg"

    si tu utilise un environnement comme Code::block ou VC++ ou autre, il est possible de remplir ces parametres dans les options du projet (en fouillant dans les menus tu devrai trouver)

    [edit] arg trop tard [/edit]
    Et tu as argv[3] qui vaut NULL. En fait argv[argc]=NULL

  9. #9
    Membre chevronné Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par défaut
    Citation Envoyé par hegros
    Et tu as argv[3] qui vaut NULL. En fait argv[argc]=NULL
    tient je savais pas... moi j'aurai dit indefini

  10. #10
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par straasha
    tient je savais pas... moi j'aurai dit indefini
    Tu peux faire un programme et regarder avec ton debogueur ce qu'il y a dedans

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par straasha
    [edit] arg trop tard [/edit]
    interjection de circonstance

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 50
    Par défaut
    a noter que tu peux appeller ces parametres comme tu veux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int   main(int nb, char **arguments, char **environnement)
    {
    }
    par exemple, et que le troisieme est facultatif

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Par défaut même chose
    Bonjour. En fait arc est un pointeur de pointeur de char, donc le premier char * (la chaîne de caractère correspondant au premier argument) est argv[0] ? Pour obtenir une chaîne pointé par un const char *, faut-il initialiser une nouvelle chaine ? Par exemple à l'exécution d'un fichier :

    :~$./monfichier.exe arg1 arg2 arg3

    pour récupérer arg1 dans un const char * de nom "machaine" (désolé pour cette formulation), peut-on faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main(int argc, char **argv)
       {
       const char * machaine = argv[0];
       FILE * file = fopen(machaine,"r");
       }
    par exemple ?

  14. #14
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par kromartien
    pour récupérer arg1 dans un const char * de nom "machaine" (désolé pour cette formulation), peut-on faire (...)?
    Oui, mais tu peux aussi l'utiliser directement dans fopen.

  15. #15
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Par défaut
    En fait je ne pensais pas car le prototype (ou définition ? Je confonds toujours) de la fonction donné par "man fopen" est FILE *fopen(const char *path, const char *mode); Il faut donc un pointeur sur const char en toute rigueur (me trompe-je ?).

    D'ailleurs ça m'ammène à poser une autre question. Comment faire de la recopie de chaîne pour les arguments de la ligne de commande ?

    Car pour strcpy, la destination est un char * et le départ est un const char *.

    En fait c'est surtout pour le gestion dynamique de la mémoire que je demande ça, ( ... on me dit que je peux utiliser strlen .. Bon d'accord)

  16. #16
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par kromartien
    En fait je ne pensais pas car le prototype (ou définition ? Je confonds toujours) de la fonction donné par "man fopen" est FILE *fopen(const char *path, const char *mode); Il faut donc un pointeur sur const char en toute rigueur (me trompe-je ?).
    (...)
    Car pour strcpy, la destination est un char * et le départ est un const char *.
    Heu...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char * machaine = argv[0];
    Tu copies bien un char* dans un const char*. L'appel de la fonction fait à peu près la même chose, entre les paramètres formel et effectif, non ?

  17. #17
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Par défaut
    Oui, en fait je suis naturellement peu sûr de moi, je suis faible en programmation et je sais que le C c'est un langage strict qui ne supporte pas l'approximation donc je préfère m'en tenir à ce qui est écrit dans le manuel en passant aux fonctions standards les types d'arguments attendus.

    Je me suis aperçu à force de bidouiller que en fait le premier argument de la ligne de commande n'est pas argv[0] (qui est la chaîne correspondant à la commande lancée) mais argv[1].

    Voilà, j'ai résolu mes soucis. Merci beaucoup au créateur de ce topic, ça m'a évité de devoir poster sur ce même problème.

  18. #18
    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 kromartien
    Je me suis aperçu à force de bidouiller que en fait le premier argument de la ligne de commande n'est pas argv[0] (qui est la chaîne correspondant à la commande lancée) mais argv[1].
    Pas la peine de bidouiller pour ça. Il suffit de lire son livre de C...

    K&R2 : Chap. 5.10, page 112 ...

  19. #19
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Par défaut
    Oui. Si j'avais lu ce chapitre j'aurais pu retrouvé la page, mais je ne l'avais pas examicé avec beaucoup d'attention bien que je sache que la ligne de commande UNIX soit expliquée dans ce livre. :rouge: Désolé.

    Oui il faut lire son cours avant d'aller en TP. Mais c'est mon premier programme en mode ligne de commande, peut être qu'un expérience vaut mieux qu'un cours très théorique.

    Trève de bavardage Je vais lire ce chapitre maintenant

  20. #20
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par kromartien
    En fait je ne pensais pas car le prototype (ou définition ? Je confonds toujours) de la fonction donné par "man fopen" est FILE *fopen(const char *path, const char *mode); Il faut donc un pointeur sur const char en toute rigueur (me trompe-je ?).

    Non tu peux passer un char* comme paramètre à une fonction qui attends un const char*. Lorsque tu lis qu'une fonction attends un paramètre const cela ne veut pas dire que dans l'appelant il est const cela veut dire que la fonction va voir ce paramètre comme une constante et ne pourra donc pas le modifier.

    Toute tentative de modifier a dans la fonction f génére une erreur de compilation.

    Par contre dans l'appelant je peux avoir :

    int a =9;a+=9; f(a); a++;

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

Discussions similaires

  1. int main(int argc, char** argv)
    Par MABB dans le forum C++
    Réponses: 1
    Dernier message: 19/11/2007, 12h20
  2. $argc et $argv et PHP ?
    Par blanchonvincent dans le forum Langage
    Réponses: 2
    Dernier message: 17/11/2007, 00h00
  3. Paramètres entrée (argc, argv) par défaut ?
    Par jomeo dans le forum Visual C++
    Réponses: 3
    Dernier message: 01/03/2007, 12h02
  4. Donner des valeurs à Argc et Argv dans le code
    Par olivier857 dans le forum C
    Réponses: 44
    Dernier message: 20/06/2006, 13h57

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