Fonction getopt() [C] - C - Programmation
Marsh Posté le 03-01-2006 à 22:36:01
Sebou77 a écrit : En fait si j'ai bien compris argc est ni plus ni moins que le nombre de mot contenu sur la ligne d'arguments, et argv cette ligne d'argument. |
Non. Les arguments reçus dans main() sont sous la forme d'un tableau de pointeur sur tableau de char (chaine) et non d'une chaine unique. Le système à fait le découpage (selon ses propres citères). Le premier paramètre indique le nombre d'élements dans le le tableau (sachant que les paramèttes démarrent à [1].
Pour simuler la ligne de commande
$ monprog param1 param2 |
, il faut faire :
|
et passer çà à getopt.
getopt (argc, argv, liste_options); |
Marsh Posté le 03-01-2006 à 22:40:40
donc je vais bien être obliger de modifier ma structure alors ?
Merci
Marsh Posté le 09-01-2006 à 21:11:27
Me revoilà
Maintenant ma structure est comme celà :
Code :
|
J'aimerais faire référence à ma variable char ** value, la remplir, la lire etc ...
A titre d'exemple voilà ma fonction main :
Code :
|
Malheureusement j'ai une erreur au moment du remplisage du value
Je pense que c'est une question de référence avec mon deb->value qui va pas, j'ai testé pas mal de chose mais je trouve pas
Si quelqu'un pouvait m'en dire plus sur le fonctionnement du type char ** ça m'aiderais grandement aussi, ou un lien à la rigueur mais perso j'ai rien trouvé
Merci
Marsh Posté le 09-01-2006 à 21:49:29
Sebou77 a écrit : Me revoilà |
Mes commentaires (-ed-)
Code :
|
Citation : Si quelqu'un pouvait m'en dire plus sur le fonctionnement du type char ** ça m'aiderais grandement aussi, |
http://mapage.noos.fr/emdel/notes.htm#char_star
Marsh Posté le 09-01-2006 à 22:33:14
Merci beaucoup !
Je repart donc grâce à ton code :
Code :
|
Mais quand j'éxécute il m'affiche un d.
Je ne comprends pas étant donné que ce que tu as mis me parait on ne peu plus juste !
Ce qui m'étonne encore plus c'est que quand j'enlève les tests (les 2 if) il m'affiche un P
Comprends pas là
Marsh Posté le 09-01-2006 à 22:41:13
Sebou77 a écrit :
|
Une chaine s'affiche avec "%s".
Marsh Posté le 09-01-2006 à 23:00:30
Une dernière question (après j'arrète c'est promis )
Je voudrais juste ajouter une chaine à la suite de deb->value[0] grace à strcat(), mais j'ai un beau Segmentation Fault
Code :
|
ça doit venir de la gestion mémoire, à cause de strcat nan ?
Marsh Posté le 09-01-2006 à 23:20:07
Sebou77 a écrit : Je voudrais juste ajouter une chaine à la suite de deb->value[0] grace à strcat(), mais j'ai un beau Segmentation Fault
|
Normal. "monprog" est une chaine non modifiable. Toute tentative de modification entraine un comportement indéfini. strcat() s'utilise sur des tableau de char modifiable et avec de la place suffisante pour y mettre la chaine résultante. Par exemple :
|
Marsh Posté le 10-01-2006 à 08:13:48
ReplyMarsh Posté le 10-01-2006 à 08:58:35
Sebou77 a écrit : je comprends pas trop pourquoi mais ça mache |
Alors il faut revenir à la base.
Lorsqu'on écrit
puts ("hello" ); |
ou
char *p = "hello"; |
"hello" est une string literal, c'est à dire une chaine non modifiable. Sa représentation en mémoire est un tableau de char initialisé et terminé par un zéro :
{'h','e','l','l','o',0} |
La définition du langage C précise que ce tableau ne doit pas être modifié sous peine de comportement indéfini. Dans la pratique, ce tableau est en effet le plus souvent placé dans une zone mémoire non modifiable, soit physiquement (PROM, Flash), soit logiquement par la MMU (Memory Management Unit) comme sous Windows ou Linux, par exemple (zone à lecture seule).
Par contre, un tableau de char est modifiable :
Celui-ci n'est pas initialisé.
|
Tant qu'il y a de la place, on peut écrire dedans :
strcpy (s, "hello" ); |
et même 'ajouter' une chaine (concaténer)
strcat (s, " world" ); |
On peut aussi définir un tableau initialisé :
|
Celui-ci est modifiable
s[2] = 'x'; |
ou
strcpy (s, "hi" ); |
mais on ne peut écrire au delà de sa taille (ici, strlen ("hello" ) + 1 pour le 0 final, qui est aussi égale à sizeof s).
On peut aussi définir un tableau initialisé par une chaine plus petite que sa taille :
|
Dans ce cas, la taille est sizeof s (soit 128 bytes). Le début de ce tableau est occupé par les caractères de la chaine "hello", et le reste est mis automatiquement à 0. Tout le tableau est modifiable, et on on peut aussi utiliser strcat().
Dans tout les cas, le programmeur doit s'assurer qu'il n'y a pas de débordement du tableau (en C, il n'y a pas de contrôle dynamique), sous peine de comportement indéfini. (Le plus grave et le plus tordu des bugs C)
Marsh Posté le 10-01-2006 à 09:05:00
Merci des précisions !
C'est clair que les erreurs viennent vite à ce niveau, c'est subtile !
Marsh Posté le 10-01-2006 à 11:15:21
Bon devinez quoi, j'ai encore un problème
Et c'est le même !
Code :
|
J'ai une erreur à la ligne 21 et 26.
Je ne comprends pas étant donné que je fais ça plusieur fois dans le programme de la même manière et y a pas de prob
Apparement j'ai pas encore tout assimilé
Marsh Posté le 03-01-2006 à 22:16:50
Bonjour à tous et tout d'abord bonne année
Alors voilà je voudrais utiliser la fonction getopt mais pas comme elle est d'habitude, c'est à dire que je voudrais l'utiliser avec une ligne d'argument que je rentre dans mon programme et non à la ligne de lancemement de mon programme.
Voici le prototype de la fonction :
En fait si j'ai bien compris argc est ni plus ni moins que le nombre de mot contenu sur la ligne d'arguments, et argv cette ligne d'argument.
Donc si je cré ma ligne et que je compte le nombre de mot qui s'y trouvent je dois pouvoir utiliser cette fonction!
Le problème est que j'ai une structure comme celle là :
Or j'ai des problème avec mon 2ème argument de getopt qui est variable->value, je vois bien que ce n'est pas le même type (il veut un char ** et moi j'ai un char *), mais je ne vois pas comment résoudre le problème sans changer le type de value dans ma structure, et je préferais pas car ça changerais pas mal de truc dans mon programme
->Si j'utilise pas les arguments directement sur la ligne de commande c'est parce que je les stocke tous et que je les réutilise
Merci beaucoup