C Keil中的结构链表出错
我正在做我的一个项目,下面我发布的代码在devc中成功运行,并完成了O/p。然而,Keil正在吐出错误,不幸的是,我无法确定这些错误 一些样本: 8051TEST.C(322):警告C198:sizeof返回零 8051TEST.C(324):错误C230:“switc”:未知的struct/union/enum标记 8051TEST.C(324):错误C204:“s0”:未定义的成员 8051TEST.C(325):错误C230:“switc”:未知的struct/union/enum标记 8051TEST.C(325):错误C204:“s1”:未定义的成员 8051TEST.C(326):错误C230:“switc”:未知的struct/union/enum标记 我真的想要一双新鲜的眼睛 谢谢, 奥雷利乌斯 我的int main()已按要求完成。有点混乱,所以请提前道歉。整个过程在devc中完美地运行C Keil中的结构链表出错,c,struct,embedded,keil,8051,C,Struct,Embedded,Keil,8051,我正在做我的一个项目,下面我发布的代码在devc中成功运行,并完成了O/p。然而,Keil正在吐出错误,不幸的是,我无法确定这些错误 一些样本: 8051TEST.C(322):警告C198:sizeof返回零 8051TEST.C(324):错误C230:“switc”:未知的struct/union/enum标记 8051TEST.C(324):错误C204:“s0”:未定义的成员 8051TEST.C(325):错误C230:“switc”:未知的struct/union/enum标记 8
int main()
{
Lcd4_Init();
Lcd4_Clear();
switc *s1, *s2, *s3, *s4, *s5, *s6 , *s7;
int id1[5],id2[5],id3[5],id4[5],id5[5],id6[5],id7[5],pos=3;
int cd1[7],cd2[7],cd3[7],cd4[7],cd5[7],cd6[7],sw1=0,sw2=0,sw3=0,sw4=0,sw5=0,
sw6=0,s
w7=0,card=0,menu=0,n=7;
int *cd7=(int *)malloc(n * sizeof(int));
M:menu=main_menu();
if(menu==1)//menu to monitor functions
{
confsel();
goto M;
}
//assign number to card based on option selected.
if(menu==2){
card=cardsel();
}
if(menu==3)//Mini info guide
{
printf("\nPCB for 6x8 through(SW 1,2,3,4,5,7) + 1x11 through(SW 6) ROTARY SWITCH(s).\n");
printf("\nSwitch LAYER(s) by 1:8 and 1:16 DEMUX.\n");
printf("\nTRIGGER to DEMUX(s) by 8255A-5 PPI.\n");
printf("\nAT89C51RD2 powering device.\n");
printf("\nEnter card when PROMPTED.\n");
printf("\nCOOLING FAN provided.\n");
printf("\nPOTENTIOMETER P(1-5) must be ANTI-CLOCKWISE.\n");
goto M;
}
switch(card)
{
case 1:
printf("Power Card assigned\n");
memcpy(cd1,&pcard,sizeof(cd1));
sw1=cd1[0];
sw2=cd1[1];
sw3=cd1[2];
sw4=cd1[3];
sw5=cd1[4];
sw6=cd1[5];
sw7=cd1[6];
break;
case 2:
printf("Firing Card assigned\n");
memcpy(cd2,&fcard,sizeof(cd2));
sw1=cd2[0];
sw2=cd2[1];
sw3=cd2[2];
sw4=cd2[3];
sw5=cd2[4];
sw6=cd2[5];
sw7=cd2[6];
break;
case 3:
printf("Const. Curr. Card assigned\n");
memcpy(cd3,&c1card,sizeof(cd3));
sw1=cd3[0];
sw2=cd3[1];
sw3=cd3[2];
sw4=cd3[3];
sw5=cd3[4];
sw6=cd3[5];
sw7=cd3[6];
break;
case 4:
printf("Const. Curr. 2 Card assigned\n");
memcpy(cd4,&c2card,sizeof(cd4));
sw1=cd4[0];
sw2=cd4[1];
sw3=cd4[2];
sw4=cd4[3];
sw5=cd4[4];
sw6=cd4[5];
sw7=cd4[6];
break;
case 5:
printf("Amplifier Card assigned\n");
memcpy(cd5,&acard,sizeof(cd5));
sw1=cd5[0];
sw2=cd5[1];
sw3=cd5[2];
sw4=cd5[3];
sw5=cd5[4];
sw6=cd5[5];
sw7=cd5[6];
break;
case 6:
printf("NC (ATM) Card assigned\n");
memcpy(cd6,&nccard,sizeof(cd6));
sw1=cd6[0];
sw2=cd6[1];
sw3=cd6[2];
sw4=cd6[3];
sw5=cd6[4];
sw6=cd6[5];
sw7=cd6[6];
break;
case 7:
printf("Custom Card assigned\n");
incdec(cd7,n);//function to extract values to cd7[]
struct newcard *c1;
c1=createcard(c1,*(cd7 + 0),*(cd7 + 1),*(cd7 + 2),*(cd7 + 3),*(cd7 + 4),*(cd7 + 5),*(cd7 + 6));
sw1=c1->pos_sw1;
sw2=c1->pos_sw2;
sw3=c1->pos_sw3;
sw4=c1->pos_sw4;
sw5=c1->pos_sw5;
sw6=c1->pos_sw6;
sw7=c1->pos_sw7;
break;
default:
printf("Invalid Card assigned\n");
break;
}
按需菜单子程序
int main_menu()
{
const char Main_Menu [3][11] =
{
"1.CONFIG",//TBD
"2.LOAD",//load PRELOADED_CARD or create CUSTOM_CARD
"3.INFO"//check temp/voltage/credits
};
int menu=0,j=0,i=0;
Lcd4_Set_Cursor(1,3);
M:Lcd4_Write_String("Select your option:");
Lcd4_Set_Cursor(2,4);
Lcd4_Write_String(Main_Menu[j]);
do{
if(RK==0&&j<3)//Right Key
{
j++;
if(j>=0||j<3)
{
Lcd4_Set_Cursor(2,4);
Lcd4_Write_String(Main_Menu[j]);
}
}
if(LK==0&&j>0)//Left Key
{
j--;
if(j>=0||j<3)
{
Lcd4_Set_Cursor(2,4);
Lcd4_Write_String(Main_Menu[j]);
}
}
if(UK==0)//Up Key
{
goto M;
}
if(EK==0)//Enter Key
{
if(j>=0||j<3)
{
menu=j+1;
i=1;
}
}
return menu;
}while(i!=1);
}
int主菜单()
{
常量字符主菜单[3][11]=
{
“1.CONFIG”,//待定
“2.加载”,//加载预加载的\u卡或创建自定义\u卡
“3.信息”//检查温度/电压/信用
};
int菜单=0,j=0,i=0;
Lcd4_集_光标(1,3);
M:Lcd4_Write_字符串(“选择您的选项:”);
Lcd4_集_光标(2,4);
Lcd4_写入_字符串(主菜单[j]);
做{
如果(RK==0&&j=0 | | j0)//左键
{
j--;
如果(j>=0 | | j=0 | | j当你typedef
一个结构时,你只需要名称switc
,所以要么不typedef它,要么不对变量/参数使用struct switc
。基本上cleblanc的回答提到了它,但我想说得更清楚一点
未正确使用struct和typedef的定义:
您使用的:
typedef struct /* IMPORTANT: NO TAG HERE! */
{
int s0;
int s1;
...
} switc;
定义的类型:switc
有效用法:
switc *s1, *s2, *s3, *s4, *s5, *s6 , *s7;
s1->s1 = ...;
struct switc *s;
s->s1 = ...;
switc *s1, *s2, *s3, *s4, *s5, *s6 , *s7;
s1->s1 = ...;
struct switc *s;
s->s1 = ...;
无效用法:
switc *s1, *s2, *s3, *s4, *s5, *s6 , *s7;
s1->s1 = ...;
struct switc *s;
s->s1 = ...;
switc *s1, *s2, *s3, *s4, *s5, *s6 , *s7;
s1->s1 = ...;
struct switc *s;
s->s1 = ...;
您认为您正在使用的:
typedef struct switc /* NOTE: STRUCT WITH TAG. */
{
int s0;
int s1;
...
} switc;
定义的类型:struct-switc
和switc
有效用法:
switc *s1, *s2, *s3, *s4, *s5, *s6 , *s7;
s1->s1 = ...;
struct switc *s;
s->s1 = ...;
switc *s1, *s2, *s3, *s4, *s5, *s6 , *s7;
s1->s1 = ...;
struct switc *s;
s->s1 = ...;
编辑:
对于主函数,情况不同。在这里,编译器不会抱怨未知类型的开关
。相反,编译器对函数体不满意
int main()
{
Lcd4_Init();
Lcd4_Clear();
switc *s1, *s2, *s3, *s4, *s5, *s6 , *s7;
在C99标准之前,必须将所有变量定义放在函数体的顶部。如果在一些评论中提到Keil Dev C是一种比较旧的样式,我希望它只支持K&R和C89。
(我上次使用Keil C编译器用于C16x是在2006年。当时没有C99支持。)
您首先调用一些LCD4.
函数违反了此规则。
由于之后不允许使用变量定义,因此也不允许使用类型名称
要解决此问题,只需更改行的顺序:
int main()
{
switc *s1, *s2, *s3, *s4, *s5, *s6 , *s7;
Lcd4_Init();
Lcd4_Clear();
我在int main中使用switc,如//switc*s1、*s2、*s3、*s4、*s5、*s6、*s7;但是我得到了关于错误C202的错误:“s1”:未定义identifier@aurelius我没有看到你的int main()
.Post it?@aurelius发布你的代码,而不是描述它。请阅读以下内容:和此。添加了int main()抱歉弄得一团糟,但主程序太大了。使用的微控制器是p89v51rd2。@aurelius Ifmain(…)
位于不同的文件中。您应该在头文件中定义结构,并将其包含在两个文件中,否则请确保在主函数之前定义结构。我通常喜欢将main放在文件的底部,逻辑上是这样的。struct switc
->switc
。您不能将typedef和键入struct组合在一起
显式。顺便说一句,在发布代码时,请确保正确设置格式并缩进。此代码非常不可读。很抱歉,主程序非常庞大。您的主程序()程序是否正确缩进,无论它有多长。停止传入未使用的参数,立即覆盖。只需使用局部变量即可。非常感谢您的回复。有一点小小的疑问。即使在有效使用.8051TEST.C(463)之后,我仍然会在int main()中遇到这些错误:错误C141:switc'8051TEST.C(463)附近的语法错误:错误C202:'s1':未定义标识符8051TEST.C(464):错误C141:int'8051TEST.C(464):错误C202:'id1':未定义标识符8051TEST.C(465):错误C141:int'Ismain()附近的语法错误
与switc
定义在同一个文件中,或者这两个代码段来自不同的文件?main_menu()是一个菜单函数,我问的是main
从何处获得语法错误消息。Yup int main()是主程序运行时开始的地方。