将数组/指针传递到库中的过程时发生编译错误
Compiling Error when passing an array/pointers into a procedure in a library
我在将数组传递到库中包含的函数时遇到问题。我使用的是Arduino IDE 16.7。如果我传递一个非数组/非指针变量,那么代码编译得很好。我想我的指针地址有一个基本的缺陷。但我看不出是什么
以下是我得到的错误:
-
从"char*"到"uint8_t{aka unsigned char}"的转换无效[-fpermission]
-
正在初始化"void EEPROMClass::write(int,uint8_t)"[-fpermission]的参数2
这两个错误都与我使用的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);
}
在这个调用中
for(i = 0; i < sizeof(y); i++){
EEPROM.write(addr+i, y);
}
y
(如果我没有错的话)是类型char[]
(或多或少是char *
),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]);
}
如在CCD_ 7中。
不相关的建议:考虑到你用无符号值(sizeof(y)
)面对它的计数,最好定义i
(在EEPROMReadAny()
和EEPROMWriteAny()
中)unsigned
或std::size_t
。
抱歉我英语不好。
---编辑---
第二个问题:错误"从'char*'到'char'的转换无效[-fpermission]eepBLEtoothchar.EEPROMReadAny(readaddrSSID,readSSID);"
我不理解这个错误,但是。。。我看到了其他一些问题。
I问题
您定义eepblueString
EEPROMAnyType<char*> eepblueString;
作为CCD_ 15。因此,在EEPROMAnyType<E>
中,类型E
是char *
。sizeof(E)
是4(如果您在64位平台中,则为8)。
当你通过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);
}
- 执行具有转换错误的过程
- 配置过程项目文件中的错误可能无效
- 如何解决导入dll过程中Viual Studio中的并排配置错误
- 使用提升过程编译简单的应用程序会生成错误
- 如何确保不会在 CI 过程中生成错误的代码?
- 为什么在编译过程中尽管有 -I(破折号大写 i)标志,但仍会出现未定义的引用错误?
- RAII获取在破坏过程中捕获的错误的方法
- C Windows-如何从其PID(错误)获取过程路径
- 编译过程中有许多错误opencv_contrib
- MSVC2013:如何避免在错误地使用预构建脚本中止构建过程(错误MSB3073:VCEnd"退出,代码为 -1)
- 生成过程中的 Clion 编译器错误
- 我的代码在执行过程中运行良好.但是当我去提交它的显示分割错误时
- 在输入结构对象的输入过程中运行时间错误
- _CRTLISVALIDHEAPPOINTER在破坏过程中的错误
- SQL Server 2016 CLR 存储过程错误:"A system assertion check has failed"
- 尝试分叉一个过程,第一个命令有效,但第二总是给出错误
- C 在结构初始化过程中带有内部阵列的奇怪错误
- C++ 'stod()'不起作用,'strtod()'编译过程中抛出错误
- 如何获取有关protobuf解析过程中生成的错误的更多详细信息?(C++)
- OPNET:在OPNET的过程模型中写了一个函数,但有错误