2016-05-03 9 views
0

ライブラリに含まれる関数に配列を渡す際に問題があります。私はArduino IDE 16.7を使用しています。 配列以外の変数を渡すと、コードが正常にコンパイルされます。 私はポインタの私のアドレスで基本的な欠陥を作ったと思います。 'uint8_t {別名unsigned char型}' [-fpermissive]配列/ポインタをライブラリ内のプロシージャに渡すときにコンパイルエラーが発生する

に 'CHAR *' から

  • 無効な変換を:しかし、私はそれがここ

    ですが、私は取得していますエラーが発生しているかを確認することができません

  • '::書き込み(INT、uint8_t)のボイドEEPROMClass' [-fpermissive]

これらのエラーのいずれもが、私が使用していますEEPROMのArduinoライブラリーに関連しているの引数2を初期化します。

コンパイラは、このような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); 
} 

ychar[](多かれ少なかれchar *)とEEPROM.write()の第argmentがなければならないの(私は間違っていないよ場合)(エラーメッセージに応じて)であり、Iは仮定

charに類似)uint8_tあなたは

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]); 
} 

の中のような(組合を使用して)のようなものを書く必要があります。

無関係の提案:あなたは符号なしの値(sizeof(y))と、それに立ち向かうことのカウントに取って、あなたが(EEPROMReadAny()にし、EEPROMWriteAny()中)unsignedまたはstd::size_tiを定義した場合、それが良いでしょう。

p.s .:申し訳ありませんが、私の悪い英語です。

--- EDIT ---

2番目の質問:エラー " '文字' 'へのchar *' [-fpermissive] eepBLEtoothchar.EEPROMReadAny(readaddrSSID、readSSID)から無効変換;"

このエラーは分かりませんが...他にもいくつか問題があります。あなたはEEPROMAnyType<char*>としてeepblueString

EEPROMAnyType<char*> eepblueString; 

を定義

Iの問題

。したがって、EEPROMAnyType<E>では、タイプEchar *です。 sizeof(E)は4(64ビットプラットフォームの場合は8)です。

readPASSreadSSIDを渡すと、それらはchar[80]です。あなたの意図は80文字であると思います。しかし、オブジェクトは4(または8)の文字だけを読み込もうとします。

II問題

EEPROMReadAny()

第2引数がによって渡されます。あなたは4(または8)の文字を読むことができますが、メソッドを終了すると緩やかになります。読み込まれた文字を保存するには、2番目の引数を参照渡しする必要があります。

本当にEEPROMAnyTypeが必要ですか?

つまり、EEPROMReadAny()が単純な関数である場合、最初の問題を回避して、2番目の引数からE型を推定できます。

は、私が(参照により、第2引数を渡す、と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

:無効な変換「をCHARから* 'to' char '[-fpermissive] –

+0

また、次のような文字列型を渡すだけでこの面白いエラーが発生しています: - ' EEPROMAnyType :: EEPROMReadAny(unsigned int、E)[E = String] :: ::〜() 'は暗黙的に削除されます。 ユニオン{​​ –

+0

何dこれはどういう意味ですか? String型を渡すことはできますか?コンストラクタdestrcutorで何が問題になっていますか?私はそれを初期化していないが、それはそれ自身で初期化されるべきであるとわかっています。 –

関連する問題