Forums Rue-Montgallet.com
Rue-Montgallet.comRue-Hardware.comRue-Occasion.comRue-DVD.comRue-Jeuxvideo.comRue-AudioVideo.comRue-Telephone.comForums
S'inscrire | S'identifier |
| Recherche avancée | Aide
 
 

kazer Achat - Vente Informatique : kenta2 Achat - Vente Divers : Elokenz, tylerdurden0, ngu et 77 utilisateurs inconnus

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

Passage de paramètre en C

 
n°10449
linbeg
Profil : Jeune recrue
Posté le 14-10-2004 à 13:53:07  profilanswer
 

Je souhaiterais appliquer à l'une de mes fonctions la même méthode que dans le main
 
int main(int argc, char *argv[])
 
C'est à dire récupérer chaque chaine de caractères et le nombre d'arguments passés. Suis-je obligé de faire un system() pour relancer un autre main ou y a t-il une autre solution.
 
Exemple : j'ai une ligne de commande l'utilisateur tape quelque chose et je veux faire comme si j'étais sous DOS en fait c'est à dire récupérer les arguments et le nombre
 
Merci d'avance

n°10450
nico95
A la poursuite du SMS Staÿle
Profil : Dinosaure
Posté le 14-10-2004 à 14:30:09  profilanswer
 

linbeg a écrit :

Je souhaiterais appliquer à l'une de mes fonctions la même méthode que dans le main
 
int main(int argc, char *argv[])
 


int fonction(int argc, char *argv[])  
:spamafote: je vois pas ou est le probleme ..

n°10451
linbeg
Profil : Jeune recrue
Posté le 14-10-2004 à 15:08:40  profilanswer
 

nico95 a écrit :

int fonction(int argc, char *argv[])  
:spamafote: je vois pas ou est le probleme ..


NoN si tu préfère le main gère automatiquement les méthodes argv et argc qui son des mots clés.
Si je fais une fonction de type
fonction(argc, argv) il ne comprend pas ce que je veux dire!!
ça ne trouve pas automatiquement le nombre d'argument et ça ne les sépare pas automatiquement en les mettant chacun dans un tableau de pointeur de chaine.....
Pour l'instant j'ai trouvé une solution potable pour ceux que ça interessent. C'est de lancer l'exécution d'un autre programme c'est à dire créer un nouveau main!!!
Un peu chiant mais bon...
 :)

n°10452
nico95
A la poursuite du SMS Staÿle
Profil : Dinosaure
Posté le 14-10-2004 à 15:11:34  profilanswer
 

aaahhh ok ok ok ....
 
ta soluce, c'est un peu du rafistolage, nan ?

n°10453
P-Y
Intermittent du troll
Profil : Vieux de la vieille
Posté le 14-10-2004 à 16:10:14  profilanswer
 

Bah si t'appelles ta fonction directement depuis le main avec argc et argv comme arguments, ca devrait marcher non? :??:


Message édité par P-Y le 14-10-2004 à 16:10:35
n°10454
linbeg
Profil : Jeune recrue
Posté le 14-10-2004 à 16:30:04  profilanswer
 

P-Y a écrit :

Bah si t'appelles ta fonction directement depuis le main avec argc et argv comme arguments, ca devrait marcher non? :??:


 
Tu as raison, je pense que ça doit marcher mais c'est du rafistolage encore plus compliqué que le mien et dans mon cas il ne pourrait pas fonctionner, puisque mon programme démarre sur une identification, il n'y a pas de passage de paramètres. :pfff:  
 
Nico95 ==> C'est vrai que c'est un peu du rafistolage mais ça fonctionne bien et ça complique pas trop... :p

n°10456
P-Y
Intermittent du troll
Profil : Vieux de la vieille
Posté le 14-10-2004 à 17:11:18  profilanswer
 

linbeg a écrit :

Tu as raison, je pense que ça doit marcher mais c'est du rafistolage encore plus compliqué que le mien et dans mon cas il ne pourrait pas fonctionner, puisque mon programme démarre sur une identification, il n'y a pas de passage de paramètres. :pfff:  
 
Nico95 ==> C'est vrai que c'est un peu du rafistolage mais ça fonctionne bien et ça complique pas trop... :p


ah ok je comprends mieux :)
Bon ben t'as plus qu'a ecrire un mini parser de chaine de caractères :D

n°10459
podone
POD first ONE of best game
Profil : Habitué
Posté le 15-10-2004 à 21:38:20  profilanswer
 

Voici une solution possible :

Code :
  1. // ARG.cpp : définit le point d'entrée pour l'application console.
  2. //
  3. #include "stdafx.h"
  4. #include <windows.h>
  5. #include <string.h>
  6. // Taille de la ligne de saisie
  7. #define  USERCMDSIZE                   (256)
  8. // Caractere de separation de commandes
  9. #define  CMDSEPARATORCHAR              (' ')
  10. // Caractere de generation de chaine
  11. #define  MAKESTRINGCHAR                ('\0')
  12. // Structure de commande utilisateur
  13. typedef struct _USERCMD
  14. {
  15.    int                  argc;          // Nombre d'entrees
  16.    char**               argv;          // Tableau des arguments
  17. }
  18. USERCMD;
  19. typedef USERCMD*                       LPUSERCMD;
  20. void MaFonction(int argc, char* argv[]);
  21. void P_GetUserCommand(LPUSERCMD  A_lpCmd);   // OUT
  22. void P_FreeCommand(LPUSERCMD  A_lpCmd); // OUT
  23. int _tmain(int argc, char* argv[])
  24. {
  25. // Commandes utilisateur
  26. USERCMD                 xUserCmd;
  27.    // Recuperer les commandes utilisateur
  28.    P_GetUserCommand(&xUserCmd);
  29.    // Les passer en argument de fonction
  30.    MaFonction(xUserCmd.argc, xUserCmd.argv);
  31.    // Liberer la memoire
  32.    P_FreeCommand(&xUserCmd);
  33.    // Encore une fois
  34.    P_GetUserCommand(&xUserCmd);
  35.    // Les passer en argument de fonction
  36.    MaFonction(xUserCmd.argc, xUserCmd.argv);
  37.    // Liberer la memoire
  38.    P_FreeCommand(&xUserCmd);
  39. return 0;
  40. }
  41. void MaFonction(int argc, char* argv[])
  42. {
  43. // DECLARATION DES VARIABLES LOCALES
  44. // Compteur de boucles
  45. int                     i;
  46. // TRAITEMENT
  47.    // POUR chaque commande
  48.    for (i = 0; i < argc; i++)
  49.    {
  50.       // Afficher la commande
  51.       printf("%s\n", argv[i]);
  52.    }
  53.    // FIN POUR
  54. } // fin MaFonction()
  55. void P_GetUserCommand(LPUSERCMD  A_lpCmd)    // OUT
  56. {
  57. // DECLARATION DES VARIABLES LOCALES
  58. // Ligne de commande
  59. char*                   lpszLineBuffer;
  60. // Commande
  61. char*                   lpszCmd;
  62. // Adresse de la commande
  63. char**                  lpCmdAd;
  64. // Resultat de fonction
  65. char*                   lpszApiResult;
  66. // Taille de la commande
  67. BYTE                    byCmdSize;
  68. // TRAITEMENT
  69.    // Initialiser le resultat
  70.    A_lpCmd->argc = 0;
  71.    A_lpCmd->argv = NULL;
  72.    // Reserver la memoire pour le buffer
  73.    lpszLineBuffer = (char*) malloc(USERCMDSIZE);
  74.    // Initialiser l'adresse de la premiere commande
  75.    lpszCmd = lpszLineBuffer;
  76.    // Recuperer les nouvelles commandes
  77.    lpszApiResult = gets(lpszLineBuffer);
  78.    // SI reussite
  79.    if (lpszApiResult)
  80.    {
  81.       // TANT QUE analyse en cours (cas aucune entrée ou dernier caractere est le caractère séparateur de commandes)
  82.       while (*lpszCmd)
  83.       {
  84.          // Rechercher la fin de commande
  85.          lpszApiResult = strchr(lpszCmd, CMDSEPARATORCHAR);
  86.          // Calculer la taille de la commande
  87.          byCmdSize = (BYTE)((size_t)lpszApiResult - (size_t)lpszCmd);
  88.          // Reserver la memoire pour la commande
  89.          A_lpCmd->argv = (char**) realloc(A_lpCmd->argv,
  90.                                           (sizeof(char*)) * (A_lpCmd->argc + 1));
  91.          // Actualiser l'adresse de la commande
  92.          lpCmdAd = A_lpCmd->argv + A_lpCmd->argc++;
  93.          // Allouer la memoire pour la commande
  94.          *lpCmdAd = (char*) malloc(byCmdSize + 1);
  95.        
  96.          // Recuperer la commande
  97.          memcpy(*lpCmdAd, lpszCmd, byCmdSize);
  98.          *(*lpCmdAd + byCmdSize) = MAKESTRINGCHAR;
  99.          // SI fin d'analyse
  100.          if (!lpszApiResult)
  101.          {
  102.             // Terminer le traitement
  103.             break;
  104.          }
  105.          // FIN SI
  106.          // Recuperer l'adresse du separateur de commandes
  107.          lpszCmd = lpszApiResult;
  108.          // FAIRE
  109.          do
  110.          {
  111.             // Actualiser le pointeur
  112.             lpszCmd++;
  113.          }
  114.          // TANT QUE separateur de commandes en cours
  115.          while (*lpszCmd == CMDSEPARATORCHAR);
  116.       }
  117.       // FIN TANT QUE
  118.    }
  119.    // FIN SI
  120.    // Desallouer le buffer
  121.    free(lpszLineBuffer);
  122. } // fin P_GetUserCommand()
  123. void P_FreeCommand(LPUSERCMD  A_lpCmd)  // OUT
  124. {
  125. // DECLARATION DES VARIABLES LOCALES
  126. // Compteur de boucles
  127. int                     i;
  128. // Adresse de la commande
  129. char**                  lpCmdAd;
  130. // TRAITEMENT
  131.    // POUR chaque commande
  132.    for (i = 0; i < A_lpCmd->argc; i++)
  133.    {
  134.       // Actualiser l'adresse de la commande
  135.       lpCmdAd = A_lpCmd->argv + i;
  136.       // Supprimer la memoire allouee
  137.       free(*lpCmdAd);
  138.    }
  139.    // FIN POUR
  140.    // Supprimer l'allocation pointeur
  141.    free(A_lpCmd->argv);
  142. } // fin P_FreeCommand()


Message édité par podone le 16-10-2004 à 13:19:47
n°10466
podone
POD first ONE of best game
Profil : Habitué
Posté le 16-10-2004 à 12:26:00  profilanswer
 

A noter que cette solution ne fonctionne que si la commande saisie ne déborde pas de la taille maximale autorisée.
Sinon il faut passer par la fonction fgets et effectuer une gestion des erreurs.

n°10472
linbeg
Profil : Jeune recrue
Posté le 17-10-2004 à 21:52:23  profilanswer
 

podone a écrit :

A noter que cette solution ne fonctionne que si la commande saisie ne déborde pas de la taille maximale autorisée.
Sinon il faut passer par la fonction fgets et effectuer une gestion des erreurs.


 
Un peu complexe mais efficace !!  
Merci beaucoup !!  :bounce:

n°10473
podone
POD first ONE of best game
Profil : Habitué
Posté le 17-10-2004 à 21:58:32  profilanswer
 

You're welcome !  ;)


Aller à :
Ajouter une réponse