Ik wil mijn arduino zo programmeren dat uitbouw van sensoren in de toekomst makkelijker zal zijn. Voor nu heb ik twee sensoren (een LDR en een Thermometer) en deze heb ik als volgt omgezet naar classes:
En neem ik als volgt op in een array, zodat ik ze in één loop kan update.
Het updaten is geen probleem aangezien ik de functie Sensor::Update(); daarvoor gebruik, maar wanneer ik de waardes van de sensoren wil gaan printen loop ik tegen problemen aan. Wat ik wil is dat de LDR gebruikt maar van de functie GetValue (van de baseclass Sensor dus) en bij TemperatureSensor wil ik de GetTemperature gebruiken. Bij de laatste is namelijk omzetten naar graden Celsius nodig.
Nu heb ik met dynamic_cast zitten stoeien, maar ik begrijp niet wat er nou precies mis gaat.
Ik zal mijn probeersels neerzetten met de daarbij horende foutmeldingen:
error: cannot dynamic_cast '& sensorList[ i]' (of type 'class Sensor**') to type 'class TemperatureSensor*' (source is not a pointer to class)
error: 'dynamic_cast' not permitted with -fno-rtti
Deze foutmelding zit volgens mij dichtste bij de oplossing, wanneer ik de voorbeelden zie op internet, maar hier heb ik geen rechten en de IDE van Arduino geeft hier ook niet echt mogelijkheden voor. Tevens komt dit probleem amper voor op internet.
Als ik uit wanhoop een static_cast gebruik, gaat het casten goed, maar bij aanroepen van de functie krijg ik alsnog een foutmelding.
error: request for member 'GetTemperature' in 'n', which is of non-class type 'TemperatureSensor*'
Nu valt mij op dat hij hier niet TemperatureSensor noemt als class, maar TemperatureSensor* (met asterisk).
En ik zie nu even niet meer in wat ik nou verkeerd doe. Als ik dit in c# zou doen zou het als volgt uitzien:
Maar dit krijg ik niet voor mekaar bij een Arduino. Ik zal vast wel iets verkeerd doen, maar zie even niet wat.
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| class Sensor { public: // fields String Name; // constructors Sensor(); Sensor(uint8_t pin, String Name); // methods virtual void Update(); int GetValue(); protected: uint8_t _pin; int _Value; }; class TemperatureSensor : public Sensor { public: // constructor TemperatureSensor(uint8_t pin, String name) : Sensor(pin, name) { } // methods float GetTemperature(); }; class LdrSensor : public Sensor { public: // constructor LdrSensor(uint8_t pin, String name) : Sensor(pin, name) { } }; |
En neem ik als volgt op in een array, zodat ik ze in één loop kan update.
C:
1
2
| sensorList[0] = new TemperatureSensor(0, "livingroom"); sensorList[1] = new LdrSensor(2, "livingroom"); |
Het updaten is geen probleem aangezien ik de functie Sensor::Update(); daarvoor gebruik, maar wanneer ik de waardes van de sensoren wil gaan printen loop ik tegen problemen aan. Wat ik wil is dat de LDR gebruikt maar van de functie GetValue (van de baseclass Sensor dus) en bij TemperatureSensor wil ik de GetTemperature gebruiken. Bij de laatste is namelijk omzetten naar graden Celsius nodig.
Nu heb ik met dynamic_cast zitten stoeien, maar ik begrijp niet wat er nou precies mis gaat.
Ik zal mijn probeersels neerzetten met de daarbij horende foutmeldingen:
C:
1
| TemperatureSensor * n = dynamic_cast<TemperatureSensor*>( &sensorList[i] ); |
error: cannot dynamic_cast '& sensorList[ i]' (of type 'class Sensor**') to type 'class TemperatureSensor*' (source is not a pointer to class)
C:
1
| TemperatureSensor* n = dynamic_cast<TemperatureSensor*>( sensorList[i] ); |
error: 'dynamic_cast' not permitted with -fno-rtti
Deze foutmelding zit volgens mij dichtste bij de oplossing, wanneer ik de voorbeelden zie op internet, maar hier heb ik geen rechten en de IDE van Arduino geeft hier ook niet echt mogelijkheden voor. Tevens komt dit probleem amper voor op internet.
Als ik uit wanhoop een static_cast gebruik, gaat het casten goed, maar bij aanroepen van de functie krijg ik alsnog een foutmelding.
C:
1
2
3
4
| TemperatureSensor* n = static_cast<TemperatureSensor*>( &(*sensorList[i]) ); // deze functie gaat verkeerd. n.GetTemperature(); |
error: request for member 'GetTemperature' in 'n', which is of non-class type 'TemperatureSensor*'
Nu valt mij op dat hij hier niet TemperatureSensor noemt als class, maar TemperatureSensor* (met asterisk).
En ik zie nu even niet meer in wat ik nou verkeerd doe. Als ik dit in c# zou doen zou het als volgt uitzien:
C#:
1
2
3
4
| if(sensor is TemperatureSensor ) { TemperatureSensor temp = (TemperatureSensor)sensor; } |
Maar dit krijg ik niet voor mekaar bij een Arduino. Ik zal vast wel iets verkeerd doen, maar zie even niet wat.