2017-11-29 14 views
1

私はクラスのプロジェクトを行っています。埋め込まれたCコード。 私は、グローバルに宣言する5つの文字列のchar配列を作成しようとしています。そのため、LCD関数は簡単にリストをループできます。彼らはconstとして宣言することができましたが、今は問題なくビルドしたいだけです。文字配列が関数内で認識されません

問題ビルド時に関数で「宣言されていない」エラーが発生し、宣言を指す「競合する型」エラーが発生します。宣言は正しいように見えますが、そうではないと思います。私は何が欠けていますか? 宣言されていないエラーは、宣言がソートされた後で修正される可能性があります。私lcd.cファイル内

 // Declared before main() 
    char _cylinder_types[5]; 

    _cylinder_types[0] = "Blk"; 
    _cylinder_types[1] = "Wht"; 
    _cylinder_types[2] = "Stl"; 
    _cylinder_types[3] = "Alu"; 
    _cylinder_types[4] = "Err"; 

void lcd_display_update(void){ 

    int i = 0; 
    while(i<5) 
    { 
    lcd_write(0); 
    lcd_position(lcd_TopLine,1); 
    lcd_string("SORTED:"); 
    lcd_string(_cylinder_types[i]); 
    lcd_write(':'); 
    lcd_write_Num_8(drop_number[i]); 

    lcd_position(lcd_BotLine,1); 
    lcd_string("UNSORTED:"); 
    lcd_string(_cylinder_types[i]); 
    lcd_write(':'); 
    lcd_write_Num_8(queued_number[i]); 

    mTimer(5000); 
    } 
    i++; 
} 
+0

はフルを表示しますコードをお願いします。とにかく、文字列*を 'char'配列要素に割り当てることはできません。 –

+0

'char _cylinder_types [5];'を指定すると、 '_cylinder_types [0]'配列要素は何と思いますか? –

答えて

6

はちょうどこの式文

_cylinder_types[0] = "Blk"; 

文字列リテラル"Blk"に例えば

char * _cylinder_types[5]; 
^^^^^^ 

のような配列を宣言私暗黙的にタイプchar *の右辺値に変換されます。

そして、あなたは、任意の関数の外

_cylinder_types[0] = "Blk"; 
_cylinder_types[1] = "Wht"; 
_cylinder_types[2] = "Stl"; 
_cylinder_types[3] = "Alu"; 
_cylinder_types[4] = "Err"; 

これらのステートメントを配置しないことがあります。

あなたは、たとえば、最初はいくつかのコンパイル単位は、プロジェクト内にある場合、配列は

extern char * _cylinder_types[5]; 

と、いくつかのモジュールのように、ヘッダに宣言する必要があります

char * _cylinder_types[5] = 
{ 
    "Blk", "Wht", "Stl", "Alu", "Err" 
}; 

のように配列を初期化でき例えばのように定義されている

char * _cylinder_types[5] = 
{ 
    "Blk", "Wht", "Stl", "Alu", "Err" 
}; 

ヘッダーは配列への参照がある各モジュールに含まれています。

は、このステートメント

i++; 

は、whileループ内でなければならないことを考慮してください。

+0

私はそれを試みたが、何も変わらなかった。 –

+0

@ChefFlambe配列が関数定義の前に宣言されているかどうかを確認してください。私の更新されたポストも参照してください。 –

+0

Thnx、それはその一部を修正するようです。機能外の割り当てを忘れてしまった。ニースはi ++を捕まえていますまだ宣言されていない(この関数での最初の使用)エラーが発生しています。グローバル変数の宣言の後に私のプロトタイプをすべて移動したので、なぜそれが渡されていないのか混乱してしまいました。ヘッダーにexternとして宣言する必要がありますか? –

0

次提案コード:それが欠落しているため、

  1. はまだヘッダファイルの記述が含まれ、とりわけ、コンパイルされません。
  2. は、一連の代入文ではなく、宣言時に配列を初期化する方法を示しています。
  3. それがそう、一方で
  4. は、他に、もし、用(コードブロックを分ける非常に読みやすいよう
  5. を文字列へのポインタの配列は、4つのスペースのインデント幅を使用して、適切に配列を宣言します...一方、このような名前がOS
  6. の「予約」される_始まる、アレイに名前を付けない
  7. 単一の空白線を介して、スイッチ、ケース、デフォルト)は、配列のサイズを決定するためにコンパイラを可能
  8. は 'preprocessor'演算子 'sizeof'を使用してfor()ステートメントの第2パラメータを計算します。
  9. 渡す必要があり、誤ったlcd_write(0);を(置き換え、それは流出しないようにページの右端が
  10. は可読性
  11. のためなど、カンマの後に、セミコロンの後に、括弧の内側に、適切な水平方向の間隔を使用していますfor()文を破ります今lcd_write('0');

と、提案されたコードの文字、ではない整数):

char *cylinder_types[] = 
{ 
    "Blk", 
    "Wht", 
    "Stl", 
    "Alu", 
    "Err" 
}; 


int main(void) 
{ 
    for(int i=0; 
     i < sizeof(cylinder_types)/sizeof(char *); 
     i++) 
    { 
     lcd_write('0'); 
     lcd_position(lcd_TopLine, 1); 
     lcd_string("SORTED:"); 
     lcd_string(cylinder_types[i]); 
     lcd_write(':'); 
     lcd_write_Num_8(drop_number[i]); 

     lcd_position(lcd_BotLine, 1); 
     lcd_string("UNSORTED:"); 
     lcd_string(cylinder_types[i]); 
     lcd_write(':'); 
     lcd_write_Num_8(queued_number[i]); 

     mTimer(5000); 
    } 
} 
関連する問題