podone POD first ONE of best game Profil : Habitué | Voici une solution possible :
Code :
- // ARG.cpp : définit le point d'entrée pour l'application console.
- //
- #include "stdafx.h"
- #include <windows.h>
- #include <string.h>
- // Taille de la ligne de saisie
- #define USERCMDSIZE (256)
- // Caractere de separation de commandes
- #define CMDSEPARATORCHAR (' ')
- // Caractere de generation de chaine
- #define MAKESTRINGCHAR ('\0')
- // Structure de commande utilisateur
- typedef struct _USERCMD
- {
- int argc; // Nombre d'entrees
- char** argv; // Tableau des arguments
- }
- USERCMD;
- typedef USERCMD* LPUSERCMD;
- void MaFonction(int argc, char* argv[]);
- void P_GetUserCommand(LPUSERCMD A_lpCmd); // OUT
- void P_FreeCommand(LPUSERCMD A_lpCmd); // OUT
- int _tmain(int argc, char* argv[])
- {
- // Commandes utilisateur
- USERCMD xUserCmd;
- // Recuperer les commandes utilisateur
- P_GetUserCommand(&xUserCmd);
- // Les passer en argument de fonction
- MaFonction(xUserCmd.argc, xUserCmd.argv);
- // Liberer la memoire
- P_FreeCommand(&xUserCmd);
- // Encore une fois
- P_GetUserCommand(&xUserCmd);
- // Les passer en argument de fonction
- MaFonction(xUserCmd.argc, xUserCmd.argv);
- // Liberer la memoire
- P_FreeCommand(&xUserCmd);
- return 0;
- }
- void MaFonction(int argc, char* argv[])
- {
- // DECLARATION DES VARIABLES LOCALES
- // Compteur de boucles
- int i;
- // TRAITEMENT
- // POUR chaque commande
- for (i = 0; i < argc; i++)
- {
- // Afficher la commande
- printf("%s\n", argv[i]);
- }
- // FIN POUR
- } // fin MaFonction()
- void P_GetUserCommand(LPUSERCMD A_lpCmd) // OUT
- {
- // DECLARATION DES VARIABLES LOCALES
- // Ligne de commande
- char* lpszLineBuffer;
- // Commande
- char* lpszCmd;
- // Adresse de la commande
- char** lpCmdAd;
- // Resultat de fonction
- char* lpszApiResult;
- // Taille de la commande
- BYTE byCmdSize;
- // TRAITEMENT
- // Initialiser le resultat
- A_lpCmd->argc = 0;
- A_lpCmd->argv = NULL;
- // Reserver la memoire pour le buffer
- lpszLineBuffer = (char*) malloc(USERCMDSIZE);
- // Initialiser l'adresse de la premiere commande
- lpszCmd = lpszLineBuffer;
- // Recuperer les nouvelles commandes
- lpszApiResult = gets(lpszLineBuffer);
- // SI reussite
- if (lpszApiResult)
- {
- // TANT QUE analyse en cours (cas aucune entrée ou dernier caractere est le caractère séparateur de commandes)
- while (*lpszCmd)
- {
- // Rechercher la fin de commande
- lpszApiResult = strchr(lpszCmd, CMDSEPARATORCHAR);
- // Calculer la taille de la commande
- byCmdSize = (BYTE)((size_t)lpszApiResult - (size_t)lpszCmd);
- // Reserver la memoire pour la commande
- A_lpCmd->argv = (char**) realloc(A_lpCmd->argv,
- (sizeof(char*)) * (A_lpCmd->argc + 1));
- // Actualiser l'adresse de la commande
- lpCmdAd = A_lpCmd->argv + A_lpCmd->argc++;
- // Allouer la memoire pour la commande
- *lpCmdAd = (char*) malloc(byCmdSize + 1);
-
- // Recuperer la commande
- memcpy(*lpCmdAd, lpszCmd, byCmdSize);
- *(*lpCmdAd + byCmdSize) = MAKESTRINGCHAR;
- // SI fin d'analyse
- if (!lpszApiResult)
- {
- // Terminer le traitement
- break;
- }
- // FIN SI
- // Recuperer l'adresse du separateur de commandes
- lpszCmd = lpszApiResult;
- // FAIRE
- do
- {
- // Actualiser le pointeur
- lpszCmd++;
- }
- // TANT QUE separateur de commandes en cours
- while (*lpszCmd == CMDSEPARATORCHAR);
- }
- // FIN TANT QUE
- }
- // FIN SI
- // Desallouer le buffer
- free(lpszLineBuffer);
- } // fin P_GetUserCommand()
- void P_FreeCommand(LPUSERCMD A_lpCmd) // OUT
- {
- // DECLARATION DES VARIABLES LOCALES
- // Compteur de boucles
- int i;
- // Adresse de la commande
- char** lpCmdAd;
- // TRAITEMENT
- // POUR chaque commande
- for (i = 0; i < A_lpCmd->argc; i++)
- {
- // Actualiser l'adresse de la commande
- lpCmdAd = A_lpCmd->argv + i;
- // Supprimer la memoire allouee
- free(*lpCmdAd);
- }
- // FIN POUR
- // Supprimer l'allocation pointeur
- free(A_lpCmd->argv);
- } // fin P_FreeCommand()
|
Message édité par podone le 16-10-2004 à 13:19:47
|