Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
doc:vrac [06/09/2014 13:48] scorpio810doc:vrac [20/11/2014 14:02] (Version actuelle) – modification externe 127.0.0.1
Ligne 1: Ligne 1:
 +~~NOCACHE~~
  
 +====== Documentation diverse et en vrac ======
 +===== Hiérarchie des classes de l'API des ElementsCollectionItem =====
 +Pour information, cette hiérarchie de classe permet d'accéder et de manipuler de manière abstraite des collections, catégories et éléments, que ceux-ci soient stockés sur un système de fichiers (classes d'implémentation File*) ou dans un projet (classes d'implémentation Xml*)
 +
 +  * ElementsCollectionItem [pure virtual]
 +    * ElementsCollection [pure virtual]
 +      * FileElementsCollection
 +      * XmlElementsCollection
 +    * ElementsCategory [pure virtual]
 +      * FileElementsCategory
 +      * XmlElementsCategory
 +    * ElementDefinition [pure virtual]
 +      * FileElementDefinition
 +      * XmlElementDefinition
 +===== Contrôles effectués lors des déplacements / copies dans l'API des ElementsCollectionItem =====
 +
 +^Contrôle                                    ^ ElementsCollection  ^^   ElementsCategory  ^^ ElementDefinition   ^^
 +^                                            ^ copy    ^ move      ^ copy    ^ move       ^ copy    ^ move       ^
 +|Handler provided ?                          | [ok]    | [ok]      | [ok]    | [ok]       | [ok]    | [ok]       |
 +|Dst != src ?                                | [ok]    | [no]      | [ok]    | [ok]       | [no]    | [no]       |
 +|Src is writable ?                           | [no]    | [no]      | [no]    | [ok]       | [no]    | [ok]       |
 +|Dst is readable ?                           | [ok]    | [no]      | [ok]    | [ok]       | [ok]    | [ok]       |
 +|Dst is writeable ?                          | [ok]    | [no]      | [ok]    | [ok]       | [ok]    | [ok]       |
 +|Dst already exists ?                        | [ok]    | [no]      | [ok]    | [ok]       | [ok]    | [ok]       |
 +|Already existing dst is writable ?          | [ok]    | [no]      | [ok]    | [ok]       | [ok]    | [ok]       |
 +|Creation/deletion error ?                   | [ok]    | [no]      | [ok]    | [ok]       | [ok]    | [ok]       |
 +
 +Légende
 +>> [ok] Vérification effectuée
 +>> [no] Vérification non effectuée car non pertinente
 +
 +Exemple : on n'a pas besoin de pouvoir modifier l'item source lors d'une copie.
 +
 +
 +À noter que certains de ces contrôles sont redondés dans l'interface utilisateur, plus exactement dans le panel d'éléments. Celui-ci n'autorise que les drag'n drop à priori possibles au regard des permissions sur les items et de leur type. Ces contrôles peuvent être désactivés via les variables ''ENABLE_PANEL_WIDGET_DND_CHECKS'' (elementspanelwidget.cpp:37) et ''ENABLE_PANEL_DND_CHECKS'' (elementspanel.cpp:35).
 +===== Embarquement des éléments dans les projets =====
 +
 +Lorsqu'un élément (ou une catégorie) est ajouté à la collection embarquée d'un projet, il ne peut être référencé que par rapport à un projet donné, en tant qu'élément embarqué ; on a alors le couple de données suivant :
 +  * un chemin en %%embed://category1/category2/category3/element.elmt%%
 +  * un pointeur QETProject * pour savoir à quel projet se rapporte %%embed://%%
 +
 +Ces données sont ce que retient un objet ElementsLocation pour désigner un élément sans ambiguïté.
 +Les projets ouverts dans l'application étant numérotés et accessibles par leur numéro (on parle de "project id"), un élément peut également être désigné par une simple chaîne de caractères de la forme %%project<id>+embed://category1/category2/category3/element.elmt%%
 +
 +
 +Passage de %%projectx+embed://%% à %%embed://%% :
 +  * effectué via la méthode ElementsLocation::fromString() : elementslocation.cpp, ligne 160
 +
 +Passages de %%embed://%% à %%projectx+embed://%% :
 +  * lors de l'enregistrement d'un fichier (méthode Diagram::fromXml) : diagram.cpp, ligne 440
 +<code c++>
 +QString type_id = e.attribute("type");
 +ElementsLocation element_location = ElementsLocation(type_id);
 +if (type_id.startsWith("embed://")) element_location.setProject(project_);
 +</code>
 +Lorsque le schéma est lu, si un élément se déclare de type %%embed://%%, alors l'ElementsLocation construit pour localiser l'élément en question se voit lié au projet auquel appartient ce schéma.
 +
 +  * lors de l'appel à la méthode toString() d'un ElementsLocation : elementslocation.cpp, ligne 143
 +<code c++>
 +/**
 + @return Une chaine de caracteres representant l'emplacement
 +*/
 +QString ElementsLocation::toString() const {
 + QString result;
 + if (project_) {
 + int project_id = QETApp::projectId(project_);
 + if (project_id != -1) {
 + result += "project" + QString().setNum(project_id) + "+";
 + }
 + }
 + result += path_;
 + return(result);
 +}
 +</code>
 +
 +===== Codes d'erreur lors du chargement d'un élément =====
 +
 +Le chargement de l'élément ... a échoué avec le code d'erreur....
 +  * 1 : Le fichier n'existe pas
 +  * 2 : Le fichier n'a pu être ouvert
 +  * 3 : Le fichier n'est pas un document XML
 +  * 4 : Le document XML n'a pas une "définition" comme racine
 +  * 5 : Les attributs de la définition ne sont pas présents et / ou valides
 +  * 6 : La définition est vide
 +  * 7 : L'analyse d'un élément XML décrivant une partie du dessin de l'élément a échoue
 +  * 8 : Aucune partie du dessin n'a pu être chargée
 +
 +===== Pourquoi -fno-ipa-sra ? =====
 +
 +L'option ''-fno-ip-sra'' a été ajoutée dans le qelectrotech.pro suite à la découverte de l'erreur de compilation suivante avec ''g++'' 4.6.2 sur plateforme x86_64:
 +  * En ''-O2'' et ''-03'' : <code>
 +release/elementspanel.o: In function `ElementsPanel::slot_doubleClick(QTreeWidgetItem*, int)':
 +elementspanel.cpp:(.text+0x144b): undefined reference to `TitleBlockTemplateLocation GenericPanel::valueForItem<TitleBlockTemplateLocation>(QTreeWidgetItem*) const'
 +collect2: ld returned 1 exit status
 +</code>
 +  * En ''-Os'' : <code>
 +release/elementspanel.o: In function `ElementsPanel::slot_doubleClick(QTreeWidgetItem*, int)':
 +elementspanel.cpp:(.text+0xf43): undefined reference to `QETProject* GenericPanel::valueForItem<QETProject*>(QTreeWidgetItem*) const'
 +elementspanel.cpp:(.text+0xf5d): undefined reference to `Diagram* GenericPanel::valueForItem<Diagram*>(QTreeWidgetItem*) const'
 +elementspanel.cpp:(.text+0xfd5): undefined reference to `TitleBlockTemplateLocation GenericPanel::valueForItem<TitleBlockTemplateLocation>(QTreeWidgetItem*) const'
 +collect2: ld returned 1 exit status
 +</code>
 +  * En ''-O0'' et ''-O1'' : pas d'erreur
 +
 +Pour rappel, la compilation en mode "Release" utilise ''-O2'' tandis que celle en mode "Debug" n'incorpore pas d'optimisations spécifiques.
 +
 +L'erreur elle-même se traduit ainsi : au moment de générer le binaire final, l'éditeur de liens ld constate que elementspanel.o référence une fonction / un symbole qu'il n'a pas pu retrouvé ailleurs, à savoir ''T GenericPanel::valueForItem<T>(QTreeWidgetItem *)''.
 +Une rapide analyse des objets générés confirme cette version des faits :
 +
 +  * ''.o'' fonctionnels compilés avec ''-O1'' : <code>
 + $ objdump  -x  release/elementspanel.o | nl -b a | egrep -i 'valueforitem.*titleblocktemplatelocation'
 +   330  0000000000000000         *UND*  0000000000000000 _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem
 +   674  0000000000000e82 R_X86_64_PC32     _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc
 + $ objdump  -x  release/genericpanel.o | nl -b a | egrep -i 'valueforitem.*titleblocktemplatelocation'
 +   254  122 .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem 000001ae  0000000000000000  0000000000000000  00006b60  2**4
 +   434  0000000000000000 l    d  .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem      0000000000000000 .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem
 +   727  0000000000000000  w    F .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem      00000000000001ae _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem
 +  1004  0000000000000e7a R_X86_64_PC32     _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc
 +  1489  00000000000039df R_X86_64_PC32     _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc
 +  1932  RELOCATION RECORDS FOR [.text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem]:
 +  2360  00000000000000cf R_X86_64_PC32     _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc
 +  2504  00000000000006dc R_X86_64_PC32     .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem
 +</code>
 +  * ''.o'' compilé avec ''-O2'' : on constate que ''genericpanel.o'' ne contient plus qu'un laconique symbole suffixé "''.isra.41''"<code>
 +$ objdump  -x  release/elementspanel.o | nl -b a | egrep -i 'valueforitem.*titleblocktemplatelocation'
 +   303  0000000000000000         *UND*  0000000000000000 _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem
 +   676  000000000000144b R_X86_64_PC32     _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc
 +$ objdump  -x  release/genericpanel.o | nl -b a | egrep -i 'valueforitem.*titleblocktemplatelocation'
 +   317  00000000000000f0 l     F .text  00000000000001cc _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem.isra.41
 +</code>
 +Une rapide recherche sur les [[http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html|optimisations activées avec ''-O2'' mais pas ''-O1'']] nous conduit à l'option ''-fipa-sra'' (d'où ''-fno-ipa-sra'') : <code>
 +-fipa-sra
 +    Perform interprocedural scalar replacement of aggregates, removal of unused parameters and replacement of parameters passed by reference by parameters passed by value.
 +
 +    Enabled at levels -O2, -O3 and -Os. </code>
 +Sans doute le compilateur a-t-il décidé que ''QTreeWidgetItem *'' (pointeur standard, 64 bits) pouvait être directement remplacé par un QTreeWidgetItem, mais ça ne semble pas avoir fait beaucoup de biens à la liste des symboles générés... Toute explication plus détaillée sera la bienvenue
 +
 +[[http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41750]]
 +
 +==== note ====
 + 
 +
 +problème de compilation seulement sur backport wheezy arch amd64 4:4.7.2, build ok en sid 4:4.8.1
 +avec dans le debian/rules
 +<code>
 +CFLAGS+=-O2
 +CXXFLAGS=-O3''
 +</code>
 +<code>
 +recentfiles.o release/moc_titleblockpropertieswidget.o release/moc_titleblocktemplate.o release/moc_titleblocktemplaterenderer.o release/moc_xmlelementdefinition.o release/moc_xmlelementscategory.o release/moc_xmlelementscollection.o release/moc_diagramselection.o release/moc_dialogautonum.o release/moc_dialogwaiting.o release/moc_numparteditorw.o release/moc_selectautonumw.o release/moc_arceditor.o release/moc_elementitemeditor.o release/moc_elementprimitivedecorator.o release/moc_elementscene.o release/moc_elementview.o release/moc_ellipseeditor.o release/moc_lineeditor.o release/moc_parttext.o release/moc_parttextfield.o release/moc_polygoneditor.o release/moc_qetelementeditor.o release/moc_rectangleeditor.o release/moc_styleeditor.o release/moc_terminaleditor.o release/moc_texteditor.o release/moc_textfieldeditor.o release/moc_dimensionwidget.o release/moc_helpercell.o release/moc_integrationmovetemplateshandler.o release/moc_movetemplateshandler.o release/moc_qettemplateeditor.o release/moc_
 +splittedhelpercell.o release/moc_templatecellwidget.o release/moc_templatedeleter.o release/moc_templatelocationchooser.o release/moc_templatelocationsaver.o release/moc_templatelogomanager.o release/moc_templatescollection.o release/moc_templateview.o release/moc_richtexteditor_p.o release/qrc_qelectrotech.o    -L/usr/lib/x86_64-linux-gnu -lQtSvg -lQtSql -lQtXml -lQtGui -lQtNetwork -lQtCore 
 +release/elementspanel.o: In function `ElementsPanel::slot_doubleClick(QTreeWidgetItem*, int)':
 +elementspanel.cpp:(.text+0x201c): undefined reference to `TitleBlockTemplateLocation GenericPanel::valueForItem<TitleBlockTemplateLocation>(QTreeWidgetItem*) const'
 +collect2: error: ld returned 1 exit status
 +make[2]: *** [qelectrotech] Error 1
 +</code>
Imprimer/exporter