Eternel problème...

Résolu
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008 - 5 mars 2008 à 12:51
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008 - 5 mars 2008 à 14:36
Bonjour à tous,


Voici un ptit bout de code, ayant pour but de récupérer un flux en héxa d'un fichier MPEG et d'en tirer des informations (en-tête, ID, ...). Le main commence par : 


char *ip_filepath;        // Récupération de la ligne de commande
 ...
 ...
 ...
 ... 
int main(int argc, char *argv[])
{
 if (argc == 1)
 {  display_usage();
  exit_prog(""); }


 while ((argc > 1) && (argv[1][0] == '-')) {
  switch (argv[1][1]) {
  case 'i':
   ip_filepath = &argv[1][2];
   break;
  case 'p':
   search_Packet_Identification = atoi(&argv[1][2]);
   break;
  case 'q':
   quite_mode = 1;
   break;
  default: 
   printf("Bad option %s\n", argv[1]);
   display_usage();
   exit_prog("");
  }
  ++argv;
  --argc;
 }


ip_file_length = get_ip_file_length(ip_filepath);
printf("Opening MPEG-2 file %s, %d bytes.\n", ip_filepath, ip_file_length);
printf("Search PID : %d", search_PID);
ip_file = fopen(ip_filepath, "rb");


char menu_choice = 0;


find_TS_sync_byte(); 
display_sync_byte_table();  // display location of sync_bytes
fseek(ip_file, sync_bytes[1], 0); // go back to first sync_byte
menu_choice = menu(); // display menu options
switch (menu_choice) // decode menu choice
 {
 case '1' : // TS header decode
 menu_option1();
 break;
 case '2' : // PID address table
 menu_option2();
 break;
 case '3' : // Save PID address table
 menu_option3();
 break;
 case '4' : // Extract PES
 menu_option4();
 break;
 case '5' : // exit
 exit_prog("");
 break;
 default:
 puts("\nERROR : Not a valid menu entry.");
 }
 exit_prog("");
 return 0;
}




Je ne comprends pas du tout les lignes/portions de code suivantes :


1) while ((argc > 1) && (argv[1][0] == '-'))


2) argv[1][1])


3) search_PID = atoi(&argv[1][2]);


4) pourquoi menu() est tout seul ? Erreur de compilation...


Quelqu'un pourrait-il m'expliquer clairement en faisant référence au problème de base ? (récupération d'information d'un flux MPEG en héxa en indiquant le chemin du fichier mpeg monfichier.mpg présent sur l'ordi.


Je suis au courant qu'il y a un tuto sur les paramètres de la fonction main, MERCI mais il ne répond pas à mes interrogations..


Je suis prêt à éclaircir tous points obscurs, après la pause déjeuner ;-)


Bonne journée à tous et merci à tous ceux qui voudront bien m'aider.

5 réponses

Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
5 mars 2008 à 13:30
Salut

Bon je vais tenter de repondre clairement a tes questions:
Deja avant de commencer il faut que tu saches que argc correspond au nombre de parametre passer a la fonction main et argv, est un char** qui stoke les noms des arguments.

Par exemple, si tu lance ton exe en ecrivant cette ligne de code:
MonExe -s test q
il y aura dans argv[0][]: la chaine de caractere  "MonExe"
argv[1][]: -s
argv[2][]: test
argv[3][]: q

Donc argc sera egale a 4

Ton prog verifie la validite des arguments passes au main.
argv[1][0] correspond au premier caractere du premier argument ('-' pour mon exemple)
Il faut que ce caractere soit egale a '-' pour que l'argument soit valide

argv[x][1] correspond au deuxieme caractere 
Il ya 3 possibilitees 'i', 'p' et 'q' pour que l'argument soit valide
Donc voici une ligne de commande qui donnera des arguments valides:
MonExe -iC:\MaVideo.mpg -p50 -q

On aura donc dans ipFilePath la chaine "MaVideo.mpg"
dans search_Packet_Identification l'entier 50 et quit_mode sera egal a 1.

Pour menu, il doit y avoir une fonction dans le reste du code appelle comme cela.
J'espere avoir repondu a tes questions

A+
Mon site internet : http://pistol.petesampras.free.fr
3
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
5 mars 2008 à 13:58
0) ip_filepath ne pointe pas la ligne de commande mais un argument de la ligne de commande.

1) On a visiblement une boucle qui est sensée parcourir les arguments de la ligne de commande mais on ne s'occupe que du second paramètre argv[1] !!! et encore si son premier caractère est un tiret (argv[1][0] == '-').

2) argv[1][1] = deuxième caractère (second indice 1) du second argument (premier indice 1).
 argv[0] pointe le premier argument (nom complet du programme),
 argv[1] pointe le second argument,
 argv[2] pointe le troisième argument ...
pour un argument quelconque argv[i] :
argv[i][0] = premier caractère,
argv[i][1] = second caractère ...

3) search_PID = atoi(&argv[1][2]) --> on convertit la chaîne de caractères qui commence au troisième caractère (second indice 2) du second argument (premier indice 1) de la ligne de commande en entier stocké dans la variable search_PID (= Atointeger). Les 2 caractères qui précèdent sont sensés être un tiret suivi d'une des lettres recherchées.

4) Visiblement menu() affiche un menu et retourne le choix saisi dans la variable menu_choice qui est traitée dans le switch.

Jean-François
3
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
5 mars 2008 à 14:31
1) Avec le ++argv à la fin de la boucle while() on parcourt bien tous les arguments !!!

Jean-François
3
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
5 mars 2008 à 13:11
excusez-moi, je n'ai pas trouvé les balises de codes ... :s
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dayvid75014 Messages postés 96 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 25 avril 2008
5 mars 2008 à 14:36
Merci à vous deux, pistol_pete et JFrançois !!!! Un grand merci pour vos explications claires, et concises !
0
Rejoignez-nous