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 :

Choix structure code


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    curieux
    Inscrit en
    Janvier 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : curieux
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2012
    Messages : 6
    Par défaut Choix structure code
    débutant, codeblock, wingcc

    Bonjour,

    je dois créer une procédure pour charger un fichier texte (cette procédure sera appelée plusieurs fois: cela chargera à chaque fois un nouveau fichier texte) dans un tableau créé dynamiquement, je pense qu'il faut utiliser une classe (fichiers .h, .cpp), mais je ne vois absolument pas comment l'écrire,
    j'ai déjà écrit une procédure qui fonctionne dans un main, mais je souhaiterais avoir une procédure extérieure qui pourra etre appelée plusieurs fois...

    le code du main :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    #include <sstream>
    #include <string>
    #include <iostream>
    #include <fstream>
    #include <vector>
     
     
    int main()
     
    {
     
    std::vector<std::string>calendrier;
    std::string ligne;
    std::string enreg;
     
    std::ifstream fichier( "Fichiers/AL2.txt" );
     
    //découpage de chaque ligne du fichier en mot selon délimiteur ";"
    while ( std::getline( fichier, ligne ) )
    	{
            std::istringstream enreg( ligne );
            std::string mot;
     
            while ( std::getline( enreg, mot, ';' ) )
                {
    //copie dans un tableau
                    calendrier.push_back(mot);
                }
     
        }
        int nelem=calendrier.size()/6;
     
         // Affichage
      for (int i=0; i < nelem; i++)
        {
     
        for (int j=0; j < 6; j++)
          std::cout << calendrier[i * 6 + j] << " ";
        std::cout << std::endl;
      }
     
    std::cout << "CAPACITE"<< calendrier.capacity()<< "NOMBRE ELEMENTS"<< calendrier.size()<< '\n';
     
    return 0;
     
    }
    Pour résumer, j'aimerais la meme chose avec un .h et un .cpp...

    Désolé pour la mise en page, c'est la première fois que j'utilise le forum,
    Merci par avance, cordialement Secruos

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    bah, tu fais une fonction?

    Que doit-elle recevoir comme paramètres? Au moins le flux d'entrée (comme ca, ca n'est pas forcément un fichier)
    Que doit-elle donner comme résultat?

    Tu as deux formes générales possibles:
    • Soit le tableau (un vector, comme tu l'a correctement choisi) est donné en paramètre par référence (ce qui permet d'ajouter au bout)
    • Soit le vector est créé par la fonction.


    La première forme donne quelque chose comme void lire_calendriers(std::istream& stream, std::vector<date_type> & calendrier), la secondestd::vector<date_type> lire_calendriers(std::istream& stream).
    Je t'invite très fortement à définie date_type comme un alias de type sur string. ta fonction ne retourne pas des string (forme), mais des dates (fond).

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Quant à ton envie de classe.

    Si tu veux faire une classe, ce n'est pas le traitement qu'elle doit représenter.
    Une classe correspond à une chose, une information, une donnée.
    Dans ton code, les candidats pour faire des classes sont "date" et "calendrier".

    D'une manière générale, un nom commun correspond un type, un nom propre à une variable, un verbe à une fonction, et une phrase à une instruction (idéalement, parfois quelques unes).
    Prenons la phrase "extraire du fichier "A.txt" des dates et les ranger sous le nom calendrier".

    On y voit des noms commun (fichier, date) deux verbes (extraire, ranger), un nom propre (calendrier). Ainsi que des précisions et omission, comme "A.txt", et la nature de ce qu'est calendrier.
    Comment traduire cela? mot a mot:
    • fichier = fstream (et dérivés comme ifstream)
    • date = std::string (dans ton code)
    • extraire = une fonction extraire_dates
    • ranger = l'opérateur d'affectation ou le constructeur

    En code, ca donne donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::ifstream fichier("A.txt");
    auto calendrier = extraire_dates(fichier);
    Note comme calendrier est de type auto car même en français, je ne l'avais pas précisé. Le type est "celui que retourne la fonction".

  4. #4
    Membre du Club
    Homme Profil pro
    curieux
    Inscrit en
    Janvier 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : curieux
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2012
    Messages : 6
    Par défaut Re: choix structure code
    Merci pour votre aide , je vais donc revoir cela à l'aide de vos réponses, mais je pense vous solliciter à nouveau, ma maitrise des concepts de base du C++ n'est pas ce qu'elle devrait etre, et comme j'apprends mieux en tatonnant et en regardant j'avoue avoir un peu du mal avec la doc

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Tatonner n'est pas valable.
    Tu t'imagines traverser une grande ville en voiture sans avoir appris à conduire, sans le permis, juste en tatonnant?

    Cela dit, n'hésites surtout pas à poser des questions
    La documentation n'est pas un livre de chevet, c'est quelque chose dont il faut apprendre la structure, pour savoir si une réponse y est (et où), cela permet d'y revenir chaque fois qu'on en a besoin.
    Et ca permet aussi de savoir ce que le langage permet ou fournit

  6. #6
    Membre du Club
    Homme Profil pro
    curieux
    Inscrit en
    Janvier 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : curieux
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2012
    Messages : 6
    Par défaut Fonction externe à main
    Bonjour ternel,

    je me suis rendu compte de l'inutilité de classe dans mon code, j'avais donc songé à une fonction (comme tu me l'as suggéré), par contre je souhaitais créer une fonction créant le vector mais externe au fichier main.cpp (d'ou la classe) et je n'ai pas trouvé si cela était possible, ni comment faire : le .h ayant besoin du "classe.cpp" pour fonctionner?

    De plus, avec "auto" j'obtiens le message :
    G:\CB-LireLigne\Caractere\main.cpp|40|warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]|

    Merci de bien vouloir m'éclairer, nous débutants n'avançons concretement grace à l'aide apportée par des développeurs plus avertis, merci aussi pour tes réponses précédentes, concises et claires, elles m'ont permis de mieux appréhender certains concepts

    Cordialement, secruos

  7. #7
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par secruos Voir le message
    De plus, avec "auto" j'obtiens le message :
    G:\CB-LireLigne\Caractere\main.cpp|40|warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]|
    Tu compiles pas en C++11. Il serait temps de mettre à jour ton compilo.

    Citation Envoyé par secruos Voir le message
    je souhaitais créer une fonction créant le vector mais externe au fichier main.cpp (d'ou la classe) et je n'ai pas trouvé si cela était possible, ni comment faire : le .h ayant besoin du "classe.cpp" pour fonctionner?
    Une classe ou une fonction c'est similaire. Tu mets les prototypes dans le header et l'implémentation dans n'importe quel fichier compilé (.cpp).
    https://cpp.developpez.com/faq/cpp/?...un-fichier-cpp
    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.

  8. #8
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Il n'y a pas grand chose à ajouter à ce que dit Bousk, à part un peu d'explications plus fondamentales.

    Le C++ (et le C) repose sur le concept de compilation séparée. Chaque fichier source est compilé séparément, puis les morceaux sont réunis.

    Dans ton projet, tu aurais trois fichiers: main.cpp, fonction.cpp, et un fonction.h.
    chacun des .cpp aurait la commande #include "fonction.h".

    Chaque #include est remplacé à la compilation par le contenu du fichier désigné.
    Les fichiers intermédiaires produits par la compilation sont main.o et fonction.o (avec gcc, pour les autres compilateurs, les noms peuvent varier un peu).
    main.o et fonction.o contiennent tous deux la déclaration de la fonction (en fait, ce qu'on appelle le symbole).
    Seul fonction.o contient la définition.

    C'est lors de la partie "réunion des morceaux", nommée "édition des liens", que le compilateur rassemble kes deux fichiers .o en un unique exécutable, et dit "le symbole fonction de main.o est celui défini dans fonction.o".

    L'option -c de gcc permet d'arreter la compilation à la phase "compilation de chaque fichier", c'est à dire avant l'édition des liens.
    par exemple, gcc -c -Wall *.cpp permet de compiler chaque .cpp indépendamment.
    L'édition des liens se fait alors avec gcc *.o -o executable (-o permet de nommer le fichier produit)

Discussions similaires

  1. [CSS 3] Choix structure pour diaporama
    Par DJ Caësar 9114 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 03/06/2013, 16h54
  2. [Joomla!] Choix du code approprié
    Par quomeiha dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 15/02/2011, 17h48
  3. Choix structure tables
    Par G3off dans le forum Langage SQL
    Réponses: 6
    Dernier message: 03/02/2010, 15h12
  4. Structure code source Netbeans
    Par Agrapheuse dans le forum NetBeans
    Réponses: 4
    Dernier message: 21/10/2008, 15h54
  5. Conseil choix structure STL
    Par SteelBox dans le forum SL & STL
    Réponses: 3
    Dernier message: 15/03/2005, 02h13

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