将 array/pointers 传递到库中的过程时出现编译错误
Compiling Error when passing an array/pointers into a procedure in a library
我在将数组传递给库中包含的函数时遇到问题。我正在使用 Arduino IDE 16.7。
如果我传递一个 non-array/non-pointer 变量,那么代码编译得很好。
我想我的指针地址存在一个基本缺陷。但是我看不到它是什么
这是我遇到的错误:
从 'char*' 到 'uint8_t {aka unsigned char}' 的无效转换 [-fpermissive]
正在初始化 'void EEPROMClass::write(int, uint8_t)' 的参数 2 [-fpermissive]
这两个错误都与我正在使用的 EEPROM Arduino 库有关。
编译器似乎不同意我像这样将 array/pointer 传递给 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);
}
在本次通话中
for(i = 0; i < sizeof(y); i++){
EEPROM.write(addr+i, y);
}
y
是(如果我没记错的话)类型 char[]
(或多或少 char *
)并且 EEPROM.write()
的第二个参数应该是(根据到错误消息)a 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()
.
不相关的建议:考虑到你用一个无符号值(sizeof(y)
)来面对它,最好定义i
(在EEPROMReadAny()
和[=25=中) ]) unsigned
或 std::size_t
.
p.s.: 对不起我的英语不好
--- 编辑 ---
第二题:错误"invalid conversion from 'char*' to 'char' [-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)个字符。
二题
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);
}
我在将数组传递给库中包含的函数时遇到问题。我正在使用 Arduino IDE 16.7。 如果我传递一个 non-array/non-pointer 变量,那么代码编译得很好。 我想我的指针地址存在一个基本缺陷。但是我看不到它是什么
这是我遇到的错误:
从 'char*' 到 'uint8_t {aka unsigned char}' 的无效转换 [-fpermissive]
正在初始化 'void EEPROMClass::write(int, uint8_t)' 的参数 2 [-fpermissive]
这两个错误都与我正在使用的 EEPROM Arduino 库有关。
编译器似乎不同意我像这样将 array/pointer 传递给 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);
}
在本次通话中
for(i = 0; i < sizeof(y); i++){
EEPROM.write(addr+i, y);
}
y
是(如果我没记错的话)类型 char[]
(或多或少 char *
)并且 EEPROM.write()
的第二个参数应该是(根据到错误消息)a 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()
.
不相关的建议:考虑到你用一个无符号值(sizeof(y)
)来面对它,最好定义i
(在EEPROMReadAny()
和[=25=中) ]) unsigned
或 std::size_t
.
p.s.: 对不起我的英语不好
--- 编辑 ---
第二题:错误"invalid conversion from 'char*' to 'char' [-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)个字符。
二题
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);
}