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 :

Soucis avec argc et argv dans fichier Header


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 56
    Points
    56
    Par défaut Soucis avec argc et argv dans fichier Header
    Salut la communauté !

    Ça à l'air vraiment con comme erreur mais j'ai beau chercher et rechercher je ne trouve pas d'où cela peut il venir -_-
    j'ai créé une fonction main(int argc,char *argv[]) qui peut donc recevoir à l'aide du shell des arguments, voila mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    l3.#include "magic.h"
    l4.
    l5.int main(int argc,char *argv[])
    l6.{
    l7. arg(argc,argv[]); //argc=nombre d'argument+1 et argv[]=tableau contenant les arguments
    .
    .
    .
    }
    et dans le fichier header se trouve:

    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
    l8.void arg(int,char *);//fonction test des arguments
    .
    .
    .
    l64.void arg(argc,argv[])
    l65.{
    l66.printf("argc=%d",argc);
    l67.if (argc!=1&&(strcmp(argv[1],help))&&argc!=8){
    printf("Erreur dans les arguments\n");
    void help();
    exit (1);
    }
    if(!(strcmp(argv[1], help))){
    void help();
    exit(0);
    }
    }
    En somme je test via le shell les arguments de magic.
    Lorsque je compile (à l'aide de gcc) j'obtien l'erreur toute bête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    kegilko@kegilko:~/Bureau$ gcc magic.c -o magic
    In file included from magic.c:3:
    magic.h:64: erreur: expected ‘)’ before ‘[’ token
    magic.c: In function ‘main’:
    magic.c:7: erreur: expected expression before ‘]’ token
    Voila , une histoire de crochet et de parenthèse qui me bloque et j'ai beau me tourner les boyeaux d'la tête dans tout les sens je n'vois pas d'ou sa pourrai venir...

    Merci pour votre aide ^^

  2. #2
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut
    Citation Envoyé par kegilko Voir le message
    int main(int argc,char *argv[])

    et dans le fichier header se trouve:

    void arg(int,char *);
    Tu as un problème de typage dans arg(...).

    char *argv[] est de type char** (car un tableau de char est de type char*) or ta fonction arg attend un char* et non pas un char**

    Donc ta fonction arg devrait pluto ressembler à ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void arg(int, char**);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    voi arg(int, char*[]);
    Après à toi d'adapter l'implémentation de arg

    Naoss
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 56
    Points
    56
    Par défaut
    hmmm bonne remarque oui !
    par contre j'ai toujours la même erreur ^^

    dans le main j'ai mis:
    dans le header:
    le prototype => int arg(int,char **);
    la fonction => int arg(argc,argv[]);

    Et j'ai toujours la même erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    kegilko@kegilko:~/Bureau$ gcc magic.c -o magic 
    In file included from magic.c:3:
    magic.h:64: erreur: expected ‘)’ before ‘[’ token
    magic.c: In function ‘main’:
    magic.c:13: erreur: expected expression before ‘]’ token
    kegilko@kegilko:~/Bureau$
    ligne 64 (dans le header)
    =>int arg(argc,argv[]);

    ligne 7 (dans le main)
    =>arg(argc,argv[])

    On va bien finir par trouver ? -_-

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kegilko Voir le message
    hmmm bonne remarque oui !
    par contre j'ai toujours la même erreur ^^

    dans le main j'ai mis:
    Pourquoi ces crochets ?

    http://emmanuel-delahaye.developpez.....htm#param_tab
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 56
    Points
    56
    Par défaut
    Merci pour avoir affiché mes codes en plus jolis (et désolé) ^^

    pourquoi un [] ? euh parce argv et un tableau.... donc naïvement je lai mis en argument......euh boulette?

    J'vais testé sans [] ^^ je les enleve dans (qui se trouve dans le main)
    et (qui se trouve dans le Header)
    .
    .
    .
    sans [] j'ai droit à cette liste d'erreur:
    In file included from magic.c:3:
    magic.h: In function ‘arg’:
    magic.h:65: erreur: argument ‘argv’ doesn’t match prototype
    magic.h:8: erreur: déclaration de prototype
    magic.h:66: erreur: la valeur indicée n'est ni un tableau ni un pointeur
    magic.h:71: erreur: la valeur indicée n'est ni un tableau ni un pointeur
    Donc j'me dit "chouette! plus que des erreurs dans le Header !"
    Je rajoute dans la fonction (qui se trouve dans le Header) un [] (j'les aime bien ^^) dans les arguments comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int arg( argc , argv[] )
    	{
    		if (argc!=1&&(strcmp(argv[1],help))&&argc!=8){
    			printf("Erreur dans les arguments\n");
    			void help();
    			exit (1);
    		}
    		if(!(strcmp(argv[1], help))){
    			void help();
    			exit(0);
    		}
    	}
    Et ma liste d'erreur est la suivante:
    In file included from magic.c:3:
    magic.h:64: erreur: expected ‘)’ before ‘[’ token
    la ligne 64 qui est (dans le Header):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int arg( argc , argv [])
    Plus qu'une erreur mais...je vois toujours pas xD

    Encore merci pour votre aide ^^ je sens qu'à la fin de l'après midi si je ne trouve pas la soluce je remigre ma fonction entièrement dans le main (tant pis pour l'organisation)

  6. #6
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut
    Voici ton code à peu près corriger et ordoné : n'oublie pas l'indentation si tu veux que les gens lisent ton code.

    De plus j'ai rajouter des paranthèses dans les if car je ne me rappelle plus de la priorité des opérateurs :s

    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
     
    void arg(int, char**); //fonction test des arguments
    .
    .
    .
    void arg(int argc, char** argv)
    {
    	printf("argc = %d\n", argc);
     
    	if((argc !=1) && (strcmp(argv[1], help)) && (argc != 8))
    	{
    		printf("Erreur dans les arguments\n");
    		help();
    		exit (1);
    	}
     
    	if(!(strcmp(argv[1], help)))
    	{
    		help();
    		exit(0);
    	}
    }
    Déjà pas besoin de "void help()" mais simplement "help()" c'est un simple appel à une fonction à moins que tu souhaites faire un cast sur la valeur de retour de help() dans ce cas :

    (A voir si c'est correct)

    Ensuite tu écris ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strcmp(argv[1], help)
    Qu'est-ce que help, une variable je pense, sinon y'a t'il un rapport avec la fonction help() ?
    Si c'est une fonction, quel est sont type de retour car c'est ce que va exploiter strcmp ?
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  7. #7
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void arg(argc, argv**)
    {
    est incorrect. Il faut spécifier le type des paramètres. D'après le prototype, on devrait avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void arg(int argc, char ** argv)
    {
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  8. #8
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut
    Arff désolé pour la grosse erreur
    C'est ça quand on ne se relie pas^
    C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kegilko Voir le message
    pourquoi un [] ? euh parce argv et un tableau.... donc naïvement je lai mis en argument......euh boulette?

    J'vais testé sans [] ^^ je les enleve dans (qui se trouve dans le main)
    et (qui se trouve dans le Header)
    Huh ! La programmation, c'est pas du hasard...

    Tu veux transmettre les arguments de la ligne de commande à une fonction.

    C'est pas bien compliqué :

    1 - La fonction est main() est définie comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int main (int argc, char **argv)
    {
    2 - tu passes les paramètres à la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main (int argc, char **argv)
    {
       f (argc, argv);
       ...
    rien d'exotique, pas de crochets...

    3 - tu définis une fonction capable de recevoir ces 2 paramètres. Il suffit qu'ils aient le même type que pour main()... Rien de magique, de mystérieux ou de compliqué...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void f (int argc, char **argv)
    {
       ...
    et son prototype séparé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void f (int argc, char **argv);
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/03/2008, 17h09
  2. argc et **argv et fichier sous windows
    Par Linu6 dans le forum Débuter
    Réponses: 12
    Dernier message: 25/12/2007, 23h51
  3. Pb Creation PDF avec PDFCreator apres impression dans fichier PRN
    Par asimut dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 11/09/2007, 17h46
  4. Donner des valeurs à Argc et Argv dans le code
    Par olivier857 dans le forum C
    Réponses: 44
    Dernier message: 20/06/2006, 13h57

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