[C] récupérer les arguments de argv en entier?

récupérer les arguments de argv en entier? [C] - C - Programmation

Marsh Posté le 06-06-2005 à 17:47:53    

désolé pour la question stupide, mais j'ai fait un p'tit programme en C qui fonctionne bien qd je mets les paramètres en dur dans le programme (pour les tests) mais je n'arrive pas à utiliser les paramètres qui viennent de la ligne de commande.
 
Je dois utiliser des int et manifestement ils récupèrent les valeurs de argv en stringn comment les transformer en int?
 
j'ai essayé :  
 
int mavaleur = (int) argv[1];
 
mais ça marche pô :snif:
 
 
 
EDIT : en fait c'est pas du C++ mon truc mais du C, non?


Message édité par duch le 06-06-2005 à 18:26:01
Reply

Marsh Posté le 06-06-2005 à 17:47:53   

Reply

Marsh Posté le 06-06-2005 à 18:05:31    

Code :
  1. resultat = 0;
  2. for( i=0 ; argv[1][i]!='\0' ; i++ );
  3. chiffres = i;
  4. for( i=chiffres ; i>=0 ; i-- )
  5. {
  6.   switch( argv[1][i] )
  7.   {
  8.     case '1':
  9.       resultat += 1 * pow(10,i-chiffres) / 10;
  10.       break;
  11.     case '2':
  12.       resultat += 2 * pow(10,i-chiffres) / 10;
  13.       break;
  14.     case '3':
  15.       resultat += 3 * pow(10,i-chiffres) / 10;
  16.       break;
  17.     case '4':
  18.       resultat += 4 * pow(10,i-chiffres) / 10;
  19.       break;
  20.     case '5':
  21.       resultat += 5 * pow(10,i-chiffres) / 10;
  22.       break;
  23.     case '6':
  24.       resultat += 6 * pow(10,i-chiffres) / 10;
  25.       break;
  26.     case '7':
  27.       resultat += 7 * pow(10,i-chiffres) / 10;
  28.       break;
  29.     case '8':
  30.       resultat += 8 * pow(10,i-chiffres) / 10;
  31.       break;
  32.     case '9':
  33.       resultat += 9 * pow(10,i-chiffres) / 10;
  34.       break;
  35.    
  36.   }
  37. }
  38. printf( "nombre passé : %d", chiffres );


Message édité par ritzle le 06-06-2005 à 18:23:25
Reply

Marsh Posté le 06-06-2005 à 18:07:51    

Et donc t'arrive pas a y arriver vu que ça marche pas ?
Ca se trouve  
int mavaleur = (int) argv[1];  
marche bien dans un autre prog (mais j'en doute), d'ou ton incompréhension du PB, je compatis.
Bon j'ai pas mal boule de crystal sur moi, a défaut tu peut faire peter les details.
 
PS : t'as essayé les fonctions de converstion de chaine en int ???

Reply

Marsh Posté le 06-06-2005 à 18:12:57    

non, je n'ai pas essayé les conversions de chaines en int, et à vrai dire je ne les connais pas car je ne connais pas le C.
 
en fait ce qui me turlupine, c'est que j'essaie de faire un printf ("%d \n", mavaleur) ça me renvoi n'importe quoi, il n'y a que si je fait printf ("%s \n", mavaleur) que ça me renvoi le truc correctement, donc j'en ai conclu que c'était un string (un peu hativement).
 
 
bon voilà le code
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. unsigned int maxsample = 0;
  4. char erg[35];
  5. int is16bitfile = 1;
  6. int main(int argc, char *argv[]) {
  7. unsigned int time, samplerate, channels, totalsamples, samplesbysecond;
  8. int i, val, val2;
  9. FILE *infile;
  10. FILE *file;
  11. time = (int) argv[3];
  12. samplerate = (int) argv[4];
  13. channels = (int) argv[5];
  14. samplesbysecond = (int) argv[6];
  15. samplerate = samplerate*channels;
  16. totalsamples = time*samplerate;
  17. infile = fopen(argv[1], "r" );
  18. file = fopen(argv[2], "w" );
  19. fputs("data=", file);
  20. for (i=0;i<totalsamples;i++) {
  21.  val = fgetc(infile);
  22.  if (is16bitfile) {
  23.   val2 = fgetc(infile);
  24.   if (val2 > 127) { val2 = val2 - 255; }
  25.   val = 256*val2 + val;
  26.  }
  27.  // on stocke la plus haute valeur
  28.  if(maxsample < abs(val)) {
  29.   maxsample = abs(val);
  30.  }
  31.  // on utilise que samplesbysecond échantillons par seconde
  32.  printf ("%d \n", samplesbysecond);
  33.  if (i%(samplerate/samplesbysecond)==0) {
  34.   sprintf(erg, "%d,", maxsample);
  35.   fputs(erg, file);
  36.   maxsample = 0;
  37.  }
  38. }
  39. // housekeeping
  40. fclose(file);
  41. fclose(infile);
  42. return 1;
  43. }


 
 
 
en fait mon problème c'est que j'ai une Floating point exception (au niveau de if (i%(samplerate/samplesbysecond)==0) {) qd je lance le programme comme cela :
 
./fftux theevent-zoom.wav cho.raw 227 44100 2 10
 
donc je me suis dis que c'était un problème de types...


Message édité par duch le 06-06-2005 à 18:13:59
Reply

Marsh Posté le 06-06-2005 à 18:17:39    

En C c'est pareil, les argv sont des chaines de caractères.. Je me souviens que j'ai programmé un algorithme pour convertir ça en Int.. Enfin, ça ne doit pas être bien compliqué.. Il a un nom cet algorithme (le nom de son créateur..), mais on peut le retrouver facilement.. Je chercherai dans mes cours ce soir quand je serais chez moi..  
Au pire, tu prends une table ASCII, et t'improvise...

Reply

Marsh Posté le 06-06-2005 à 18:29:36    

Déja juste un truc, l'indice d'un tableau commence par 0 !!!
Donc ça : argv[6] ça pointe sur le ... 7 éme argument

Reply

Marsh Posté le 06-06-2005 à 18:30:54    

oui ça je savais ;-)
 
mais argv[0] c'est le prog lui même, donc les arguments, eux commencent à 1.

Reply

Marsh Posté le 06-06-2005 à 18:37:08    

Ok par contre un conseil verifie ton nombre d'argument avant de faire le reste.
Ensuite

Code :
  1. # time = (int) argv[3];
  2. #     samplerate = (int) argv[4];
  3. #     channels = (int) argv[5];
  4. #     samplesbysecond = (int) argv[6];


 
La si je ne m'abuse tu travaille sur les pointeurs et pas sur les valeur
 

Code :
  1. # infile = fopen(argv[1], "r" );
  2. #     file = fopen(argv[2], "w" );


 
La ça marche car les fonction reclame un pointeur sur une chaine


Message édité par gedeon le 06-06-2005 à 18:38:23
Reply

Marsh Posté le 06-06-2005 à 18:38:39    

mais je demande que ça de bosser sur les valeurs, on les récupère comment?

Reply

Marsh Posté le 06-06-2005 à 18:47:56    

C'etait dans le PS de mon premier message  
Je t'aide encore un peu ---> atoi

Reply

Marsh Posté le 06-06-2005 à 18:47:56   

Reply

Marsh Posté le 06-06-2005 à 19:05:44    

et toute la série : atof, atol...

Reply

Marsh Posté le 06-06-2005 à 19:32:32    

ok j'ai vu que ça fonctionnait sur les fichiers, mais comment bosser sur les valeurs pour les autres paramètres?
 
j'ai peut-être mal vu mais t'as pas donner la soluce, si?
 
 
 
Edit : ah bah oui, j'avais mal vu ;-)


Message édité par duch le 06-06-2005 à 19:46:51
Reply

Marsh Posté le 06-06-2005 à 20:08:23    

Haaaaaaaa oui !! atoi() !!! C'est ça, c'est exactement ça !! On peut utiliser ça, mais on peut aussi programmer un petit truc d'une dizaine de lignes pour faire la même chose.  
Incroyable comme la mémoire peut jouer des tours... Et t'autais pas le nom du monsieur qui a inventé l'algo. par hasard ?

Reply

Marsh Posté le 06-06-2005 à 20:26:32    

Non, atoi() est a eviter car cette fonction ne permet de detecter les cas d'erreur correctement. Utilises strtol() ou sscanf().

Reply

Marsh Posté le 07-06-2005 à 07:59:19    

duch a écrit :

j'ai fait un p'tit programme en C qui fonctionne bien qd je mets les paramètres en dur dans le programme (pour les tests) mais je n'arrive pas à utiliser les paramètres qui viennent de la ligne de commande.
 
Je dois utiliser des int et manifestement ils récupèrent les valeurs de argv en stringn comment les transformer en int?


strtol() strtoul(). Fait de ton mieux, et poste ton code en cas de problèmes.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 07-06-2005 à 08:00:46    

ritzle a écrit :



for( i=0 ; argv[1][i]!='\0' ; i++ );
chiffres = i;
 
for( i=chiffres ; i>=0 ; i-- )
{
  switch( argv[1][i] )
  {
    case '1':
      resultat += 1 * pow(10,i-chiffres) / 10;
      break;



C'est une plaisanterie ?


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 07-06-2005 à 10:13:57    

elle est bonne, non?
 
 
bon déjà j'ai essayé avec atoi et ça marche, merci les gars.
 
J'essaierais ensuite d'ajouter des tests d'erreur.

Reply

Marsh Posté le 07-06-2005 à 13:25:21    

Emmanuel Delahaye a écrit :

C'est une plaisanterie ?


 
ca n'affiche que le dernier chiffre. Pourtant je l'avais deja fait et ca fonctionnait

Reply

Marsh Posté le 07-06-2005 à 13:27:54    

ENORME ce topic !!!


---------------
-( BlackGoddess )-
Reply

Sujets relatifs:

Leave a Replay

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