2016-05-03 3 views
0

У меня возникла проблема с передачей массива в функцию, которая содержится в библиотеке. Я использую Arduino IDE 16.7. Если я передаю переменную non-array/non-pointer, отличную от компиляции кода. Я думаю, что я сделал основной недостаток с моими адресами указателей. Но я не могу видеть, что этоОшибка компиляции при передаче массива/указателей в процедуру в библиотеке

Вот ошибки я получаю:

  • недействительным преобразование из «символ *» до «uint8_t {ака неподписанные символ}» [-fpermissive]

  • инициализирует аргумент 2 из 'пустого EEPROMClass :: записи (междунар, uint8_t)' [-fpermissive]

Обе эти ошибки связаны с EEPROM Arduino библиотеки я использую.

Компилятор, похоже, не согласен с моей передачей массива/указателя на библиотеку EEPROm, как это ... Почему?

H Файл:

#ifndef EEPROMAnyType_h 
#define EEPROMAnyType_h 

#include <Arduino.h> 
#include <EEPROM.h> 

template <class E> 
class EEPROMAnyType 
{ 
    public: 
     int EEPROMReadAny(unsigned int addr, E x); //Reads any type of variable EEPROM 
     int EEPROMWriteAny(unsigned int addr, E x);//Writes any type of variable to EEPROM 
// EEPROMAnyType(unsigned int addr, E x); 
}; 
//#include "EEPROMAnyType.cpp" 
#endif 

CPP файл:

#include <Arduino.h> 
#include <EEPROM.h> 
#include "EEPROMAnyType.h" 



template <class E> 
int EEPROMAnyType<E>::EEPROMReadAny(unsigned int addr, E x) 
{ 
    union{ 
    byte b[sizeof(x)]; 
    E y;//generaltype y //have a variable that has no type here(using a tempplate???) 
    }; 

    int i; 
    x = x; //assign x to y(a variable of no type) which should be n the union 
    y = x; 
    for(i = 0; i < sizeof(y); i++){ // Why can I not declare i as an integer in the for loop? 
    b[i] = EEPROM.read(addr+i); 
    } 
    return i; 
} 

template <class E> 
int EEPROMAnyType<E>::EEPROMWriteAny(unsigned int addr, E x) 
{ 
    union{ 
    byte b[sizeof(x)]; 
    E y;//generaltype y //have a variable that has no type here(using a tempplate???) 
    }; 
    int i = 0; 
    y = x; 
    for(i = 0; i < sizeof(y); i++){ 
    EEPROM.write(addr+i, y); 
    } 
    return i; 
} 

INO файл (реализует библиотеку):

#include <Arduino.h> 
#include <EEPROM.h> 
#include <EEPROMAnyType.h> 
#include <EEPROMAnyType.cpp> 
int addressCharArray; 
const int writes = 80; 
const int memBase = 350; 
unsigned int eeaddrPASS; 
unsigned int eeaddrSSID; 
char eePASS[writes]; 
char eeSSID[writes]; 

EEPROMAnyType<char*> eepblueString;//instantiates EEPROMANyType class 

boolean check = false; 
void setup(){ 
    if (check = true){ 
    EEPROMwifiUpdate(eeaddrPASS, eeaddrSSID, eePASS, eeSSID); 
    } 
} 
void loop(){ 
    EEPROMwifiRead(eeaddrPASS, eeaddrSSID, eePASS, eeSSID); 
} 

void EEPROMwifiUpdate(unsigned int writeaddrPASS, unsigned int writeaddrSSID, char writePASS[writes], char writeSSID[writes]){ 
    eepblueString.EEPROMWriteAny(writeaddrPASS, writePASS); 
    eepblueString.EEPROMWriteAny(writeaddrSSID, writeSSID); 
} 

void EEPROMwifiRead(unsigned int readaddrPASS, unsigned int readaddrSSID, char readPASS[writes], char readSSID[writes]){ 
    eepblueString.EEPROMReadAny(readaddrPASS, readPASS); 
    eepblueString.EEPROMReadAny(readaddrSSID, readSSID); 
} 

ответ

0

В этом вызове

for(i = 0; i < sizeof(y); i++){ 
    EEPROM.write(addr+i, y); 
} 

y есть (если я не ошибаюсь) типа char[] (более или менее char *), а второй argment из EEPROM.write() должен быть (в соответствии с сообщением об ошибке) а uint8_t (по аналогии с char)

Я полагаю вы должны написать что-то вроде

for(i = 0; i < sizeof(y); ++i){ 
    EEPROM.write(addr+i, y[i]); 
} 

или (используя объединение)

for(i = 0; i < sizeof(b); ++i){ 
    EEPROM.write(addr+i, b[i]); 
} 

как в EEPROMReadAny().

Unrelated предложение: принимать в счете, что вы противостоите его значение без знака (sizeof(y)), то лучше, если вы определяете iEEPROMReadAny() и в EEPROMWriteAny()) unsigned или std::size_t.

p.s .: извините за мой плохой английский.

--- EDIT ---

Второго вопроса: ошибка "недопустимое преобразование из 'символа *' до '' гольца [-fpermissive] eepBLEtoothchar.EEPROMReadAny (readaddrSSID, readSSID);"

Я не понимаю эту ошибку, но ... Я вижу пару других проблем.

проблема я

Вы определяете eepblueString

EEPROMAnyType<char*> eepblueString; 

как EEPROMAnyType<char*>. Таким образом, в EEPROMAnyType<E> тип E является char *. И sizeof(E) - 4 (или 8, если вы в 64-битной платформе).

Когда вы проходите readPASS и readSSID, это char[80] так, я полагаю, ваше намерение читается 80 символов. Но ваш объект пытается читать только 4 (или 8) символа.

II Проблема

Второй аргумент EEPROMReadAny() передается по значению ; поэтому вы можете читать 4 (или 8) символа, но при выходе из метода они свободны. Чтобы сохранить прочитанные символы, вы должны передать второй аргумент по ссылке.

Вам действительно нужен EEPROMAnyType?

Я имею в виду: если EEPROMReadAny() может быть простой функцией, вы можете вывести тип E из второго аргумента, избегая первой проблемы.

Я предлагаю следующее решение (должно решить проблему II к, передав второй аргумент по ссылке)

template <class E> 
int EEReadAny (unsigned int add, E & x) 
{ 
    char * b = (char *)&x; 

    for (unsigned ui = 0U ; ui < sizeof(E) ; ++ui) 
     b[ui] = EEPROM.read(addr+i); 

    return sizeof(E); 
} 
+0

велик, что устраняет эту проблему, но я получаю новую ошибку: недопустимое преобразование из «гольца * 'to' char '[-fpermissive] –

+0

Также я получаю эту интересную ошибку, просто передавая тип String через: -' EEPROMAnyType :: EEPROMReadAny (unsigned int, E) [с E = String] :: <анонимный союз> :: ~ () 'неявно удаляется, поскольку определение по умолчанию будет плохо сформировано: union { –

+0

Что d это означает? Могу ли я передать строковый тип? Что не так с конструктором destrcutor? Я знаю, что я не инициализировал один, но он должен быть инициализирован сам по себе, не так ли? –