1

このコードを正しく動作させるのに苦労しています。私の目標は、PROGMEM に配置された文字列を LCD に表示することです。これらの文字列へのポインタを含む配列も PROGMEM にあります。この関数は、配列を読み取るためのインデックス番号に変換される変数を使用して呼び出されます。もちろん、pgmspace.h はコードに含まれています。

私が取得し続けるエラーは次のとおりです。配列添え字の型は 'char' [-Wchar-subscripts] - 初期化により、キャストなしで整数からポインターが作成されます [デフォルトで有効]

誰かが私がここで見逃していることを指摘できますか?

AVR GCC のコードに取り組んでいる私の IDE は Eclipse です。

    const char wf0[] PROGMEM= "OFF ";
    const char wf1[] PROGMEM= "SIN ";
    const char wf2[] PROGMEM= "TRI ";
    const char wf3[] PROGMEM= "S+T ";
    const char wf4[] PROGMEM= "PUL ";
    const char wf5[] PROGMEM= "P+S ";
    const char wf6[] PROGMEM= "P+T ";
    const char wf7[] PROGMEM= "P+ST";
    const char wf8[] PROGMEM= "NOI ";
    const char wf9[] PROGMEM= "N+S ";
    const char wf10[] PROGMEM= "N+T ";
    const char wf11[] PROGMEM= "NST ";
    const char wf12[] PROGMEM= "N+P ";
    const char wf13[] PROGMEM= "NPS ";
    const char wf14[] PROGMEM= "NPT ";
    const char wf15[] PROGMEM= "NPTS";

    const char * const arrayWaveform[] PROGMEM= {wf0,wf1,wf2,wf3,wf4,wf5,wf6,wf7,wf8,wf9,wf10,wf11,wf12,wf13,wf14,wf15};

...

void showWaveform (char ctrlValue)
{
    char hex = (ctrlValue & 0xf0)>>4;

    char tempText[4];
    char* data = pgm_read_byte(&arrayWaveform[hex]); // <<shows up both errors here
    strcpy_P (tempText, data);
    for (char x=0;x<4;x++)
        {
        char2LCD(tempText[x]);  // <<shows up error: array subscript has type 'char'
        }
}
4

3 に答える 3

3

これは次のことを行う必要があります。

void showWaveform (char ctrlValue)
{
  char hex = (ctrlValue & 0xf0)>>4;
  char *pstr, tempText[5];
  memcpy_P(&pstr, arrayWaveform+hex, sizeof(char*));
  strncpy_P(tempText, pstr, sizeof(tempText));
  for (int x=0; x<4 && tempText[x] != 0; x++)
  {
    char2LCD(tempText[x]); 
  }
}

コードに複数の問題がありました。何よりもまず、arrayWaveformそれ自体が PROGMEM に格納されているため、角括弧を使用して単純にアクセスすることはできません。2 つ目は、tempText少なくとも 5 つの要素の長さである必要があります (それ以外の場合strcpy_Pは、配列の末尾を超えて書き込むことができます)。

何が起こっているのかを完全に理解するために、PROGMEM に関するドキュメントを注意深く読むことをお勧めします。AVR-GCC の最近のコピーがある場合、すべての pgm_read_* および *_P 機構を取り除くことを可能にする新しい __flash 構文もあることに注意してください。私はそれをテストしたことがないので、YMMV.

于 2013-09-25T20:42:58.473 に答える
1

tempText[x]arrayWaveform[hex]インデックスはsigned char負の値も取ることができるタイプです

に変更しますunsigned char

GCC 警告を参照してください。

Wchar-subscripts配列の添え字が char 型である場合に警告します。これは、一部のマシンでこのタイプが署名されていることをプログラマーが忘れがちであるため、エラーの一般的な原因です。この警告は -Wall によって有効になります。

于 2013-09-25T20:36:44.810 に答える
0

コンパイラが言うように、char配列アクセスに s を使用しています。通常、配列の添字はints でなければなりません。

両方の行で、変数を s にキャストするintか、最初から変数を s として宣言する必要intがあります。

他のエラーについては、a に割り当てようとpgm_read_byteする raw を返すと思いますが、これは不可能です。おそらくポインタを返す必要がありますcharchar*pgm_read_byte

于 2013-09-25T20:31:44.640 に答える