Глупый (наверняка) вопрос по указателям в Arduino

alexgauss1994
Offline
Зарегистрирован: 28.07.2014

Понадобилось передать экземпляр шаблонного класса в функцию. Ничего не предвещао беды:


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?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Это не процессинг, это вайринг.
Надо попробовать первой строкой в скетча добавить, например,
#include <Arduino.h>
Код не полный, нет функции fuelCountInitialized, легко может быть из-за этого.

alexgauss1994
Offline
Зарегистрирован: 28.07.2014
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