Глупый (наверняка) вопрос по указателям в Arduino
- Войдите на сайт для отправки комментариев
Втр, 29/07/2014 - 00:48
Понадобилось передать экземпляр шаблонного класса в функцию. Ничего не предвещао беды:
const int FUEL_MAP_SIZE = 100;
const int FUEL_MAP_CONFURIGURED_ADDRESS = 1;
const int FUEL_MAP_ADDRESS = 2;
typedef FloatKeyContainer<FUEL_MAP_SIZE, 255, byte, byte> FuelMap;
void initializeFuelMap(FuelMap* bFuelMap) {
}
void loop() {
FuelMap fuelMap;
if(fuelCountInitialized()) {
fuelMap.load(FUEL_MAP_ADDRESS);
}
else {
initializeFuelMap(&fuelMap);
}
}
И тут :
apparate_ino:10: error: variable or field 'initializeFuelMap' declared void
apparate_ino:10: error: 'FuelMap' was not declared in this scope
apparate_ino:10: error: 'bFuelMap' was not declared in this scope
Но :
void initializeFuelMap(byte* bFuelMap) {
}
void loop() {
FuelMap fuelMap;
if(fuelCountInitialized()) {
fuelMap.load(FUEL_MAP_ADDRESS);
}
else {
initializeFuelMap((byte*)&fuelMap);
}
}
Собирается без проблем. Я таки слепой, иил это какая-то особенность Processing?
Это не процессинг, это вайринг.
Надо попробовать первой строкой в скетча добавить, например,
#include <Arduino.h>
Код не полный, нет функции fuelCountInitialized, легко может быть из-за этого.
inline bool fuelCountInitialized() { return (bool)EEPROM.read(FUEL_MAP_CONFURIGURED_ADDRESS); }Таки она есть. Что характерно - после приведения от byte* к FuelMap* все работает
#define DEBUG #include <Arduino.h> #include <Debug.h> #include <EEPROM.h> #include <FloatKeyContainer.h> const int SERIAL_SPEED = 9600; //Скорость последовательного порта const int INPUT_VOLTAGE_PIN = 0; //Вход для считывания напряжения бортовой сети const int INPUT_AMOUNT_PIN = 0; //Вход для считывания показаний датчика const int FUEL_MAP_SIZE = 100; const int FUEL_MAP_CONFURIGURED_ADDRESS = 1; const int FUEL_MAP_ADDRESS = 2; const double MAX_VOLTAGE = 12.0; //Максимальное напряжение бортовой сети const double MIN_AMOUNT = 0.0; //Минимальное количество топлива (датчик выдаст 0В) const double MAX_AMOUNT = 99.0; //Максимальное количество топлива (датчик выдаст 5В) typedef FloatKeyContainer<FUEL_MAP_SIZE, 255, byte, byte> FuelMap; /* * Чтение напряжения с аналогового входа. * pin - номер входа * возвращает значения между 0.0 и 1.0 */ double getVoltage(int pin) { int readed = analogRead(pin); Debug("Reading analog pin : ", pin); Debug("Readed value : ", readed); return (readed / 1023.0); } /* * Установка */ void setup() { DebugInit(SERIAL_SPEED); } inline bool fuelCountInitialized() { return (bool)EEPROM.read(FUEL_MAP_CONFURIGURED_ADDRESS); } void initializeFuelMap(byte* bFuelMap) { FuelMap* fuelMap = (FuelMap*)bFuelMap; fuelMap->insert(0.0, 0); fuelMap->insert(1.0, 1); fuelMap->insert(2.0, 2); fuelMap->insert(3.0, 3); } void loop() { FuelMap fuelMap; if(fuelCountInitialized()) { fuelMap.load(FUEL_MAP_ADDRESS); } else { initializeFuelMap((byte*)&fuelMap); } }А напрямую - облом-с
#define DEBUG #include <Arduino.h> #include <Debug.h> #include <EEPROM.h> #include <FloatKeyContainer.h> const int SERIAL_SPEED = 9600; //Скорость последовательного порта const int INPUT_VOLTAGE_PIN = 0; //Вход для считывания напряжения бортовой сети const int INPUT_AMOUNT_PIN = 0; //Вход для считывания показаний датчика const int FUEL_MAP_SIZE = 100; const int FUEL_MAP_CONFURIGURED_ADDRESS = 1; const int FUEL_MAP_ADDRESS = 2; const double MAX_VOLTAGE = 12.0; //Максимальное напряжение бортовой сети const double MIN_AMOUNT = 0.0; //Минимальное количество топлива (датчик выдаст 0В) const double MAX_AMOUNT = 99.0; //Максимальное количество топлива (датчик выдаст 5В) typedef FloatKeyContainer<FUEL_MAP_SIZE, 255, byte, byte> FuelMap; /* * Чтение напряжения с аналогового входа. * pin - номер входа * возвращает значения между 0.0 и 1.0 */ double getVoltage(int pin) { int readed = analogRead(pin); Debug("Reading analog pin : ", pin); Debug("Readed value : ", readed); return (readed / 1023.0); } /* * Установка */ void setup() { DebugInit(SERIAL_SPEED); } inline bool fuelCountInitialized() { return (bool)EEPROM.read(FUEL_MAP_CONFURIGURED_ADDRESS); } void initializeFuelMap(FuelMap* fuelMap) { fuelMap->insert(0.0, 0); fuelMap->insert(1.0, 1); fuelMap->insert(2.0, 2); fuelMap->insert(3.0, 3); } void loop() { FuelMap fuelMap; if(fuelCountInitialized()) { fuelMap.load(FUEL_MAP_ADDRESS); } else { initializeFuelMap(&fuelMap); } }apparate_ino:11: error: variable or field 'initializeFuelMap' declared void
apparate_ino:11: error: 'FuelMap' was not declared in this scope
apparate_ino:11: error: 'fuelMap' was not declared in this scope
p.s.
ЗЫ Нашёл, что ошибка в typedef-е - если подставить напрямую шаблон, то всё пучком. Надо поглядеть на http://stackoverflow.com/questions/6907194/how-to-typedef-a-template-class