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 :

Argument dans une fonction en langage C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2022
    Messages : 5
    Par défaut Argument dans une fonction en langage C
    Bonjour,
    J'ai une petit question concernant l'utilisation des arguments donnés dans le terminal de commande et pouvant être utilisé dans le code source.
    Voilà mon soucis:
    Je dois entrer dans le terminal ces informations (entre autres) 1.1,1.2,1.3,1.4. Le problème c'est que je ne sais pas comment les utiliser ensuite dans le programme. Je sais que si l'on me donne par exemple ./m 2.23 , pour utiliser le deuxième argument, je fais quelque chose du style x=strtol(argv[1],NULL,10).
    Mais si je veux accéder au deuxième élément de 1.1,1.2,1.3,1.4 qui est 1.2 je ne sais pas comment faire. J'ai bien compris que argv me renvoyait la chaine de caractère "1.1,1.2,1.3,1.4" mais comment en extraire une valeur particulière je vous prie.
    J'espère avoir été claire, m'excuse si je ne poste pas au bon endroit et enfin vous prie de m'indiquer si j'ai fais la moindre erreur dans mon texte.
    Merci bien

    PS: même question pour 2000x2000, merci!

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    Billets dans le blog
    1
    Par défaut
    Bonjour

    A la base, les arguments sont séparés par un espace. C'est ainsi que le shell (qui fait le lien entre l'instruction que tu tapes et le programme appelé si on part du principe que tu es sous Linux) sépare les choses.
    Dans ton code, les arguments sont reçus dans le main(). Son second paramètre "char* argv[]" est un tableau de strings, chaque string étant un des arguments passés lors de l'appel.
    Donc en tapant ./m 123 456 789 tu auras argv[1] qui contient "123", argv[2] qui contient "456" et argv[3] qui contient "789".
    Tu peux "forcer" une string avec espaces à être vue par le shell comme étant "un seul" argument, en lui mettant des guillemets lors de l'appel. Donc en tapant ./m "123 456" 789 tu auras argv[1] qui contient "123 456" et argv[2] qui contient "789".

    Maintenant, si tu veux convertir la string "123" (qui est, rappelons-le, une suite de caractères valant en hexa 0x41 0x42 0x43 et 0x00) en nombre entier 123, il faut traiter cette string pour convertir 0x41 en 1, multiplier par 10, lui rajouter 0x42 converti en 2 etc. C'est ce que fait la fonction strtol() (string to long).
    De même une string "12.3" pourra être convertie en flottant 12.3 via un algorithme équivalent, algorithme qui est déjà codé dans la fonction strtof() (string to float).

    Si maintenant ta string c'est "1.1,1.2,1.3,1.4" là il n'y a pas d'espace donc c'est tout "1.1,1.2,1.3,1.4" qui va dans argv[1]. Pour pouvoir en extraire les nombres 1.1 1.2 1.3 et 1.4, il faut découper cette string sur le séparateur "virgule", séparateur facilement repérable pour un humain mais que tu dois apprendre à ton programme. Donc un algorithme basé sur une boucle sur chaque caractère, évaluation, si virgule alors ... etc etc.
    Fort heureusement c'est un algorithme là aussi déjà codé dans la fonction strtok_r() qui permettra de boucler sur chaque string "1.1", "1.2", "1.3" et "1.4". Ensuite chaque string devra être convertie en float via strtof().
    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]

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    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 766
    Par défaut
    la fonction main a 2 arguments int argc et char* argv[] : int main(int argc, char *argv[ ]).
    • argc, pour argument count, c'est le nombre d'arguments en comptant le nom du programme
    • argv, pour argument values, c'est 1 tableau de caractères. Le premier étant le nom du programme


    Ensuite tout est manipulation de chaines de caractères : ce sont les entêtes string.h et stdlib.h (<- 2 liens cplusplus.com en anglais)

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2022
    Messages : 5
    Par défaut
    Merci beaucoup pour vos réponse. J'aurais effectivement bien aimé simplement pouvoir écrire ces arguments avec des espaces, mais malheureusement ce n'est pas ce que l'on me demande. Je vais essayer la fonction strtok_r() dont vous m'avez parlé et je vous dirai comment cela ce passe.
    Bonne soirée
    Rémy

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 256
    Par défaut
    J'aurais effectivement bien aimé simplement pouvoir écrire ces arguments avec des espaces, mais malheureusement ce n'est pas ce que l'on me demande
    C'est pas pour rien.C'est justement pour que tu travailles sur les chaines.
    Regardes aussi les fonctions strstr et str(p)brk
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

Discussions similaires

  1. Arguments dans une fonction SI
    Par Ysandor dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/08/2007, 17h04
  2. passage d'argument dans une fonction
    Par wadcyr8_197 dans le forum C++
    Réponses: 5
    Dernier message: 20/07/2007, 09h41
  3. Généricité des Input Arguments dans une fonction
    Par RaphTIM dans le forum MATLAB
    Réponses: 5
    Dernier message: 06/06/2007, 16h28
  4. Passer un tableau PHP en argument dans une fonction javascript ?
    Par The Molo dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/05/2007, 12h31
  5. Erreur d'argument dans une fonction
    Par rouliane dans le forum MATLAB
    Réponses: 6
    Dernier message: 12/12/2006, 11h52

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