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 :

Manipuler les parametres d'une fonction main


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 16
    Par défaut Manipuler les parametres d'une fonction main
    Bonjour,

    Pour la necessite du boulot, et je ne suis pas programmeur, je suis en plein apprentissage du C de base.
    Et la donc j'ai un probleme de base tellement basique que personne n'en parle en termes comprehensibles pour moi.

    Voila mon code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Int main(int argc, char * const argv[]) 
    {
       char const dataFileName = (argv[2]);
    Le compilateur me dit : warning: initialization makes integer from pointer without a cast
    Alors mon point de vue a moi c que je ne lui demande pas de me faire un entier. Deuxiement, quand plus loin dans le programme j'ecris n'importe quoi utilisant "dataFileName" j'ai une "Segmentation fault error" qui commence a me rendre marteau.
    Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (strstr(dataFileName, ".") != NULL)
    ....donne le segmentation fault en question.

    Alors en theorie argv[2] pointe un truc genre "/home/toto/data.dat"
    J'ai essaye, entre autre, la version
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Int main(int argc, char * const argv[]) 
    {
       char const dataFileName []= (argv[2]);
    Mais la ca passe pas a la comil. Poutant a ce que j'en comprend, la chaine pointee par argv[2] est bien un tableau de caracteres ?

    Pourriez-vous SVP me corriger tout ca en m'expliquant pourquoi c'est si chiant de faire un truc probablement aussi banal en C ?

    Merci beaucoup.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Pour que ça fonctionne il faut mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const char* const dataFileName = argv[2];
    (les const sont optionnels dans un premier temps si ça te trouble)

    Le type de argv est "tableau de pointeurs sur caractère", donc ses éléments sont de type "pointeur sur caractère" et donc char*.

    En fait :
    char est de type "caractère"
    char* est de type "pointeur sur caractère"
    char*[] est de type "tableau de pointeurs sur caractère"

    Accessoirement c'est "si chiant" parce que les chaînes de caractères en C sont manipulées en utilisant le pointeur sur le premier caractère de la chaîne, ce qui prête compètement à confusion

    MAT.

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonjour,

    - pas de majuscule au int avant le main.
    - j'utilise plutot : int main(int argc, char **argv) ....

    Ca fonctionne très bien.
    Fait attention que l'élément 0 de argv est le nom de ton programme !!!
    Sinon, demande d'afficher tout ton argv afin de voir ce qu'il y a exactement dedans, ça t'aidera surement à comprendre d'où vient le segmentation fault.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    hello,

    une petite explication succinte, mais avec une illustration fort pratique pour comprendre les arguments de la fonction main:
    http://www.ai.univ-paris8.fr/~jalb/langimp/main.html

    sinon, écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main(int argc, char **argv)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main(int argc, char *argv[])
    c'est exactement la même chose

    bonne continuation!

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Katden
    Pour la ne cessite du boulot, et je ne suis pas programmeur, je suis en plein apprentissage du C de base.
    Et la donc j'ai un probleme de base tellement basique que personne n'en parle en termes comprehensibles pour moi.
    L'utilisation des paramètres de main() nécessite la connaissance d'un certain nombre de principes fondamentaux du C, à savoir :

    tableau, index, pointeur, chaine de caractère, paramètre. C'est un prérequis indispensable.

    Ensuite, il faut savoir à quoi correspondent les deux paramètres de main(), et ça, c'est expliqué dans ton livre de C.

    Ensuite, l'utilisation devient limpide :

    La ligne de commande étant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./monappli param1 /home/toto/data.dat
    Pour récupérer le 2ème paramètre, on écrit :
    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
    28
    29
    30
     
     
    #include <stdio.h>
     
    int main (int argc, char **argv)
    {
       /* existe-t-il un 2eme parametre ? */
       if (argc > 2)
       {
          /* pointer sur la chaine contenant ce parametre */
          char const *dataFileName = argv[2];
     
          /* l'afficher (pour verification) */
          printf ("dataFileName  = '%s'\n", dataFileName);
       }
       else
       {
    /*  en cas d'erreur lors de l'invocation de l'application */
          int i;
          printf ("erreur de parametres\n");
     
          /* afficher la liste */
          for (i = 0; i < argc; i++)
          {
             printf ("[%d] %s\n", i, argv[i]);
          }
       }
     
       return 0;
    }
    Avec
    ca donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    erreur de parametres
    [0] C:\dev\forums\forums.exe
    [1] des.txt
     
    Press ENTER to continue.
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    forums src.txt des.txt
    ca donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dataFileName  = 'des.txt'
     
    Press ENTER to continue.

  6. #6
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Et au passage, on a un segmentation fault quand on accède à un champ d'un pointeur qui est a null (= 0).

    donc dans le cas d'une chaine de char str, si tu n'es pas sur de ton coup, avant de faire str[0] vérifie que str != NULL.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Faiche
    Et au passage, on a un segmentation fault quand on accède à un champ d'un pointeur qui est a null (= 0).
    On a un comportement indéfini. C'est tout ce qu'on peut affirmer.

    Quand à "accède à un champ d'un pointeur", c'est du charabia. Un pointeur n'est pas une structure. On dit plutôt "accède à la variable pointée" ou "déréférence le pointeur"...
    donc dans le cas d'une chaine de char str, si tu n'es pas sur de ton
    coup, avant de faire str[0] vérifie que str != NULL.
    Certes, mais je ne vois pas trop le rapport avec le problème en cours qui concerne les paramètres de main()...

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/01/2010, 14h01
  2. Réponses: 4
    Dernier message: 14/03/2009, 19h56
  3. Afficher les parametres d'une fonction
    Par cortex59 dans le forum C++
    Réponses: 15
    Dernier message: 12/01/2009, 15h18
  4. Réponses: 2
    Dernier message: 26/04/2008, 10h13
  5. [POO] passage nom objet dsn les parametres d'une fonction
    Par melou dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 21/10/2005, 17h26

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