IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

utilisation de argc/argv : mauvais arguments renvoyés ?


Sujet :

C

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 6
    Par défaut utilisation de argc/argv : mauvais arguments renvoyés ?
    Bonjour,

    je débute en C et je bloque sur un exercice où je suis censée utiliser argc et argv.

    Je dois coder une fonction printInfos qui affiches les arguments de la commande rentrée dans le terminal
    (exemple :
    argv[0] : './args'
    argv[1] : 'coucou'
    argv[2] : '-option'
    argv [3] : '3.56 ')

    le code de ma fonction est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int i;
    	printf("Nombre d'arguments passés au programme : %d\n", argc);
    	for (i=0 ; i<argc; i++){
    		printf(" argv[%d] : '%s'\argc", i, tab[i]);
    	}
    Quand j'insère directement ce bout de code dans mon main, j'obtiens bien le résultat attendu.
    Sauf que quand je veux l'isoler pour en faire une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void printInfos(int n, char * tab[n]){
    	int i;
    	printf("Nombre d'arguments passés au programme : %d\n", n);
    	for (i=0 ; i<n; i++){ //boucle parcourt la liste des arguments
    		printf(" argv[%d] : '%s'\n", i, tab[i]); //affiche les arguments et leur position un par un
    	}
    }
    Que j'appelle ensuite dans le main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main (int argc, char * argv[]){
     
    	printInfos(argc, &argv[argc]);
     
    	return EXIT_SUCCESS;
    }
    Le résultat change et j'obtient quelque chose du genre :

    Nombre d'arguments passés au programme : 6
    argv[0] : '(null)'
    argv[1] : 'TERM_PROGRAM=Apple_Terminal'
    argv[2] : 'TERM=xterm-256color'
    argv[3] : 'SHELL=/bin/bash'
    argv[4] : 'TMPDIR=/var/folders/kv/d1bhz4pd39d0lqxm8l22346w0000gn/T/'
    argv[5] : 'CONDA_SHLVL=1'

    Est-ce que quelqu'un saurait m'aiguiller ?

    (J'ai le même problème pour mes autres fonctions add et times qui sont censées ajouter et multiplier les arguments entre eux en fonction des options passées en commande,
    mais qui ne marchent pas car apparemment aucun argument ne vaut "add" ou "times" même si je les écrit dans ma ligne de commande...)

    Je ne sais pas si c'est très clair mais merci d'avance !

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 746
    Par défaut
    C'est normal tu crois que tu prends quoi avec &argv[argc] ?
    • argv[argc], tu prends l'élément juste après le dernier argument, parce que les tableaux sont 0 indexés
    • &XXX, tu prends l'adresse de cet élément.


    Comme le tableau argv se termine par la sentinelle NULL, alors tu commences à cette adresse et tu parses ... et cela fait 1 joli "Segmentation fault (core dumped)"
    Et pourquoi tu ne reprends pas le passage main, en char* [] ? (<- sans préciser la taille)

    Pour rappel, en C, le nom d'1 tableau c'est l'adresse du premier élément (équivalent à &tab[0])

    Regarde le résultat de ce code (les adresses sont en hexadécimales : donc 0x8 + 0x8 = 0x10)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <stdio.h>
    #include <stdlib.h>
     
     
    void printInfos(char* tab[]){
        if (tab != NULL) {
            size_t nb=0;
     
            while((*tab) != NULL) {
                printf(" argv[%lu] : \"%s\" (%p)\n", nb, (*tab), tab);
                ++nb;
                ++tab;
            }
        } else {
            printf(" argv NULL\n");
        }
    }
     
     
    int main(int argc, char* argv[]) {
        printInfos(argv);
     
        printf(" &argv[argc] : %p\n", &argv[argc]);
     
     
        return EXIT_SUCCESS;
    }

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 799
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mp2istudent Voir le message
    Bonjour,
    Salut

    Citation Envoyé par mp2istudent Voir le message
    je débute en C et je bloque sur un exercice où je suis censée utiliser argc et argv.
    Essayons d'expliquer... argv c'est un tableau de chaines et en C, un tableau peut être réduit à un pointeur. Donc c'est un pointeur sur "une" chaine (et de là on peut passer à la suivante et à la suivante et donc ça équivaut à un tableau de chaines) mais gardons le terme "pointeur sur une chaine" dans un coin de notre tête.
    Et c'est quoi "une chaine"? C'est un tableau de caractères. Et donc même remarque, un tableau peut être réduit à un pointeur. Donc "une" chaine c'est un "char étoile". Et un tableau de chaines c'est "étoile" sur un "char étoile" donc un "char étoile étoile".
    Donc argv est un char **argv.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void printInfos(int n, char **tab /* ou char *tab[] car on peut aussi rester en notation "tableau de char étoile" */){
    	int i;
    	printf("Nombre d'arguments passés au programme : %d\n", n);
    	for (i=0 ; i<n; i++){ //boucle parcourt la liste des arguments
    		printf(" argv[%d] : '%s'\n", i, tab[i]); //affiche les arguments et leur position un par un
    	}
    }
    Jusque là, tu avais tout bon.

    Ensuite la fonction attend le tableau argv, donc sous-entendu le "début" du tableau. Car c'est depuis le début qu'on peut accéder au suivant et au suivant pour ainsi traiter tout le tableau. Or toi tu lui passes &argv[argc] c'est à dire l'adresse d'une case située à "argc" distance de ce début. C'est là ton erreur.
    Si tu veux absolument rester en notation "adresse" tu peux alors passer &argv[0] (c'est valable) mais si tu as appris que tab[x] <=> *(tab+x) et que tu rajoutes l'opérateur "adresse de" à cette égalité cela donne &tab[x] <=> &*(tab+x). Les opérateurs "adresse de" et "pointé par" s'annulant l'un l'autre, cela donne alors &tab[x] <=> tab+x. Et ici "x" étant 0, cela donne au final &tab[0] <=> tab. Autrement dit, tu passes simplement "argv" à ta fonction => printInfos(argc, argv). Tout simplement.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 6
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Salut

    Or toi tu lui passes &argv[argc] c'est à dire l'adresse d'une case située à "argc" distance de ce début. C'est là ton erreur.
    Si tu veux absolument rester en notation "adresse" tu peux alors passer &argv[0] (c'est valable) mais si tu as appris que tab[x] <=> *(tab+x) et que tu rajoutes l'opérateur "adresse de" à cette égalité cela donne &tab[x] <=> &*(tab+x). Les opérateurs "adresse de" et "pointé par" s'annulant l'un l'autre, cela donne alors &tab[x] <=> tab+x. Et ici "x" étant 0, cela donne au final &tab[0] <=> tab. Autrement dit, tu passes simplement "argv" à ta fonction => printInfos(argc, argv). Tout simplement.
    Merci pour les explications, c'est tout de suite plus clair !

    J'avoue quand même ne pas trop comprendre la notation "tab+x", est-ce qu'elle représente le x-ième élément du tableau x ??

    (Merci à vous 2 pour vos réponses, grâce à vous j'ai pu finir mon DM à temps, peut-être que je vais survivre à ma prépa finalement )

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 6
    Par défaut fonction strcmp : résultat renvoyé ?
    Tant que j'y suis, si jamais vous aviez quelques indications à donner sur la fonction strcmp ça m'aiderait beaucoup

    Dans un autre exercice, je suis censée analyser les lignes de commande rentrées dans le terminal et exécuter une certaine fonction si l'option --verbose est présente.

    Pour ça, je parcourt la liste de mes arguments, et j'obtiens bien pour un certain i mais même quand l'option est présente je ne rentre jamais dans mon if :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (i=3; i<argc; i++){
    		if (strcmp(argv[i], "verbose") == 0){
    			affiche(argc, argv);
    			break;
    		}
    	}
    J'ai essayé de print le résultat renvoyé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcmp(argv[i], "verbose")
    Je m'attendais à trouver 0 mais je tombe sur 108, et 181 en rajoutant les 2 tirets (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcmp(argv[i], "--verbose")
    )

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 746
    Par défaut
    Vas lire des tutoriaux/ des cours, parce que les réponses sont des notions C qu'il faut maitrîser

    Citation Envoyé par mp2istudent Voir le message
    J'avoue quand même ne pas trop comprendre la notation "tab+x", est-ce qu'elle représente le x-ième élément du tableau x ??
    arithmétique des pointeurs et oui cela correpond au Xième élément

    Citation Envoyé par mp2istudent Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i=3; i<argc; i++){ //....
    espace contigu 1 tableau contient X éléments côte à côte qui est 0 indexé.
    Le premier élément est à l'index 0, le deuxième index 1, et ainsi de suite ...
    Et donc les adresses des éléments se suivent - d'où l'arithmétique des pointeurs.

    Parce que tu commences à 3 je n'ai pas de mots

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 6
    Par défaut
    J'ai essayé de lire quelques cours sur le sujet mais j'ai beau chercher je ne comprends pas mon erreur ... (ouspi)

    Tout ce que je trouve, c'est que strcmp est censé retourner 0 si les 2 chaines de caractères sont identiques...

    Et oui effectivement je commence à 3 car il est précisé dans notre exercice que l'option verbose ne peut pas se trouver avant la position 3, mais je ne vois pas en quoi c'est problématique pour la suite (j'ai testé mon code avec plusieurs lignes de commande ou l'option verbose se trouvait dans des positions supérieures uniquement)

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 799
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mp2istudent Voir le message
    J'avoue quand même ne pas trop comprendre la notation "tab+x", est-ce qu'elle représente le x-ième élément du tableau x ??
    Exactement. C'est comme ça que le C accède à cet élément: il part du début et il décale.
    il faut essayer de voir un tableau comme des cases qui se suivent. tab+x c'est la x-ième case (x+1 ième pour être précis car la première commence à 0). Et c'est tellement "officiel" que ça marche même si une "case" fait plusieurs octets. Un tableau de float par exemple a chaque case taillées pour un float donc de 4 octets. Ben faire "+1" sur un tab de float se traduira en réalité par "+4" en interne pour coller à la machine.
    D'où l'égalité tab[x] équivaut à *(tab + x). C'est cette égalité que tu utilises quand tu mets "i" à 0 et que tu affiches tab[i] en l'incrémentant.
    Et parfois pour optimiser on place un second pointeur sur le tableau et lui on le décale en parallèle. Ainsi avoir un second pointeur directement placé sur la bonne case donne un accès plus rapide à cette case qu'un indice car l'indice implique l'opération de décalage.
    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int tab[5]=[1, 2, 3, 4, 5];
    int *pt;
    for (i=0, pt=tab; i < 5; i++, pt++)
        printf("tab[%d]=%d\n", i, *pt);

    Citation Envoyé par mp2istudent Voir le message
    J'ai essayé de print le résultat renvoyé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcmp(argv[i], "verbose")
    Je m'attendais à trouver 0 mais je tombe sur 108, et 181 en rajoutant les 2 tirets (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcmp(argv[i], "--verbose")
    )
    Non, t'as bien pigé le truc. La fonction strcmp() a pour but de comparer deux chaines et de renvoyer les 3 résultats possibles (c1 < c2; c1 == c2 ou c1 > c2) en une unique valeur <0, 0 ou >0. Parfois même (ça dépend de certaines implémentations) elle renvoie la position du caractère qui diffère (exemple pour "abcd" et "abcf" elle renverra -4) mais ce n'est pas garanti par la norme (seule garantie c'est <0 ou >0). Bien entendu, si tu cherches "--verbose" il ne faut pas alors comparer avec "verbose" mais bien avec "--verbose" !!!

    Citation Envoyé par mp2istudent Voir le message
    Et oui effectivement je commence à 3 car il est précisé dans notre exercice que l'option verbose ne peut pas se trouver avant la position 3, mais je ne vois pas en quoi c'est problématique pour la suite (j'ai testé mon code avec plusieurs lignes de commande ou l'option verbose se trouvait dans des positions supérieures uniquement)
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
    #include <string.h>
     
    int main(int argc, char *argv[]) {
    	for (int i=1; i < argc; i++) {
    		if (strcmp(argv[i], "--verbose") == 0) printf("i=%d\n", i);
    	}
    }
    Nom : verbose.png
Affichages : 1133
Taille : 165,0 Ko
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 6
    Par défaut
    OK, je pense avoir compris merci !

    Citation Envoyé par Sve@r Voir le message
    Non, t'as bien pigé le truc. La fonction strcmp() a pour but de comparer deux chaines et de renvoyer les 3 résultats possibles (c1 < c2; c1 == c2 ou c1 > c2) en une unique valeur <0, 0 ou >0. Parfois même (ça dépend de certaines implémentations) elle renvoie la position du caractère qui diffère (exemple pour "abcd" et "abcf" elle renverra -4) mais ce n'est pas garanti par la norme (seule garantie c'est <0 ou >0). Bien entendu, si tu cherches "--verbose" il ne faut pas alors comparer avec "verbose" mais bien avec "--verbose" !!!


    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
    #include <string.h>
     
    int main(int argc, char *argv[]) {
    	for (int i=1; i < argc; i++) {
    		if (strcmp(argv[i], "--verbose") == 0) printf("i=%d\n", i);
    	}
    }
    Nom : verbose.png
Affichages : 1133
Taille : 165,0 Ko
    Oui c'est ce que j'avais commencé par faire, mais je me retrouve toujours avec strcmp(argv[i], "--verbose") = 108...
    (Je ne vois pas ce qui diffère dans mon code et qui pourrait poser problème...)

    Et effectivement je commence à i=3 car dans le cas de mon exercice il est précisé que l'option verbose est placée au minimum en 4ème position, mais même en testant une commande avec l'option en 5 ou 6ème position, je tombe sur le même message d'erreur et je sèche complètement...

    Je me suit dit que peut être il y avait un "décalage" entre les deux chaînes de caractères (des espaces ou autres...) mais après plusieurs essais je ne comprends pas pourquoi strcmp ne renvoie pas 0

    Mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int i;
    	for (i=3; i<argc; i++){
    		printf("cherche verbose position %d, argument = %s, donc strcmp renvoie %d\n", i, argv[i], strcmp(argv[i], "--verbose"));
    		if (strcmp(argv[i], "--verbose") == 0){
    			printf("execution verbose");
    			affiche(argc, argv);
    			break;
    		}
    	}
    Je rentre la ligne de commande : ./calc -f times 1 2 −−verbose 3

    Et j'obtiens comme résultat dans le terminal :

    Nom : Capture d’écran 2021-11-06 à 23.09.24.png
Affichages : 713
Taille : 563,7 Ko

  10. #10
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 746
    Par défaut
    Je ne sais pas si on te l'a dit ou si tu le sais, mais argv[0] est toujours le nom du programme la commande exacte utilisée pour appeler le programme.

    Après recherche "the value returned by the strcmp() function is the difference between the ASCII values of first unmatched character in leftStr and rightStr in both the cases."

    Donc lorsque tu compares :
    • '1' et '--verbose', (premier caractère) le retour est '1' (49) - '-' (45) soit 4 (positif)
    • '2' et '--verbose', (premier caractère) le retour est '2' (50) - '-' (45) soit 5 (positif)
    • '--verbose' et '--verbose', le retour est 0
    • '-f' et '--verbose', (deuxième caractère) le retour est 'f' (102) - '-' (45) soit 57 (positif)


    Tout cela pour dire, que ce soit les valeurs et la signification du retour qui est inversée (< 0, == 0, > 0), ta fonction strcmp te retourne n'importe quoi.
    Elle vient d'où ? c'est ton propre code qui masque celle standard ?
    Même les histoires d'encodage ne peut être le problème parce que ce sont que des caractères ASCII en type char (on ne travaille pas avec des wchar_t).


    Édit : wikipedie de strcmp te donne 1 implémentation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int strcmp (const char* s1, const char* s2) {
        while ((*s1 != '\0') && (*s1 == *s2)) { s1++; s2++; }
     
        return (*s1==*s2) ? 0 : (*(unsigned char *)s1 - *(unsigned char *)s2);
    }

  11. #11
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 6
    Par défaut
    Citation Envoyé par foetus Voir le message
    Je ne sais pas si on te l'a dit ou si tu le sais, mais argv[0] est toujours le nom du programme

    Après recherche "the value returned by the strcmp() function is the difference between the ASCII values of first unmatched character in leftStr and rightStr in both the cases."

    Donc lorsque tu compares :
    • '1' et '--verbose', (premier caractère) le retour est '1' (49) - '-' (45) soit 4 (positif)
    • '2' et '--verbose', (premier caractère) le retour est '2' (50) - '-' (45) soit 5 (positif)
    • '--verbose' et '--verbose', le retour est 0
    • '-f' et '--verbose', (deuxième caractère) le retour est 'f' (102) - '-' (45) soit 57 (positif)
    C'est bien ce que j'avais cru comprendre en lisant la documentation sur cette fonction...

    Citation Envoyé par foetus Voir le message
    Tout cela pour dire, que ce soit les valeurs et la signification du retour qui est inversée (< 0, == 0, > 0), ta fonction strcmp te retourne n'importe quoi.
    Elle vient d'où ? c'est ton propre code qui masque celle standard ?
    Même les histoires d'encodage ne peut être le problème parce que ce sont que des caractères ASCII en type char (on ne travaille pas avec des wchar_t).
    Justement c'est bien mon problème, je ne vois pas pourquoi elle me retourne ces valeurs

    J'ai beau chercher, je ne vois pas pour quelle raison elle ne fonctionnerait pas normalement et je ne trouve rien sur internet à ce sujet...

  12. #12
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 746
    Par défaut
    Citation Envoyé par mp2istudent Voir le message
    Je rentre la ligne de commande : ./calc -f times 1 2 −−verbose 3
    Je viens de me détruire des neurones mais ton problème est ultra simple

    Déjà, tu compares avec "verbose" et non "--verbose".
    'v' c'est le code 118, et cela correspond avec -69 ('1' (49) - 'v' (118)), -68 ('2' (50) - 'v' (118)) et -67 ('3' (51) - 'v' (118)).
    Donc voila soit tu mens soit tu as 1 décalage entre ton code et ton exécutable soit tu exécutes le mauvais exécutable soit ...
    Il faut appendre son outil de travail (je pense que tu utilises 1 IDE) ... des fois, il faut forcer la compilation en supprimant l'exécutable existant.

    Et au passage:
    1) tu as la fonctionnalité "go to definition"/ "jump to definition" : lorsque tu "surlignes 1 appel fonction", tu vas à sa définition. Dans ton cas, c'est pratique pour savoir quelle fonction strcmp tu appelles.
    Mais, cela peut ne pas fonctionner avec 1 fonction de la librairie standard - soit il faut avoir le code source et se mettre en debug soit tu peux te retrouver dans la bibliothèque dynamique .dll/ .so.
    2) ton debug est incomplet parce que tu ne dis pas avec quelle chaîne de caractères tu compares "verbose" ? "--verbose" ?
    Apprends à mettre des points d'arrêt au lieu de pourrir ton code de traces.

    Ensuite pour le 108, tu as fais 1 copié/ collé dégeu : regarde bien ta ligne de commandes, regarde le '-' de "-f" (c'est le tiret haut, code ASCII 45) et le '−' de "−−verbose".
    '−', c'est 1 autre caractère, code 226 (108 + 118). C'est le caractère U+2212 "signe moins". En UTF-8 c'est "E2 88 92" (<- 0xE2 c'est 226 en décimal, parce qu'on prend octet par octet)
    Donc c'est normal que "--verbose" soit différent de "−−verbose"

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 799
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par foetus Voir le message
    Je ne sais pas si on te l'a dit ou si tu le sais, mais argv[0] est toujours le nom du programme
    Pas exactement. C'est la commande exacte utilisée pour appeler le programme. Si j'appelle "./prog", argv[0] contient le "." et le "/". Idem si j'appelle le programme par son chemin complet ex "/usr/bin/prog"

    Citation Envoyé par mp2istudent Voir le message
    Justement c'est bien mon problème, je ne vois pas pourquoi elle me retourne ces valeurs
    Parce que "−−" ce n'est pas "--" (cf copier/coller mentionné par foetus). Tu as copié/collé le pdf de ton cours?
    Nom : verbose.png
Affichages : 684
Taille : 409,7 Ko
    Le "--verbose" du second test est un copier/coller de celui que tu as inscrit dans ton post.

    Citation Envoyé par foetus Voir le message
    '−', c'est 1 autre caractère, code 226 (108 + 118). C'est le caractère U+2212 "signe moins".
    Moi j'aurais plutôt dit le trait d'union insécable de Word...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. DevC++ et arguments de main argc, argv.
    Par mdabire dans le forum C
    Réponses: 3
    Dernier message: 13/01/2008, 15h07
  2. Printf et mauvais arguments
    Par Luc Hermitte dans le forum C
    Réponses: 4
    Dernier message: 10/01/2008, 12h04
  3. Réponses: 5
    Dernier message: 09/01/2008, 20h30
  4. Paramètres entrée (argc, argv) par défaut ?
    Par jomeo dans le forum Visual C++
    Réponses: 3
    Dernier message: 01/03/2007, 12h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo