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

Langage C++ Discussion :

Utiliser les paramètres de la fonction main


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2019
    Messages : 34
    Points : 15
    Points
    15
    Par défaut Utiliser les paramètres de la fonction main
    Bonjour,

    Je fais face à un petit problème : j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main(int argc, char *argv[])
    et j'aimerais faire un traitement sur tous les paramètres (de nombre inconnu) passés à la fonction main.
    Pour cela je créé un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double tableauDeDouble[argc-1];  //erreur argc ne peut pas être défini comme une constante
    et ensuite à l'aide d'une boucle for simple je parcours argv et je calcule les doubles correspondant que je place dans tableauDeDouble.

    Du coup, j'aimerais savoir comment utiliser argc pour créer mon tableau (ou s'il existe une autre solution).

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Chapitre 0 : les tableaux ce sont des std::vector.

    https://cpp.developpez.com/faq/cpp/?...vec-std-vector
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2019
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    Ça a effectivement l'air de marcher avec les vectors...

    Je me demandais quand même s'il existe un moyen de faire sans cette bibliothèque ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Cette bibliothèque s'appelle le standard.
    Après vu les infos inexistantes initiales, oui il y a sûrement plein de façons de faire imaginables, à commencer par ne pas stocker les données ailleurs que dans argv qui les contient déjà.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2019
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    Oui j'ai en effet trouvé une autre solution sur un autre forum qui consiste à utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     double* mesDoubles = new double[argc - 1];
    Par contre je suis assez sceptique à l'idée d'utiliser un char** pour stocker des doubles...

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Cette façon de faire est de loin la pire.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2019
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    Un petit truc que j'avais pas précisé (mais je pensais que ma question le laissait deviner facilement), c'est que je suis débutant dans ce langage.

    Du coup, avant de me lancer dans des objets<type> etc... j'aimerais bien commencer par le début. C'est pour cela que j'ai demandé s'il existait un moyen sans avoir à importer quoi que ce soit (puisqu'apparemment il ne s'agit pas de bibliothèque mais probablement de classes je dirai bien que je sois toujours pas très sûr)...

    Tu dis qu'il existe plein de façon de faire sans, mais tu ne me dis pas comment faire (ou ne m'indique pas une seule piste). De plus, lorsque je te présente une solution (peut-être mauvaise j'en sais rien mais au moins ça marche) tu me dis de chercher un autre moyen. Moi je suis pas contre trouver une autre solution, mais j'aimerais comprendre pourquoi il s'agit de la pire solution et j'aimerais obtenir au moins un indice sur la meilleur méthode (et pourquoi c'est la meilleur) à employer, parce que sinon je risque de mettre du temps avant de trouver cette solution.

  8. #8
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    La meilleure méthode est std::vector. Ce que doit utiliser un débutant est std::vector. Ce que va utiliser une personne expérimentée est std::vector. std::vector est dans le standard de C++, il n'y a aucune raison d'aller chercher autre chose, surtout pour un débutant. Si un cours ne présente pas std::vector dans les premiers chapitres, il faut s'en débarrasser immédiatement, c'est un très mauvais cours.

    Du coup, avant de me lancer dans des objets<type> etc... j'aimerais bien commencer par le début.
    std::cout est un objet, et pourtant c'est la première chose qu'on manipule. std::string aussi.

    Par contre, new n'est clairement pas à la portée d'un débutant, cela implique d'avoir une correspondance avec delete, de faire la différence entre new/new[] et delete/delete[] et de comprendre les exceptions et le RAII. Personne n'utilise new directement, on dispose de mécanismes bien meilleurs pour ça, std::vector en fait partie.

    Tu dis qu'il existe plein de façon de faire sans, mais tu ne me dis pas comment faire
    Tu ne donnes pas non plus la problématique, mais une solution à une problèmatique. Avoir besoin d'un tableau de double est une des solutions possibles, cela n'est peut-être pas nécessaire.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    std::vector est dans le standard. L'utiliser est aussi évident que std::cout, std::string, int ou double.
    J'ai donné un lien vers une FAQ qui montre comment utiliser std::vector.
    Tu peux aussi utiliser ton ordinateur pour chercher sur un moteur de recherche et trouver la doc qui présente toute son interface et des millions d'exemples d'utilisation si ça suffit pas.
    Nous ne sommes pas ici pour faire le travail d'un autre, débutant ou pas. Être débutant n'est pas une excuse pour ne pas faire de recherches, ne pas lire les réponses apportées ou les liens fournis.
    Tu veux stocker des trucs ? Utilise std::vector comme indiqué dans la toute première réponse.
    Tu préfères utiliser un tableau dynamique trouvé sur un autre forum ou que sais-je ? Fais-toi plaisir, mais ta source est médiocre et cette solution est mauvaise.
    Combien de fois doit-on écrire d'utiliser std::vector pour que ça soit compris ? Combien de liens doit-on montrer pour qu'ils soient ouverts et lus ?
    Quant à savoir que faire de ces données et comment les traiter, faudrait déjà que tu dises ce que tu comptes en faire vraiment..
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    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 631
    Points : 10 558
    Points
    10 558
    Par défaut
    Citation Envoyé par thomas18F Voir le message
    j'aimerais comprendre pourquoi il s'agit de la pire solution et j'aimerais obtenir au moins un indice sur la meilleur méthode (et pourquoi c'est la meilleur) à employer, parce que sinon je risque de mettre du temps avant de trouver cette solution.
    Tu sais que le C++ est une surcouche du C, et donc les solutions en C fonctionnent en C++, mais les solutions en C++ ne fonctionnent pas en C.

    et l'autre truc, c'est que c'est débile ce que tu demandes si tu ne veux pas utiliser la bibliothèque standard STL, bien saches que les fonctions comme malloc, printf, fopen proviennent de la bibliothèque standard C - en pur C et pur C++ tu ne fais rien

    Solution 1 en C : le tableau fixe - ce que tu as essayé double array[15];. Le truc à savoir c'est que la taille de ce tableau doit être connue à la compilation.
    1 contournement possible , c'est de fixer une taille "la plus large possible pour contenir les données". Pour ton cas, par exemple, double array[100];.

    Avec la norme C99 , tu as la possibilité des VLA (variable-length array), mais déprécié depuis la norme C11.

    Solution 1-bis depuis le C++11, donnée par @jo_link_noir : le tableau fixe, std::array.

    Solution 2 en C et C++ : faire une allocation dynamique. Tu prends 1 pointeur double* array;. Et 1 fois que tu connais la taille, tu alloues le tableau (en C) array = malloc(size * sizeof(double); (en C++) array = new double[size] (<- attention ce n'est pas l'opérateur new mais new[])
    Et qui dit allocation dynamique, dit désallocation avec (en C) free(array); (en C++) delete[] array; ... et donc la difficulté est de savoir quand la faire et de ne pas la faire trop tôt (comme lorsque une exception est lancée par exemple).

    La différence , c'est qu'en C, tu peux changer la taille de ton tableau avec la fonction realloc.

    Solution 3 en C++ : std::vector, tableau dynamique qui gère les questions d'allocations et de désallocations. Tu peux réserver une taille au début si tu le veux, et ensuite tu ajoutes ou supprimes tes donnés sans te prendre la tête.
    1 différence avec les tableaux fixes (solution 1 et solution 2) pour parcourir un vector tu peux le faire classiquement avec 1 boucle, mais également avec des itérateurs ... et depuis la norme C++11 avec un "range-based for loop"

    Édit : Mon V.D.D. (mon voisin du dessous) @jo_link_noir me dit que les itérateurs existent en C. Oui mais il faut coder la classe. En C++ avec les classes STL, tu les as par défaut.

    Solutions autres 1 en C et C++ : Tu as aussi des solutions avec des structures de données non contiguës en mémoire. Tu peux coder 1 liste chaînée (soit 1 maillon contient 1 valeur mais question mémoire ce n'est pas terrible soit 1 maillon contient X valeurs, X fixe). Donc, c'est le même principe que la solution 2 avec l'allocation dynamique.

    Solutions autres 2 en C++ : Tu as aussi des solutions avec des structures de données non contiguës en mémoire. std::deque, std::list, ...


    Voila, et on attend tous ton prochain sujet lorsque que tu comprendras que les données de argv sont de type chaînes de caractères "3586.14145" (parce que les arguments sont passés en ligne de commande) et non pas flottant 3586.14145.
    Et en plus, tu vas découvrir les joies des conversions flottantes avec leur précision souvent pourrie

  11. #11
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Je ne vois pas l’intérêt de parler du C et encore moins de présenter des solutions basées dessus.

    Et sinon, pour les tableaux à taille fixe -> std::array

    1 différence avec les tableaux fixes (solution 1 et solution 2) pour parcourir un vector tu peux le faire classiquement avec 1 boucle, mais également avec des itérateurs ... et depuis la norme C++11 avec un "range-based for loop"
    Les boucles et itérateurs sont aussi possibles avec les tableaux C.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2019
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    Merci pour ta grande aide foetus

    Et pas d'inquiétude au sujet du type d'argv, j'ai bien compris que c'était des char*.


    Sinon Bousk quand je disais : "Ça a effectivement l'air de marcher avec les vectors...", c'était pour exprimer que j'avais réussit à utiliser les vectors grâce à la doc que tu m'as donné. Du coup, je suis pas certain de comprendre ce que tu entends par :"Être débutant n'est pas une excuse pour ne pas faire de recherches, ne pas lire les réponses apportées ou les liens fournis."

    Et puisque tu sembles insister sur le but de mon programme, le but est de passer des chemins de fichier en paramètre au main pour en faire une analyse syntaxique et lexicale, puis de stocker le résultat sous forme de double dans un tableau de double.

  13. #13
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Pourquoi mettre le résultat dans un tableau, pour en faire quoi ?

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2019
    Messages : 34
    Points : 15
    Points
    15
    Par défaut
    Le but est d'attribuer un "rôle" à chaque fichier... Pour la suite j'ai peur que ce soit un peu hors-sujet vu que ce n'est même plus du c++.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/08/2007, 19h43
  2. [Mail] les paramètres de la fonction mail()
    Par metrax dans le forum Langage
    Réponses: 1
    Dernier message: 31/03/2007, 02h08
  3. Réponses: 6
    Dernier message: 12/10/2006, 18h30
  4. Réponses: 11
    Dernier message: 06/09/2006, 12h48
  5. [PHP 4.4.2] Récupérer les paramètres d'une fonction
    Par stailer dans le forum Langage
    Réponses: 5
    Dernier message: 07/04/2006, 21h41

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