rajaspera
Messages postés1Date d'inscriptionvendredi 2 avril 2010StatutMembreDernière intervention19 mai 2011
-
19 mai 2011 à 12:04
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023
-
19 mai 2011 à 13:24
Bonjour,
j'ai un problème qui me bloque depuis 48 heures, j'ai décidé de finalement vous soumettre la question :
déclaration dans le main :
WeightKernel* kernelTable ;
mon problème se situe au niveau de l'instanciation :
......
kernelTable = new Convolutional[6] ; // 6 par ex
for ( int i = 0 ; i < 6 ; i++ )
kernelTable[i].init(i);
le fait est que kernelTable[i] n'accède pas aux méthodes de la classe Convolutional mais uniquement celles de la classe abstraite de départ. (je veux bien car j'ai pas casté dynamiquement). En scrutant les rapport d'erreurs, le vftable n'occure que pour kerneltable[0]. Là se situe ma question comment se fait il que le vftable est appelé uniquement pour la première boucle autrement dit, la boucle marche pour l'unique première itération mais pas pour les autres. Pourquoi ?
dans l'attente de vos réponse, je vous en remercie d'avance !
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 19 mai 2011 à 13:24
Évite les new ...[], préfère un std::list ou un std::vector.
#include
#include <list>
class WeightKernel
{
public:
WeightKernel() {}
virtual ~WeightKernel() { }
virtual void init(int) = 0;
};
class Convolutional : public WeightKernel
{
int _kernelNumero ;
int _predecessorMapNumber;
public:
Convolutional() {}
~Convolutional() {}
void init(int) { std::cout << "conv" << std::endl; }
};
int main()
{
std::list<WeightKernel*> kernelTable;
for (int i = 0; i < 6 ; ++i)
kernelTable.push_back(new Convolutional);
int i = 0;
for (std::list<WeightKernel*>::const_iterator it = kernelTable.begin();
it != kernelTable.end(); ++it)
{
(*it)->init(i);
++i;
}
for (std::list<WeightKernel*>::const_iterator it = kernelTable.begin();
it != kernelTable.end(); ++it)
delete *it;
return 0;
}
Y a un truc bizarre quand même dans ton code:
Tu fais rentrer un tableau fixe dans un simple pointeur... Or le polymorphisme, pour fonctionner correctement doit connaître sa base. Il te faut donc le faire de manière dynamique, avec un tableau contenant des pointeurs (**) et non un pointeur sur un tableau (*), sinon forcément seul le premier fonctionne...
#include
class WeightKernel
{
public:
WeightKernel() {}
virtual ~WeightKernel() { }
virtual void init(int) = 0;
};
class Convolutional : public WeightKernel
{
int _kernelNumero ;
int _predecessorMapNumber;
public:
Convolutional() {}
~Convolutional() {}
void init(int) { std::cout << "conv" << std::endl; }
};
int main()
{
WeightKernel** kernelTable = new WeightKernel*[6];
for (int i = 0; i < 6 ; ++i)
kernelTable[i] = new Convolutional;
for (int i = 0; i < 6 ; ++i)
kernelTable[i]->init(i);
return 0;
}
________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question