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
    Points : 50 369
    Points
    50 369
    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

  3. #3
    Membre averti 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
    Points : 434
    Points
    434
    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
    Points : 50 369
    Points
    50 369
    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

  5. #5
    Alp
    Alp est déconnecté
    Expert éminent sénior

    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
    Points : 11 861
    Points
    11 861
    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 sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    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)

  7. #7
    Alp
    Alp est déconnecté
    Expert éminent sénior

    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
    Points : 11 861
    Points
    11 861
    Par défaut
    koala > ce n'est pas argv[i] que tu as voulu mettre ?

  8. #8
    Provisoirement toléré
    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
    Points : 495
    Points
    495
    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