将数组/指针传递到库中的过程时发生编译错误

Compiling Error when passing an array/pointers into a procedure in a library

本文关键字:过程 错误 编译 数组 指针      更新时间:2023-10-16

我在将数组传递到库中包含的函数时遇到问题。我使用的是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()中)unsignedstd::size_t

抱歉我英语不好。

---编辑---

第二个问题:错误"从'char*'到'char'的转换无效[-fpermission]eepBLEtoothchar.EEPROMReadAny(readaddrSSID,readSSID);"

我不理解这个错误,但是。。。我看到了其他一些问题。

I问题

您定义eepblueString

 EEPROMAnyType<char*> eepblueString;

作为CCD_ 15。因此,在EEPROMAnyType<E>中,类型Echar *sizeof(E)是4(如果您在64位平台中,则为8)。

当你通过readPASSreadSSID时,它们就是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);
 }