char数组在函数中无法识别

时间:2017-11-29 20:21:05

标签: c arrays embedded string-literals

我正在为一个班级的项目工作。嵌入式C代码。 我正在尝试创建一个由全局声明的5个字符串的字符数组,因此我的LCD函数可以轻松地遍历列表。它们可以被声明为const但是现在我只是希望它可以毫无问题地构建。

问题是我在函数中遇到“未声明”错误,并且在构建时指向声明的“冲突类型”错误。声明看起来正确,但我想不是。我错过了什么? 一旦声明被整理出来,未声明的错误可能会自行解决。

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

2 个答案:

答案 0 :(得分:6)

只需将数组声明为

即可
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"
 };

如果项目中有多个编译单元,那么该数组应该在标题中声明,如

extern char * _cylinder_types[5];

并在某些模块中定义,例如

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

标题必须包含在每个模块中,其中有对数组的引用。

考虑到这个陈述

 i++;

应在while循环内。

答案 1 :(得分:0)

以下提议的代码:

  1. 尚未编译,因为它缺少(除其他外)头文件的include语句。
  2. 演示了如何在声明数组时初始化数组,而不是通过一系列赋值语句。
  3. 正确地将数组声明为字符串指针数组
  4. 使用4个空格的缩进宽度,因为它非常易读
  5. 通过一个空白行分隔代码块(for,if,else,while,while,switch,case,default)
  6. 未命名数组,从_开始,因为此类名称已被保留&#39;操作系统
  7. 允许编译器确定数组的大小
  8. 使用&#39;预处理器&#39;运营商&size;&#39; sizeof&#39;计算for()语句的第二个参数。
  9. 打破for()语句,因此它不会使页面的右边缘流失
  10. 使用适当的水平间距,内部,分号后,逗号后面等,以便于阅读
  11. lcd_write( 0 );
  12. 替换不正确的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 );
        }
    }