2012-05-04 16 views
2

私は以下を持っています。文字列へのポインタの配列

const CHAR string_1[] PROGMEM = "String 1"; 
const CHAR string_2[] PROGMEM = "String 2"; 
const CHAR string_3[] PROGMEM = "String 3"; 
const CHAR string_4[] PROGMEM = "String 4"; 
const CHAR string_5[] PROGMEM = "String 5"; 

const CHAR *string_table[] PROGMEM = 
{ 
    string_1, 
    string_2, 
    string_3, 
    string_4, 
    string_5 
}; 

文字列テーブルのこのアドレスを保存すると、関数内で呼び出すことができます。

CHAR acBuffer[20]; 
UCHAR ucSelectedString = 2; // get string number 3 
// 
    pcStringTable = string_table ...?? What is the proper line here?? 
// 
strcpy_P(acBuffer, (char*)pgm_read_byte(&(pcStringTable[ucSelectedString]))) 

以下のコメントに基づいて、構造も変更されました。

typedef struct 
{ 
... 
CHAR **pasOptions; 

次に、string_tableを割り当てようとしました。

stMenuBar.pasOptions = string_table; 

コンパイラはこの警告をスローします。

warning: assignment from incompatible pointer type 

これ以上考えませんか?

+0

MahmoudAl-Qudsi @私は従っていません:あなたは、その後、他の1次元配列としてアクセスすることができます

const char **pcStringTable = string_table; 

。私は構造体でそれを宣言していませんか? – mriksman

+0

私はstmenubarが無名の構造体であるという事実を忘れてしまった。 –

答えて

3

string_tableは、文字列へのポインタの配列です。配列は(1次元なので、それは唯一の種類なので)ポインタをうまく減衰させることができます。

したがって、文字列の配列への配列は、ポインタ(think:array)〜(chars [think:strings]のポインタ)として表すことができます。

printf("%s", pcStringTable[2]); 
+2

OPsのコードのコードは2次元配列ではなく、ポインターの配列になっています。ポインタを1つのポインタにダウンキャストすると、1つのポインタで終了します。 – Lundin

+0

悪いです。急いで返信。 –

+0

変更されました。ありがとう。 –

関連する問題