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