Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Keil中的结构链表出错_C_Struct_Embedded_Keil_8051 - Fatal编程技术网

C Keil中的结构链表出错

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

我正在做我的一个项目,下面我发布的代码在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中完美地运行

  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 If
main(…)
位于不同的文件中。您应该在头文件中定义结构,并将其包含在两个文件中,否则请确保在主函数之前定义结构。我通常喜欢将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'Is
main()附近的语法错误
switc
定义在同一个文件中,或者这两个代码段来自不同的文件?main_menu()是一个菜单函数,我问的是
main
从何处获得语法错误消息。Yup int main()是主程序运行时开始的地方。