Génération des liens de dépendance sous C++

Please use this forum to signal bugs.
Merci d'utiliser ce forum pour signaler des bugs.

Génération des liens de dépendance sous C++

Postby Teaniel » Sun 28 Oct 2012 21:33

Bonjour,

Petit souci rencontré dans mes projets :
- Si je pose un lien entre deux classes (parce que la deuxième est utilisée dans le corps des fonctions de la première en particulier), et que je choisis dans les paramètres du lien de faire apparaitre le #include dans le sources, il apparaît malgré tout dans le header. C'est assez gênant lorsque les dépendances sont circulaires (cas des classes disposant d'un créateur).
- Autre comportement pouvant y être rattaché (peut-être pas un bug cette fois) : en c++, une fonction retournant un objet de classe par valeur n'a pas besoin de connaître la déclaration complète de la classe (c'est vrai que ça n'a pas toujours été ainsi):
Code: Select all
class B;
class A {
    B fonction(); // La déclaration forward suffit.
};

Dans ces conditions, le #include peut également être reporté dans le source, ce qui n'est pas le cas actuellement à la génération. Pour ma part j'essaie de limiter le nombre de #include dans les headers, car cela permet de limiter le nombre de lignes de code compilées pour rien. S'il ne s'agît pas d'un bug, il serait bien sympatique de le rendre possible ;) .

Voila :)
Espérant que vous pourrez corriger ces petites choses :)
A bientôt
Marc
Teaniel
 
Posts: 75
Joined: Sun 28 Oct 2012 18:57

Re: Génération des liens de dépendance sous C++

Postby Bruno Pagès » Sun 28 Oct 2012 22:21

Bonsoir,

Si je pose un lien entre deux classes...

C'est parce que le poids de la dépendance est moins fort que l'inclusion dans le header auto générée. Donc pas exemple si la seconde classe n'était pas référencée dans les profiles des opérations / attributs / relations de la première alors vous auriez ce que vous souhaitiez.

Code: Select all
en c++, une fonction retournant un objet de classe par valeur n'a pas besoin de connaître la déclaration complète de la classe

Je ne savais pas que c++ autorisait cela désormais, et ce n'est pas limité à la valeur retournée car il en est de même au niveau du type des paramètres.
Cela remet complètement en question les calculs de dépendance pour savoir où produire les #include :?

A creuser donc ...

Pour le moment vous pouvez éviter ce problème en n'utilisant plus la génération automatique des dépendance, et donc en retirant (au moins) ${includes} dans la définition du header des artifact où le problème se pose, vous devrez donc alors mettre à la main les #includes nécessaires
ImageAuthor of Bouml
Bruno Pagès
 
Posts: 465
Joined: Mon 20 Feb 2012 08:23
Location: France

Re: Génération des liens de dépendance sous C++

Postby Teaniel » Mon 29 Oct 2012 19:18

Bonjour,

Merci pour la réponse :)
Sur le premier point, il n'y avait effectivement pas d'autre référence que ce lien.
En fait, j'ai posé ce lien parce que je n'avais pas le #include du tout dans le code (erreur de compile pour type inexistant). Je vais vérifier encore une fois ce que jai dit, mais il semble bien que ce soit le cas.
Voici un exemple de code généré. Il s'agît du header obtenu après génération de classes à l'une desquelles j'ai ajouté un lien de dépendance vers la classe dBooleen (la première). Bien sur, l'option de génération du #include dans le source s'y trouvait.
Code: Select all
#ifndef _TAPPELFONCTION_H
#define _TAPPELFONCTION_H

#include "Types/dBooleen.h"
#include <QString>
#include "AST/targument.h"
#include "AST/texpression.h"
#include "Types/dType.h"

class dTexte;
class TListeExpressions;
class TFonction;

//Ne pas oublier de replacer le #include dBooleen dans le CPP aprs chaque gnration.
class TAppelFonctionNR {
  private:
    dTexte & nom;
    TListeExpressions &arguments;

  public:
    TAppelFonctionNR(const TAppelFonctionNR & _a_);
    TAppelFonctionNR(const TAppelFonctionNR && _a_);
    TAppelFonctionNR(const dTexte & _n_, const TListeExpressions & args);

  protected:
    TAppelFonctionNR();

  public:
    ~TAppelFonctionNR();
    virtual TAppelFonctionNR &clone() const = 0;
    //Cette opration permet de dupliquer des objets qui sont des temporaires.
    //Se fait toujours par new, mais en effectuant un move sur la classe.
    virtual TAppelFonctionNR &clonerval() const = 0;
    bool operator ==(const TFonction & comp) const;
    virtual QString ToString(int indent) const;
};

class TAppelFonction : public TExpression, public TAppelFonctionNR {
  private:
    TFonction & fonction;
    TAppelFonction() = delete;

  public:
    //Constructeur de copie.
    //Il n'y a pas besoin de constructeur move  parce que lla pile des fonctions est transmise par adresse.
    //Il ne faut surtout pas la copier.
    TAppelFonction(const TAppelFonction & fct);
    TAppelFonction(const TAppelFonctionNR & appel, TFonction & fct);
    ~TAppelFonction();
    virtual TAppelFonction &clone() const;
    //Cette opration permet de dupliquer des objets qui sont des temporaires.
    //Se fait toujours par new, mais en effectuant un move sur la classe.
    virtual TAppelFonction &clonerval() const;
    virtual dType Type() const;
    virtual QString ToString(int indent) const;
};
class TAppelFonctionNonTrouvee : public TExpression, public TAppelFonctionNR {
  private:
    dTexte & message;

  public:
    TAppelFonctionNonTrouvee(const TAppelFonctionNonTrouvee & src);
    TAppelFonctionNonTrouvee(TAppelFonctionNonTrouvee && src);
    TAppelFonctionNonTrouvee(const TAppelFonctionNR & appel, const dTexte & msg);
    ~TAppelFonctionNonTrouvee();
    virtual TAppelFonctionNonTrouvee &clone() const;
    //Cette opration permet de dupliquer des objets qui sont des temporaires.
    //Se fait toujours par new, mais en effectuant un move sur la classe.
    virtual TAppelFonctionNonTrouvee &clonerval() const;
    virtual dType Type() const;
    virtual QString ToString(int indent) const;
};
#endif
On constate bien qu'aucune référence à la portée dBooleen n'existe.
Si je déplace le #include vers le fichier source, ça compile toujours correctement (le forward existe déjà dans un des fichiers inclus).
Si je le retire, j'obtiens une erreur de compile dans le .cpp (la classe est utilisée dans le corps d'une fonction).
Détrompez moi, mais pour moi, la génération du #include devrait bien se faire dans le source.
J'en conclus que dans ce cas, le générateur n'a effectivement pas le comportement attendu.

J'en profite pour signaler quelque chose que j'ai oublié hier : vous remarquerez que, dans le header il manque des accentuées.
Cela se produit également dans les chaînes de caractères ("aération" est généré "aration"). J'utilise bouml 6.2 sous ubuntu 12.10. Est-ce un bug de bouml? (je l'ai utilisé aussi sous w7 et n'en ai pas le souvenir), sinon connaissez-vous un réglage permettant que cela ne se produise pas?

Merci encore :)
A bientôt
Marc
Teaniel
 
Posts: 75
Joined: Sun 28 Oct 2012 18:57

Re: Génération des liens de dépendance sous C++

Postby Bruno Pagès » Mon 29 Oct 2012 20:05

Bonsoir,

je ne sais pas pourquoi la génération de l'#include se fait dans le header et non le source dans votre cas
http://bouml.free.fr/incl.tar.gz est un mini projet contenant les classes A et B avec la dépendance A----->B et la génération de code de la classe A produit bien l'#include dans le source et non dans le leader

pouvez-vous m'envoyer votre projet par mail dans une archive (tout les fichiers projet sauf éventuellement les .bodies qui contiennent le corps des opérations) afin que je regarde ce qui se passe ? merci
ImageAuthor of Bouml
Bruno Pagès
 
Posts: 465
Joined: Mon 20 Feb 2012 08:23
Location: France

Re: Génération des liens de dépendance sous C++

Postby Teaniel » Thu 1 Nov 2012 09:31

Bonjour,

Je vous envoie cela.
Je veux bien croire (je préfèrerais même lol) que j'ai pu faire une erreur...
M'enfin bon, je l'ai tellement répété que je n'en suis vraiment pas sur.

Cordialement,
A bientôt
Marc
Teaniel
 
Posts: 75
Joined: Sun 28 Oct 2012 18:57

Re: Génération des liens de dépendance sous C++

Postby Bruno Pagès » Thu 1 Nov 2012 12:00

Bonjour,

J'ai d'abord cru que vous avez modifié à la main certains fichiers projet et mis la définition C++ de quelques dépendances à "#include dans les sources", ce qui est une valeur illégale.
Pour savoir quoi faire le générateur de code C++ regarde si la valeur en C++ d'un dépendance vaut "#include in source", comme ce n'est pas le cas l'#include est produit dans le header.
Mais en fait c'est un effet de bord du passage en Français :oops:
Ce sera corrigé dans la prochaine version

Concernant votre remarque sur la non nécessite de connaître la définition d'un type dans un header (sous réserve que ce type n'est pas hérité et qu'il ne s'agit pas d'une classe template), je vais ajouter un flag pour avoir le choix du calcul des dépendances.
ImageAuthor of Bouml
Bruno Pagès
 
Posts: 465
Joined: Mon 20 Feb 2012 08:23
Location: France

Re: Génération des liens de dépendance sous C++

Postby Teaniel » Thu 1 Nov 2012 12:29

Merci beaucoup pour cette réponse rapide :)
Personnellement, j'ai effectué quelques essais à partir de votre projet test, et j'ai effectivement constaté qu'à la première génération, le #include était placé dans le header, et qu'ensuite il n'en bougeait plus.
Ceci confirme cela.


Amicalement votre, :)
Marc
Teaniel
 
Posts: 75
Joined: Sun 28 Oct 2012 18:57

Re: Génération des liens de dépendance sous C++

Postby Bruno Pagès » Sat 3 Nov 2012 07:31

Bonjour,

La version 6.3 est disponible.

Rappel : les licences sont indépendantes des versions de BOUML, vous pouvez donc à tout moment changer de version, sans avoir à payer ni demander un nouveau fichier de licence.
ImageAuthor of Bouml
Bruno Pagès
 
Posts: 465
Joined: Mon 20 Feb 2012 08:23
Location: France


Return to Bug reports / Rapports de bugs

Who is online

Users browsing this forum: No registered users and 1 guest

cron