Le langage SMS est exclu sur les forums ProgBoards, tout message ne respectant pas la charte sera déplacé, modifié, ou supprimé par nos modérateurs.

Forum Langages » C & Cie. » [C++] duplicate section [...] has different size

Freem
Modérateur
Citer Windows XP Firefox 3 - Posté le 21/07/2009 à 12:18
J'ai ces 2 warnings:
||warning: duplicate section `.data$_ZN14SQLObjectModelI5ObjetE6refVarE[SQLObjectModel<Objet>::refVar]' has different size|
||warning: duplicate section `.data$_ZN14SQLObjectModelI5ObjetE11refTypesVarE[SQLObjectModel<Objet>::refTypesVar]' has different size|
qui sont manifestement générées par une classe Mobile qui hérites d'une autre classe Objet qui elle-même hérite d'une classe template...
J'ai cru comprendre que c'est dû a une erreur de surcharge de méthode virtuelle en cherchant un peu sur le net, mais ça ne m'aide vraiment pas (gêné)

Les sources de ces 3 classes sont ici:

Wall (168) : Afficher le code source - Ouvrir dans une nouvelle fenêtre

(Je les ai concaténées pour plus de simplicité d'accès... il faudra les séparer pour "pouvoir" compiler. Autre détail, elles sont en "UTF8 sans BOM" à la base, mais le forum n'à pas l'air de trop apprécier...)

Edité par Freem ( 21/07/2009 12:22:58 )
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin
Francesco
Modérateur
RemonterCiter Linux Firefox 3 - Posté le 21/07/2009 à 15:37
Je parierais un problème avec tes constantes NBVAR.

Lorsque tu compiles le fichier objet.cpp, NBVAR vaut 4. L'attribut statique template hérité refVar et refTypeVar, sont donc défini comme des char* refVar[4] et char* refVarType[4].

Lors de la compilation de mobile.cpp, tu définis NBVAR à 6, et apèrs tu inclus "objet.h". Objet.h n'aura pas besoin de définir ton NBVAR puisqu'il y ait déjà.

Lors de l'édition des liens, le fichier généré à partir de mobile.cpp fait référence à des char* refVar[6] et char* refVarType[6], alors qu'ils sont instancié en tant que char* refVar[4] et char* refVarType[4] dans objet.cpp

Je ne sais pas si j'ai été clair ? (héhé)

[edit]
Si cela ne résout pas le problème, fait une archive du programme, cela sera plus facile pour l'aide au débuggage. Car je n'ai pas réussi à reproduire l'erreur avec juste les class que tu as fourni. Indique aussi ton compilo (clein d'oeil)
[/edit]

Edité par Francesco ( 21/07/2009 15:39:25 )
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
Freem
Modérateur
RemonterCiter Windows XP Firefox 3 - Posté le 21/07/2009 à 18:49
J'utilise gcc 4.4.0. (enfin, le portable windows) avec les options

-ansi -Wextra -std=c++0x -pedantic --Weffc++ -Wswitch-default -Wmissing-include-dirs -Wmissing-declarations -Winline -Wundef -Wcast-align -Wredundant-decls -Winit-self -Wshadow



J'ai bien pensé à NBVAR, mais il y à un indice qui fait que je doute qu'il soit en cause:

static char *refVar[NBVAR], *refTypesVar[NBVAR], *refPrintfVar[NBVAR]; //!< Noms des colonnes de la table et les diverses repr&#65533;sentations de ceux-ci. NBVAR dois &#65533;tre d&#65533;fini avant d'inclure sqlobjectmodel.h.

il y à 3 tableaux qui ont besoin de lui, et seuls 2 me font ce warning.
Qui plus est, j'ai utilisé des tests pour vérifier que NBVAR n'était pas déjà défini.

Je te fais une archive. Par contre, je ne connais pas les makefile, mais comme code block est portable à priori, tu devrais pouvoir compiler sans trop te prendre la tête avec. (et mon code devrait l'être aussi, mais je pense que tu auras des warning...En plus de ces 2 la et d'un autre dû à sqlite3 et -pedantic)

[edit]
Je t'envoie l'archive par mail, je n'ai pas d'autre moyen de la stocker.
Le mail est partit.

Aïe... je m'aperçois que j'aurais dû nettoyer un peu plus le code quand même... quand je parlais de crade, je pensais pas si bien dire. Mais ça change rien pour autant :/
Le problème s'est déclenché dès que j'ai fait hériter Mobile de Objet au lieu de SQLObjectModel, mais je ne vois pas pourquoi?
[/edit]

Edité par Freem ( 21/07/2009 20:01:57 )
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin
Francesco
Modérateur
RemonterCiter Linux Firefox 3 - Posté le 21/07/2009 à 20:01

Citation de freem
il y à 3 tableaux qui ont besoin de lui, et seuls 2 me font ce warning.


Certes, mais seulement deux tableaux sont explicitements instanciés, et ce sont ces deux tableaux qui posent problème (clein d'oeil)

Citation de freem
Qui plus est, j'ai utilisé des tests pour vérifier que NBVAR n'était pas déjà défini..


Oui, mais attention, NBVAR est une constante préprocesseur. Lorsque tu compile le fichier objet.cpp, il vaut 4, alors que lorsque tu compile le fichier mobile.cpp, il vaut 6.

Les deux tableaux posant problèmes sont instanciés avec une taille de 4 dans le fichier objet.cpp, mais déclarés comme étant d'une taille de 6 dans le fichier mobile.cpp. D'où, je pense, le problème de link, avec un message d'erreur qui y correspondrait ("has different size").

Je vais regarder la source et je te tiens au courant.

[edit]
Par contre, je n'ai pas reçu de mail. Ca va être dur dur pour jeter un coup d'oeil ^^. Au pire, mets le sur un ftp. Tu dois bien avoir ça qui traine dans un coin non ?
[/edit]

Edité par Francesco ( 21/07/2009 21:08:25 )
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
Freem
Modérateur
RemonterCiter Windows XP Firefox 3 - Posté le 21/07/2009 à 20:25
Merci pour l'info... le problème venait bien du NBCHAR qui différait.
Je vais donc utiliser les template comme on l'a dis sur IRC.
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin
Francesco
Modérateur
RemonterCiter Linux Firefox 3 - Posté le 21/07/2009 à 21:01
Par contre, juste une petite chose qui va changer : tu ne pourra plus faire l'instanciation explicite des attributs statiques de ta classe SQLObjectModel dans le fichier Objet.cpp. Tu devras le faire dans le fichier Mobile.cpp : et oui, ta classe Objet va devenir un template est il est impossible d'instancier des attributs d'une classe template.
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
Freem
Modérateur
RemonterCiter Windows XP Firefox 3 - Posté le 21/07/2009 à 21:21
Je vient de voir ça.
C'est gênant, parce que j'aimerai pouvoir utiliser des objets simples. C'est sûr que je peux n'utiliser que la classe Mobile qui ne fait qu'ajouter 2 membres, mais dans ce cas, autant directement supprimer Objet et l'implémenter directement dans Mobile (confus)

Enfin bon, je connaît le problème, je devrai pouvoir trouver une solution (sourire)
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin
Francesco
Modérateur
RemonterCiter Linux Firefox 3 - Posté le 21/07/2009 à 22:10
Autre possibilité : revoir un peu ton code.

Méthode 1
Au lieu d'avoir des char* refVar[NBVAR], pourquoi ne pas mettre des char **refVar ? Et tu alloues la mémoire nécessaire par la suite.

Méthode 2
Au lieu d'avoir une gestion de tableau à la C dans du code C++, pourquoi ne pas utiliser la classe Vector ?
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
Freem
Modérateur
RemonterCiter Windows XP Firefox 3 - Posté le 21/07/2009 à 22:28
J'avais pas pensé à la méthode 2 ^^
J'ai pas encore vraiment le réflexe STL en fait... mauvaises habitudes qui se sont pas améliorées pendant que je programmais plus...
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin
Francesco
Modérateur
RemonterCiter Linux Firefox 3 - Posté le 21/07/2009 à 22:29
la méthode 2 est de plus la plus sécurisé à mon sens, puisque gère automatiquement la taille du tableau.
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
Freem
Modérateur
RemonterCiter Windows XP Firefox 3 - Posté le 21/07/2009 à 22:31
C'est probablement celle que je vais finir par utiliser. Ce projet a la con va vraiment me faire du bien on dirait mdr
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin

Poster une réponse

STOP aux fautes volontaires !
Message
Formatage
Note: pour partager du code source, merci d'utiliser le wall !
Smileys (sourire) (yekyek) (clein d'oeil) (désapprouve) (triste) (cool) (langue) (confus) (gêné) (neutre) (eek) (surpris) (diable) (flèche) (exclamation) (question) (diable) (idée) (méchant)
Pseudonyme
Recopiez le code
v6 © Computaid SPRL 2005-2012 - Tous droits réservés - Hébergé par eTigris - Page générée en 0,046 s - Crédits - Stats
1 connecté