Il linguaggio C++
 

Errore: undefined vtable

Jack 3 Nov 2014 18:08
Ciao,
sto cercando di portare un driver di un accelerometro (Adafruit 10DOF)
su una nuova piattaforma (FRDM_k64F).
Qui: https://github.com/adafruit/Adafruit_10DOF
e qui: https://github.com/adafruit/Adafruit_Sensor
c'e' il codice originale.

Il problema (oltre al fatto che non conosco bene il C++) sembra essere
nella definizione della classe in Adafruit_Sensor.h:

class Adafruit_Sensor {
public:
// Constructor(s)
void constructor();

// These must be defined by the subclass
virtual void enableAutoRange(bool enabled) {};
virtual void getEvent(sensors_event_t*);
virtual void getSensor(sensor_t*);

private:
bool _autoRange;
};

alla compilazione mi da':

<path>/Adafruit/Adafruit_Sensor.h:139: undefined reference to `vtable
for Adafruit_Sensor'

il ******* cpp contiene solo
#include "Adafruit_Sensor.h"

void Adafruit_Sensor::constructor() {
}

qualche idea?

Grazie Ciao Jack
--
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?
enoquick 3 Nov 2014 20:59
Il 03/11/2014 11:08, Jack ha scritto:
> Ciao,
> sto cercando di portare un driver di un accelerometro (Adafruit 10DOF)
> su una nuova piattaforma (FRDM_k64F).
> Qui: https://github.com/adafruit/Adafruit_10DOF
> e qui: https://github.com/adafruit/Adafruit_Sensor
> c'e' il codice originale.
>
> Il problema (oltre al fatto che non conosco bene il C++) sembra essere
> nella definizione della classe in Adafruit_Sensor.h:
>
> class Adafruit_Sensor {
> public:
> // Constructor(s)
> void constructor();
>
> // These must be defined by the subclass
> virtual void enableAutoRange(bool enabled) {};
> virtual void getEvent(sensors_event_t*);
> virtual void getSensor(sensor_t*);
>
> private:
> bool _autoRange;
> };
>
> alla compilazione mi da':
>
> <path>/Adafruit/Adafruit_Sensor.h:139: undefined reference to `vtable
> for Adafruit_Sensor'
>
> il ******* cpp contiene solo
> #include "Adafruit_Sensor.h"
>
> void Adafruit_Sensor::constructor() {
> }
>
> qualche idea?
>
> Grazie Ciao Jack
>


Il messaggio non e' preciso in quanto non specifica il metodo (o i
metodi) non definiti
Dovrai cercarli
Inoltre aggiungici virtual ~Adafruit_Sensor() (il distruttore virtuale)
E' un grave errore logico non metterlo, in quanto si potrebbero avere
dei memory leak nella distruzione delle classi *****lie che si spera ci
siano altrimenti che senso avrebbe virtual ?
Jack 3 Nov 2014 21:10
enoquick <enoquick@gmail.com> wrote:

> Il 03/11/2014 11:08, Jack ha scritto:
>> Ciao,
>> sto cercando di portare un driver di un accelerometro (Adafruit 10DOF)
>> su una nuova piattaforma (FRDM_k64F).
>> Qui: https://github.com/adafruit/Adafruit_10DOF
>> e qui: https://github.com/adafruit/Adafruit_Sensor
>> c'e' il codice originale.
>>
>> Il problema (oltre al fatto che non conosco bene il C++) sembra essere
>> nella definizione della classe in Adafruit_Sensor.h:
>>
>> class Adafruit_Sensor {
>> public:
>> // Constructor(s)
>> void constructor();
>>
>> // These must be defined by the subclass
>> virtual void enableAutoRange(bool enabled) {};
>> virtual void getEvent(sensors_event_t*);
>> virtual void getSensor(sensor_t*);
>>
>> private:
>> bool _autoRange;
>> };
>>
>> alla compilazione mi da':
>>
>> <path>/Adafruit/Adafruit_Sensor.h:139: undefined reference to `vtable
>> for Adafruit_Sensor'
>>
>> il ******* cpp contiene solo
>> #include "Adafruit_Sensor.h"
>>
>> void Adafruit_Sensor::constructor() {
>> }
>>
>> qualche idea?
>>
>> Grazie Ciao Jack
>>
>
>
> Il messaggio non e' preciso in quanto non specifica il metodo (o i
> metodi) non definiti
> Dovrai cercarli
> Inoltre aggiungici virtual ~Adafruit_Sensor() (il distruttore virtuale)
> E' un grave errore logico non metterlo, in quanto si potrebbero avere
> dei memory leak nella distruzione delle classi *****lie che si spera ci
> siano altrimenti che senso avrebbe virtual ?

ok, roba fatta col *******
vabbe' ci butto dentro ancora una mezz'ora, se non risolvo faccio prima
a riscrivere tutto in C.

Ciao Jack
--
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?
enoquick 3 Nov 2014 21:11
Il 03/11/2014 13:59, enoquick ha scritto:
> Il 03/11/2014 11:08, Jack ha scritto:
>> Ciao,
>> sto cercando di portare un driver di un accelerometro (Adafruit 10DOF)
>> su una nuova piattaforma (FRDM_k64F).
>> Qui: https://github.com/adafruit/Adafruit_10DOF
>> e qui: https://github.com/adafruit/Adafruit_Sensor
>> c'e' il codice originale.
>>
>> Il problema (oltre al fatto che non conosco bene il C++) sembra essere
>> nella definizione della classe in Adafruit_Sensor.h:
>>
>> class Adafruit_Sensor {
>> public:
>> // Constructor(s)
>> void constructor();
>>
>> // These must be defined by the subclass
>> virtual void enableAutoRange(bool enabled) {};
>> virtual void getEvent(sensors_event_t*);
>> virtual void getSensor(sensor_t*);
>>
>> private:
>> bool _autoRange;
>> };
>>
>> alla compilazione mi da':
>>
>> <path>/Adafruit/Adafruit_Sensor.h:139: undefined reference to `vtable
>> for Adafruit_Sensor'
>>
>> il ******* cpp contiene solo
>> #include "Adafruit_Sensor.h"
>>
>> void Adafruit_Sensor::constructor() {
>> }
>>
>> qualche idea?
>>
>> Grazie Ciao Jack
>>
>
>
> Il messaggio non e' preciso in quanto non specifica il metodo (o i
> metodi) non definiti
> Dovrai cercarli
> Inoltre aggiungici virtual ~Adafruit_Sensor() (il distruttore virtuale)
> E' un grave errore logico non metterlo, in quanto si potrebbero avere
> dei memory leak nella distruzione delle classi *****lie che si spera ci
> siano altrimenti che senso avrebbe virtual ?
>

Scusa, leggendo non ho notato che il ******* cpp a parte il metodo
construct e' vuoto
Quindi il problema apparentemente e' facile, manca la definizione di
getEvent e getSensor a meno che non siano in qualche altro *******
Ma:
// These must be defined by the subclass

Dal commento si puo trarre il significato che i metodi getEvent e
GetSensor devono essere definiti nelle sottoclassi (le classi *****lie)
quindi saranno definiti li (si spera)
E non si capisce perche' non li abbia scritti cosi:

virtual void getEvent(sensors_event_t*)=0;
virtual void getSensor(sensor_t*)=0;

Se devono essere definiti nelle classe *****lie mettici tranquillamente
quello 0
oltre al distruttore virtuale
enoquick 3 Nov 2014 21:51
Il 03/11/2014 14:10, Jack ha scritto:
> enoquick <enoquick@gmail.com> wrote:
>
>> Il 03/11/2014 11:08, Jack ha scritto:
>>> Ciao,
>>> sto cercando di portare un driver di un accelerometro (Adafruit 10DOF)
>>> su una nuova piattaforma (FRDM_k64F).
>>> Qui: https://github.com/adafruit/Adafruit_10DOF
>>> e qui: https://github.com/adafruit/Adafruit_Sensor
>>> c'e' il codice originale.
>>>
>>> Il problema (oltre al fatto che non conosco bene il C++) sembra essere
>>> nella definizione della classe in Adafruit_Sensor.h:
>>>
>>> class Adafruit_Sensor {
>>> public:
>>> // Constructor(s)
>>> void constructor();
>>>
>>> // These must be defined by the subclass
>>> virtual void enableAutoRange(bool enabled) {};
>>> virtual void getEvent(sensors_event_t*);
>>> virtual void getSensor(sensor_t*);
>>>
>>> private:
>>> bool _autoRange;
>>> };
>>>
>>> alla compilazione mi da':
>>>
>>> <path>/Adafruit/Adafruit_Sensor.h:139: undefined reference to `vtable
>>> for Adafruit_Sensor'
>>>
>>> il ******* cpp contiene solo
>>> #include "Adafruit_Sensor.h"
>>>
>>> void Adafruit_Sensor::constructor() {
>>> }
>>>
>>> qualche idea?
>>>
>>> Grazie Ciao Jack
>>>
>>
>>
>> Il messaggio non e' preciso in quanto non specifica il metodo (o i
>> metodi) non definiti
>> Dovrai cercarli
>> Inoltre aggiungici virtual ~Adafruit_Sensor() (il distruttore virtuale)
>> E' un grave errore logico non metterlo, in quanto si potrebbero avere
>> dei memory leak nella distruzione delle classi *****lie che si spera ci
>> siano altrimenti che senso avrebbe virtual ?
>
> ok, roba fatta col *******
> vabbe' ci butto dentro ancora una mezz'ora, se non risolvo faccio prima
> a riscrivere tutto in C.
>
> Ciao Jack
>

L' hai letto il secondo thread sempre mio ?
Comunque che sia scritto con i piedi non lo metto in dubbio neanche io
Tra l' altro leggendo pure:

// Constructor(s)
>>> void constructor();


Questo non e'un costruttore,ma un normale metodo (poteva chiamarlo pippo
ed era la stessa cosa)
Jack 3 Nov 2014 21:57
enoquick <enoquick@gmail.com> wrote:

> Quindi il problema apparentemente e' facile, manca la definizione di
> getEvent e getSensor a meno che non siano in qualche altro ******* >
> Ma:
> // These must be defined by the subclass
>
> Dal commento si puo trarre il significato che i metodi getEvent e
> GetSensor devono essere definiti nelle sottoclassi (le classi *****lie)
> quindi saranno definiti li (si spera)

controllero', ma penso di si. Ci sono anche i files per i vari sensori,
ho messo il link se hai tempo/volgia di andare a vederli.

> E non si capisce perche' non li abbia scritti cosi:
>
> virtual void getEvent(sensors_event_t*)=0;
> virtual void getSensor(sensor_t*)=0;
>
> Se devono essere definiti nelle classe *****lie mettici tranquillamente
> quello 0
> oltre al distruttore virtuale

provero' grazie.

Ciao Jack
--
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?
Jack 3 Nov 2014 21:57
enoquick <enoquick@gmail.com> wrote:

> L' hai letto il secondo thread sempre mio ?

no, non l'avevo letto.

Ciao Jack

--
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?
enoquick 3 Nov 2014 22:14
Il 03/11/2014 14:57, Jack ha scritto:
> enoquick <enoquick@gmail.com> wrote:
>
>> Quindi il problema apparentemente e' facile, manca la definizione di
>> getEvent e getSensor a meno che non siano in qualche altro ******* >>
>> Ma:
>> // These must be defined by the subclass
>>
>> Dal commento si puo trarre il significato che i metodi getEvent e
>> GetSensor devono essere definiti nelle sottoclassi (le classi *****lie)
>> quindi saranno definiti li (si spera)
>
> controllero', ma penso di si. Ci sono anche i files per i vari sensori,
> ho messo il link se hai tempo/volgia di andare a vederli.
>
>> E non si capisce perche' non li abbia scritti cosi:
>>
>> virtual void getEvent(sensors_event_t*)=0;
>> virtual void getSensor(sensor_t*)=0;
>>
>> Se devono essere definiti nelle classe *****lie mettici tranquillamente
>> quello 0
>> oltre al distruttore virtuale
>
> provero' grazie.
>
> Ciao Jack
>

Ho letto qualche codice e quei metodi sono definiti nelle classi *****lie
Quindi con le modifiche che farai dovrebbe andare bene
Kan 4 Nov 2014 14:44
Il 03/11/2014 21:10, Jack ha scritto:
> enoquick <enoquick@gmail.com> wrote:
>
>> Il 03/11/2014 11:08, Jack ha scritto:
>>> Ciao,
>>> sto cercando di portare un driver di un accelerometro (Adafruit 10DOF)
>>> su una nuova piattaforma (FRDM_k64F).
>>> Qui: https://github.com/adafruit/Adafruit_10DOF
>>> e qui: https://github.com/adafruit/Adafruit_Sensor
>>> c'e' il codice originale.
>>>
>>> Il problema (oltre al fatto che non conosco bene il C++) sembra essere
>>> nella definizione della classe in Adafruit_Sensor.h:
>>>
>>> class Adafruit_Sensor {
>>> public:
>>> // Constructor(s)
>>> void constructor();
>>>
>>> // These must be defined by the subclass
>>> virtual void enableAutoRange(bool enabled) {};
>>> virtual void getEvent(sensors_event_t*);
>>> virtual void getSensor(sensor_t*);
>>>
>>> private:
>>> bool _autoRange;
>>> };
>>>
>>> alla compilazione mi da':
>>>
>>> <path>/Adafruit/Adafruit_Sensor.h:139: undefined reference to `vtable
>>> for Adafruit_Sensor'
>>>
>>> il ******* cpp contiene solo
>>> #include "Adafruit_Sensor.h"
>>>
>>> void Adafruit_Sensor::constructor() {
>>> }
>>>
>>> qualche idea?
>>>
>>> Grazie Ciao Jack
>>>
>>

>>
>> Il messaggio non e' preciso in quanto non specifica il metodo (o i
>> metodi) non definiti
>> Dovrai cercarli
>> Inoltre aggiungici virtual ~Adafruit_Sensor() (il distruttore virtuale)
>> E' un grave errore logico non metterlo, in quanto si potrebbero avere
>> dei memory leak nella distruzione delle classi *****lie che si spera ci
>> siano altrimenti che senso avrebbe virtual ?
>

Pro*****ilmente il problema è che nel codice hai istanziato un oggetto di
tipo Adafruit_Sensor, invece che un oggetto di un tipo derivato.
Da quello che dici, la classe Adafruit_Sensor non contiene le
definizioni delle funzioni getEvent e getSensor, per cui non può essere
istanziata ma può solo essere usata come base di una o più classi derivate.
A tal proposito, sarebbe più chiaro rendere le due funzioni virtuali pure:
virtual void getEvent(sensors_event_t*) = 0;
virtual void getSensor(sensor_t*) = 0;

così come, visto il commento "These must be defined by the subclass" la
funzione enableAutoRange dovrebbe essere:
virtual void enableAutoRange(bool enabled) = 0;
oppure implementata, visto che la classe base contiene la variabile
_autoRange:
virtual void enableAutoRange(bool enabled) { _autoRange = enabled; };

La classe che istanzi deve essere interamente definita, anche se il
messaggio di errore non è molto chiaro (non so che compilatore hai
utilizzato).
Immagino che esista una classe che deriva da Adafruit_Sensor e che
implementi le due funzioni di cui sopra: quest'ultima classe è quella da
istanziare.

> ok, roba fatta col *******
Sì, abbastanza...

> vabbe' ci butto dentro ancora una mezz'ora, se non risolvo faccio prima
> a riscrivere tutto in C.
>
> Ciao Jack
>
Jack 4 Nov 2014 16:05
Kan <fcantoro@nospam.it> wrote:


> Pro*****ilmente il problema è che nel codice hai istanziato un oggetto di
> tipo Adafruit_Sensor, invece che un oggetto di un tipo derivato.

no, nel codice ho istanziato tutto giusto.
il problema era nel distruttore (che mancava)

aggiungendo il distruttore (virtuale nel .h e poi anche nel .cpp)
e aggiungengo =0 a questi 2 metodi (non necessario l'ho fatto lo stesso)

> virtual void getEvent(sensors_event_t*) = 0;
> virtual void getSensor(sensor_t*) = 0;

mi compila e sembra funzionare, sembra nel senso che ora ho problemi col
driver del I2C, ma e' un'altra storia.

Grazie a tutti
Ciao Jack
--
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?
Vincenzo Mercuri 8 Nov 2014 19:12
On 03/11/2014 18:08, Jack wrote:
...
> Il problema (oltre al fatto che non conosco bene il C++) sembra essere
> nella definizione della classe in Adafruit_Sensor.h:
>
> class Adafruit_Sensor {
> public:
> // Constructor(s)
> void constructor();
>
> // These must be defined by the subclass
> virtual void enableAutoRange(bool enabled) {};
> virtual void getEvent(sensors_event_t*);
> virtual void getSensor(sensor_t*);
>
> private:
> bool _autoRange;
> };
>
> alla compilazione mi da':
>
> <path>/Adafruit/Adafruit_Sensor.h:139: undefined reference to `vtable
> for Adafruit_Sensor'
>
> il ******* cpp contiene solo
> #include "Adafruit_Sensor.h"
>
> void Adafruit_Sensor::constructor() {
> }
>
...

Sono informazioni incomplete ed è molto difficile aiutarti.
Dovresti fornire dettagli sul resto del codice che stai
compilando e su come lo compili. Detto questo, un costruttore
ha il nome della stessa classe e non res*****uisce un tipo,
neanche void. La funzione "void constructor()" è un membro
public come altri.


--
Vincenzo Mercuri
Jack 9 Nov 2014 02:08
Vincenzo Mercuri <vincenzo.mercuri@yahoo.it> wrote:

> Sono informazioni incomplete ed è molto difficile aiutarti.
> Dovresti fornire dettagli sul resto del codice che stai
> compilando e su come lo compili. Detto questo, un costruttore
> ha il nome della stessa classe e non res*****uisce un tipo,
> neanche void. La funzione "void constructor()" è un membro
> public come altri.

Alla fine, come si vede dagli altri messaggi ho risolto.
Le info che avevo ve le ho date (compresi link al codice che stavo
tentando di compilare) e sono comunque bastate ad enoquick per indicarmi
il motivo del problema ( e come risolverlo).

Ciao Jack
--
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?
Vincenzo Mercuri 9 Nov 2014 13:37
On 09/11/2014 02:08, Jack wrote:
> Vincenzo Mercuri <vincenzo.mercuri@yahoo.it> wrote:
>
>> Sono informazioni incomplete ed è molto difficile aiutarti.
>> Dovresti fornire dettagli sul resto del codice che stai
>> compilando e su come lo compili. Detto questo, un costruttore
>> ha il nome della stessa classe e non res*****uisce un tipo,
>> neanche void. La funzione "void constructor()" è un membro
>> public come altri.
>
> Alla fine, come si vede dagli altri messaggi ho risolto.
> Le info che avevo ve le ho date (compresi link al codice che stavo
> tentando di compilare) e sono comunque bastate ad enoquick per indicarmi
> il motivo del problema ( e come risolverlo).
>

Per motivi a me sconosciuti mi ritrovo solo adesso l'intera
discussione. Per il codice originale, si è stata una mia svista,
mi sono soffermato sul nome "constructor()", che evidentemente
mi sembrava il problema principale. Pardon.

--
Vincenzo Mercuri

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio C++ | Tutti i gruppi | it.comp.lang.c++ | Notizie e discussioni lang cpp | Lang cpp Mobile | Servizio di consultazione news.