函数中无法识别字符数组

char array not recognized in function

我正在为 class 做一个项目。嵌入式 C 代码。 我正在尝试创建一个由 5 个字符串组成的 char 数组,我在全局声明了这些字符串,这样我的 LCD 函数就可以轻松地遍历列表。它们可以声明为 const,但现在我只想让它毫无问题地构建。

问题是我在构建时不断收到函数中的 'undeclared' 错误和指向声明的 'conflicting types' 错误。声明看起来是正确的,但我想它不是。我错过了什么? 一旦声明被整理出来,未声明的错误可能会自行修复。

     // 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";

在我的 lcd.c 文件中:

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++;
}

一样声明数组
char * _cylinder_types[5];
^^^^^^ 

例如在这个表达式语句中

_cylinder_types[0] = "Blk";

字符串文字 "Blk" 隐式转换为 char *.

类型的右值

并且您不能放置这些语句

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

在任何函数之外。

例如,您可以像这样初始化数组

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

如果项目中有多个编译单元,则数组应该在header中声明,如

extern char * _cylinder_types[5];

并且在某些模块中定义为例如

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

header 必须包含在每个引用数组的模块中。

考虑到这个声明

 i++;

应在 while 循环内。

以下建议代码:

  1. 尚未编译,因为它缺少头文件的 include 语句等。
  2. 演示如何在声明数组时初始化数组,而不是通过一系列赋值语句。
  3. 正确地将数组声明为指向字符串的指针数组
  4. 使用 4 个空格的缩进宽度,因为这非常易读
  5. 通过单个空行分隔代码块(for、if、else、while、do...while、switch、case、default)
  6. 不命名数组,以 _ 开头,因为这样的名称是 OS
  7. 的 'reserved'
  8. 允许编译器确定数组的大小
  9. 使用'preprocessor'运算符'sizeof'计算for()语句的第二个参数。
  10. 中断 for() 语句,因此它不会超出页面的右边缘
  11. 使用适当的水平间距、括号内、分号后、逗号后等以提高可读性
  12. lcd_write( '0' );
  13. 替换不正确的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 );
    }
}