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 redefinir argc et agrv lorsque ils sont arguments du main ?


Sujet :

C++

  1. #1
    Battosaiii
    Invité(e)
    Par défaut Comment redefinir argc et agrv lorsque ils sont arguments du main ?
    Comment redefinir argc et argv ?

    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
    ...
    int
    main(
        int argc,
        char** argv
    )
    {  
        //INIT_ARGS()
        argc = 4;                                                       
        
        argv =                                                      
        {                                                                   
            (char*)"-ORBconfig_domains_dir",                                
            (char*)".",                                                     
            (char*)"-ORBdomain_name",                                       
            (char*)"config"                                                              
        };
    
    server_bus = IT_Bus::init(argc, argv, "tests.routing.corba_soap.server");
    
    ...
    Pourquoi ce code ne compile pas :
    t\unit\services\routing\bug_7571\testprog.cxx
    testprog.cxx
    \aspen\test\unit\services\routing\bug_7571\testprog.cxx(46) : error C2059: synta
    x error : '{'
    \aspen\test\unit\services\routing\bug_7571\testprog.cxx(46) : error C2143: synta
    x error : missing ';' before '{'
    \aspen\test\unit\services\routing\bug_7571\testprog.cxx(51) : error C2143: synta
    x error : missing ';' before '}'
    NMAKE : fatal error U1077: 'cl' : return code '0x2'
    Stop.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    D'abord, je pense que c'est une mauvaise idée de modifier argc et argv. Ce sont des paramètres passés par le système (le loader du programme) et a priori, tu ne dois pas y toucher.

    Ce que tu peut faire, c'est déclarer quelquechose genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int mon_argc = 4;
    char * mon_argv[] = { "param1", "param2", "param3", "param4", NULL };
    et utiliser ces 2 nouvelles variables dans ton appel à IT_Bus::init();

    Ne pas oublier le NULL en fin de tableau car certaines fonction n'utilisent pas argc mais utilisent le fait que le dernier paramètre vaut NULL pour connaitre la fin des arguments
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre éclairé Avatar de Vespasien
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    383
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 383
    Par défaut
    D'abord, je pense que c'est une mauvaise idée de modifier argc et argv.
    En plus a maintenir çà va être amusant. Je passe en paramètres 2 et '/usr/apache' et il travaillera en fait avec 12 et '/tmp'
    Moi, j'utiliserais un script pour faire la conversion d'argument afin quelle reste lisible aux générations futures.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Vespasien Voir le message
    En plus a maintenir çà va être amusant. Je passe en paramètres 2 et '/usr/apache' et il travaillera en fait avec 12 et '/tmp'
    C'est pas faux non plus, la prochaine évolution sera cocasse
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Et sinon, l'erreur de compilation vient du fait que tu utilises un char** mais que :
    1) tu essayes de l'initialiser comme un char[N][M]
    2) tu ne le fais pas comme il faut

    En effet, il faut le faire en même-temps que tu déclares la variable.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut,

    Comme cela a été dit plus haut, les arguments pris par la fonction main() sont des valeurs qui sont normalement fournies par le système d'exploitation lors de l'appel.

    C'est la raison pour laquelle il est fortement déconseillé de vouloir modifier ces valeurs.

    De manière tout à fait personnelle, je te conseillerais plutôt de restreindre leur usage à
    • tester ces valeurs
    • passer ces valeurs en tant qu'argument d'entrée seule aux fonctions
    • récupérer ces valeurs dans d'autres variables plus faciles à utiliser (par exemple, un vecteur de chaines de caractères... à la mode C++ )

    En effet, que le prototype pour le deuxième argument soit char **argv ou char *argv[], la gestion de pointeurs sur pointeurs est loin d'être évidente, et on a très vite fait de faire des co en essayant de les gérer.

    De la même manière, il faut avouer que la gestion des chaines de caractères C style n'est vraiment pas ce qui est le plus simple, ni le plus efficace du C++.

    Enfin, il faut savoir que les cas où l'on sait à l'avance exactement le nombre d'arguments susceptibles d'être fournis lors du lancement de l'application sont extrêmement rares.

    Dans l'idéal, envisage peut être de passer par la bibliothèque boost:program_options ou, tout simplement, commencer par récupérer les informations fournies par la ligne de commande dans un vector sous une forme qui pourrait être proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::vector<std::string> tab;
    for(size_t i=0;i<argc;++i)
        tab.push_back(argv[0]);
    //maintenant, tu peux travailler sur un tableau de chaine "C++" ;)
    de manière à ce que, si tu dois effectuer des modifications sur les différentes chaines, ou que tu dois en rajouter (ou en retirer), tu puisse le faire plus facilement en "attaquant" le vecteur (tab)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    koala > ce n'est pas argv[i] que tu as voulu mettre ?

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::vector<std::string> tab;
    for(size_t i=0;i<argc;++i)
        tab.push_back(argv[0]);
    //maintenant, tu peux travailler sur un tableau de chaine "C++" ;)
    C'est pas plutôt argv[i]?

    Pourquoi pas simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::string> tab (argv, argv+argc);

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/06/2012, 00h07
  2. Réponses: 1
    Dernier message: 12/05/2010, 16h04
  3. Réponses: 2
    Dernier message: 04/03/2009, 12h00
  4. [Thread] Comment doit-on les gérer s'ils sont nombreux ?
    Par Abakai dans le forum Framework .NET
    Réponses: 8
    Dernier message: 10/08/2006, 23h21

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