Perte d'arguments dans la ligne de commande

Perte d'arguments dans la ligne de commande - C - Programmation

Marsh Posté le 17-01-2011 à 17:52:26    

Bonjour,
 
Je suis en train d'écrire un programme en C sous Linux, qui accepte des arguments sur sa ligne de commande.
Pour l'instant, la ligne de commande ressemble à ceci :
 
<Programme> -c <fichier de config>
 
A l'exécution, le programme s'arrête tout de suite car pour lui, la variable qui récupère le nom du fichier de config est vide.
 
Comme ma fonction de traitement d'arguments (avec getopt) semblait correcte, j'ai mis en toute première instruction de la fonction 'main', une boucle qui affiche le contenu de ma variable 'argv'.
 
Et là, surprise : tout ce qui ressort, c'est :
<Programme>
<fichier de config>
 
Et j'obtiens toujours le même résultat, même si je rajoute une floppée d'options -x -r -g- s ...
Même en enlevant le caractère "-" des options, celles-ci ne sont pas vues.
 
J'ai l'impression que c'est un problème système, puisque les variables 'argc' et 'argv' passées à la fonction 'main' sont fausses dès le départ.
 
Ce problème évoque-t-il quelque chose à une âme charitable ? Quelqu'un a-t-il une solution ?
 
Merci d'avance !
 

Reply

Marsh Posté le 17-01-2011 à 17:52:26   

Reply

Marsh Posté le 17-01-2011 à 19:53:01    

Bonsoir,
Poste ton bout de code de test de argc et argv, peut-être ....

Reply

Marsh Posté le 17-01-2011 à 20:58:58    

T'as pris en compte le fait que argv soit un tableau et commence à 0?


---------------
sheep++
Reply

Marsh Posté le 18-01-2011 à 10:28:15    

Je pense faire les choses dans les règles. Voici le début de ma fonction "main":  
 

Code :
  1. int main ( int argc , char *argv[] ) {
  2. std::cerr << "argc = " << argc << std::endl;
  3. for ( int i = 0 ; i < argc ; ++i ) {
  4.  std::cerr << argv[i] << std::endl;
  5. }
  6. if ( parse_arguments ( argc , argv ) != 0 ) {
  7.  std::cerr << "Erreur dans les arguments" << std::endl;
  8. }
  9. ...


 
Le hic, c'est que argc vaut 2 dès l'entrée dans la fonction. Un peu comme si le système prenait la liberté de choisir ce qu'il transmet au programme.
 
 

Reply

Marsh Posté le 18-01-2011 à 10:38:51    

je ne reproduis pas le probleme...
 

Code :
  1. $ cat shaoyin.cpp
  2. #include <iostream>
  3. int main(int argc, char *argv[])
  4. {
  5.     std::cerr << "argc = " << argc << std::endl;
  6.     for (int i = 0; i < argc; ++i) {
  7.         std::cerr << argv[i] << std::endl;
  8.     }
  9.     return 0;
  10. }
  11. $ g++ -o shaoyin shaoyin.cpp
  12. $ ./shaoyin -c config
  13. argc = 3
  14. ./shaoyin
  15. -c
  16. config
  17. $


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 18-01-2011 à 11:01:40    

Et heureusement !
 
Je me demande si le problème ne viendrait pas du fait que je compile sur une machine et que j'exécute le programme sur une autre.
Les deux machines ont la même distribution (CentOS), mais des versions différentes (5.2 pour la machine de développement, 5.5 pour la machine de test).
 
Je vais essayer de compiler le programme directement sur la machine de test.
 
[Edit] Après compilation sur la machine cible, le problème a disparu. Ca doit venir de mon environnement de développement. Reste à trouver où.
Merci en tout cas pour votre aide !


Message édité par shaoyin le 18-01-2011 à 11:23:19
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed