2

MPLabs C18Cコンパイラを使用してPIC18f4685取り組んでいますが、LCDに印刷したいフレーズの配列を作成しようとすると問題が発生します。

gccでCodeblocksを使用してこのコードを入力すると、コンソールに期待するものが出力されます... test1 test2 test3 test4

char *test[]={"test1","test2","test3","test4"};
printf("%s %s %s %s\n",test[0],test[1],test[2],test[3]);

ただし、C18でこのコードを使用する場合:

    char *phrase[]={"test1","test2"};

警告が表示type qualifier mismatch in assignmentされ、チップをプログラムすると、LCDにゴミが吐き出されます。

何かが明らかに間違っているので、私のフレーズを宣言する適切な方法は何ですか?

4

2 に答える 2

4

どうやら文字列リテラルはrom const char[N]MPLabCにあるようです。したがって、次のようにオブジェクトを宣言する必要があります。

rom const char *rom test[]={"test1","test2","test3","test4"};

MPLAB C18 Cコンパイラユーザーズガイドには、ISO DIVERGENCES(2.7)という名前の章があり、2.7.3は文字列リテラルを参照しています。

2.7.3から:

MPLAB C18を使用する場合、プログラムメモリ内の文字列テーブルは次のように宣言できます。

rom const char table[][20] =   { "string 1", "string 2",  
                                 "string 3", "string 4" }; 
rom const char *rom table2[] = { "string 1", "string 2", 
                                 "string 3", "string 4" }; 
于 2012-06-03T21:27:57.417 に答える
2

@awoodlandの(現在は削除されている)答えは本質的に正しい考えだと思います。

宣言:

char *phrase[] = {"test1", "test2"};

は完全に有効なCですが、問題が発生する可能性があります。C文字列リテラルはそうではありませんconstが、それらを変更しようとすると、未定義の動作が発生します。(実際にconstはC ++であるため、上記の宣言は違法になります。)

C18がconst文字列リテラルの性質を強制している可能性があります。constその場合は、キーワードを追加することでエラーを回避できるはずです。

const char *phrase[] = {"test1", "test2"};

ここに追加するconstことは、とにかく良い考えです。それがないと、コンパイラは文字列の1つを変更しようとする試みを診断できないからです。

gccの-Wwrite-stringsオプションは、同様の非標準機能を有効にすることに注意してください。

編集 :

ouahの答えを参照してください。標準Cでは必須ではconstありませんが、とにかく使用することをお勧めします。この特定の実装では、システム固有のromキーワードも追加する必要があります。

于 2012-06-03T21:29:42.783 に答える