Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
612 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1110077
duch
Posté le 06-06-2005 à 17:47:53  profilanswer
 

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
mood
Publicité
Posté le 06-06-2005 à 17:47:53  profilanswer
 

n°1110102
ritzle
Posté le 06-06-2005 à 18:05:31  profilanswer
 

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
n°1110108
gedeon
Posté le 06-06-2005 à 18:07:51  profilanswer
 

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 ???

n°1110111
duch
Posté le 06-06-2005 à 18:12:57  profilanswer
 

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
n°1110121
Docteur_Cu​be
Posté le 06-06-2005 à 18:17:39  profilanswer
 

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...

n°1110132
gedeon
Posté le 06-06-2005 à 18:29:36  profilanswer
 

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

n°1110134
duch
Posté le 06-06-2005 à 18:30:54  profilanswer
 

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

n°1110142
gedeon
Posté le 06-06-2005 à 18:37:08  profilanswer
 

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
n°1110144
duch
Posté le 06-06-2005 à 18:38:39  profilanswer
 

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

n°1110153
gedeon
Posté le 06-06-2005 à 18:47:56  profilanswer
 

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

mood
Publicité
Posté le 06-06-2005 à 18:47:56  profilanswer
 

n°1110169
ritzle
Posté le 06-06-2005 à 19:05:44  profilanswer
 

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

n°1110200
duch
Posté le 06-06-2005 à 19:32:32  profilanswer
 

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
n°1110234
Docteur_Cu​be
Posté le 06-06-2005 à 20:08:23  profilanswer
 

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 ?

n°1110252
matafan
Posté le 06-06-2005 à 20:26:32  profilanswer
 

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

n°1110522
Emmanuel D​elahaye
C is a sharp tool
Posté le 07-06-2005 à 07:59:19  profilanswer
 

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/
n°1110523
Emmanuel D​elahaye
C is a sharp tool
Posté le 07-06-2005 à 08:00:46  profilanswer
 

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/
n°1110621
duch
Posté le 07-06-2005 à 10:13:57  profilanswer
 

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.

n°1110994
ritzle
Posté le 07-06-2005 à 13:25:21  profilanswer
 

Emmanuel Delahaye a écrit :

C'est une plaisanterie ?


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

n°1110999
blackgodde​ss
vive le troll !
Posté le 07-06-2005 à 13:27:54  profilanswer
 

ENORME ce topic !!!


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
[java] recuperer le nom d'une variableproblème avec strtok pour récupérer les vides
arguments optionnelsRécupérer des url depuis une page
Comment récupérer des infos sur plein de siterecuperer fichier via url et proxy
Faire correspondre une chaine de caractère et un entier.[PHP]Recuperer un fichier via son url
récupérer les impulsions de la souris[ASP]Récupérer un champ dans une list déroulante
Plus de sujets relatifs à : [C] récupérer les arguments de argv en entier?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR