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 :

Génération de code


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de meufeu
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 355
    Par défaut Génération de code
    Bonjour,

    Je suis en train d'écrire un code et je m'appercois qu'il y a des parties assez redondantes qui font cela, schématiquement

    float var## = initialiser("input/##/var##");
    file file_## = fopen("/tmp/tmpfile##");
    fscanf( file_##,"%f",&var##);
    fclose(file_##);

    j'ai en gros ca pour toutes les variables, seul le "##" change.
    et j'ai quelques 3000 variables comme ca (dotn la liste est dans un fichier)

    J'essaie donc de générer du code. Je le fais en script shell pour l'instant mais je vois que le C++ permet de faire des "macros"
    Je n'ai pas trouver de moyen de faire une boucle (facilement je veux dire, avec un for, un while)
    Quelle est la bonne façon de procéder ? la génération de code à partir d'un programme (script ou autre programme C++) ou est ce que le préprocesseur peut résoudre mon problème de manière élégante ?

    merci d'avance
    portez vous bien

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    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 153
    Billets dans le blog
    4
    Par défaut
    Personnellement dans un cas pareil, je préfère utiliser un script Python qui génère le code C++.
    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
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    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 771
    Par défaut
    Citation Envoyé par meufeu Voir le message
    j'ai en gros ca pour toutes les variables, seul le "##" change.
    et j'ai quelques 3000 variables comme ca (dotn la liste est dans un fichier)
    Mais en définitive tu n'as pas besoin de 3000 variables

    Parce que tu n'as que les chaînes de caractères qui changent ("input/##/var##", "/tmp/tmpfile##"). Et donc, tu utilises le compteur de boucle pour générer ces chaînes de caractères
    Par contre le plus pratique c'est la fonction C sprintf (<- lien cplusplus.com en anglais)
    Surtout que tu peux fixer des tailles de tableaux assez large sans que cela dérange (*)

    Avec le type std::string, il faut utiliser soit std::ostringstream soit std::to_string (depuis C++11) (ou faire ta propre fonction, ce n'est pas sorcier )
    Reste le formatage (avec du bourrage, les contraintes de largeur, ...), il faut se référer à la documentation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        #include <sstream>
     
        std::ostringstream s;
        s << "input/" << number << "/var" << number;
        std::string name = s.str();
    À vérifier ci dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        std::string name("input/" + std::to_string(number) + "/var" + std::to_string(number));

    Et quand bien même, tu peux utiliser un tableau soit std::vector parce qu'il est dynamique (taille variable) soit les tableaux C flaot var[300] (<- toujours la problématique de fixer une taille assez large (*) afin d'éviter des allocations mémoire ... à moins que tu veuilles un code plus solide au détriment du temps).
    Et donc, tu utilises le compteur de boucle pour prendre la Xième donnée tab[i].

  4. #4
    Membre éclairé Avatar de meufeu
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 355
    Par défaut
    bonjour et merci de la réponse
    L'exemeple était simpliste

    En effet dans celui ci les variables pour les fichiers pourraient être unique mais je travaille dans un framework qui impose que chaque variable soit nommée explicitement pour qu'elle soit reconnue, avec le bon type qui plus est.

    j'ai donc besoin de 3000 float dont le nom change .. ce ne peut pas être un tableau sinon le code ne fonctionnerait plus
    j'ai donc vraiment besoin de générer du code ..

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    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 771
    Par défaut
    Dans ce cas en mode berserk et le language C suffit

    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int main(int argc, char* argv[])
    {
        FILE* my_script;
     
        my_script = fopen ("myfile.py", "w+");
     
        if (my_script != NULL) {
            size_t i;
     
            for(i=0; i < 3000; ++i) {
                fprintf(my_script, "\tfloat var%04lu = initialiser(\"input/%04lu/var%04lu\");\n\
    \tfile file_%04lu = fopen(\"/tmp/tmpfile%04lu\");\n\
    \tfscanf(file_%04lu, \"%04lu\", &var%04lu);\n\
    \tfclose(file_%04lu);\n\n", i, i, i, i, i, i, i, i, i);
            }
     
            fclose (my_script);
        } else {
            printf("main  - fopen: cannot open the file\n");
        }
     
     
        return EXIT_SUCCESS;
    }

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

Discussions similaires

  1. Génération de code & bpm4struts
    Par k4eve dans le forum BPM
    Réponses: 3
    Dernier message: 08/03/2007, 15h12
  2. Modelisation UML / Génération de code C++ sous eclipse
    Par silverhawk.os dans le forum Eclipse C & C++
    Réponses: 5
    Dernier message: 03/01/2006, 00h15
  3. [UML] génération de code avec omondo.uml
    Par RENAULT dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 31/10/2003, 13h14
  4. [Lomboz] Génération de code pour EJB
    Par paikan dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 09/07/2003, 14h28

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