c - 由于未知的参考错误,程序无法运行
问题描述
我创建了这个程序。但是它不起作用。它显示了 main 中 switch case 中 mt(void) 函数之后所有函数的未定义引用错误。我哪里错了?
#include<stdio.h>
#include<string.h>
void mt(void);
void prd(void);
void dry(void);
void cng(void);
void nf(void);
struct grocery
{
char cat;
};
struct meat
{
char name1[20];
int cost1;
char typ;
int pckgm;
int pckyr;
int expyr;
int expm;
} m1;
struct produce
{
char name2[20];
int cost2;
char typ2;
int recd;
int recm;
} p1;
struct dairy
{
char name3[20];
int cost3;
int month;
int date;
} d1;
struct cg
{
char name4[20];
int cost4;
int expimon;
int expiday;
int aislenum;
char aisleside;
} cg1;
struct non
{
char name5[20];
int cost5;
char categ;
int anum;
char aside;
} n1;
int main()
{
struct grocery g1;
printf("Enter Category:");
scanf(" %c",&g1.cat);
switch(g1.cat)
{
case 'M':
mt();
break;
case 'P':
prd();
break;
case 'D':
dry();
break;
case 'C':
cng();
break;
case 'N':
nf();
break;
default:
printf("Invalid");
main();
}
return 0;
}
void mt(void)
{
printf("Enter Category of Meat:");
scanf(" %c",&m1.typ);
switch(m1.typ)
{
case 'R':
printf("Enter Name of item:");
scanf("%s",&m1.name1[20]);
printf("Enter Cost:");
scanf("%d",&m1.cost1);
printf("Enter Packaging Month:");
scanf("%d",&m1.pckgm);
printf("Enter Packaging Year:");
scanf("%d",&m1.pckyr);
printf("Enter Expiry Month:");
scanf("%d",&m1.expm);
printf("Enter Expiry Year:");
scanf("%d",&m1.expyr);
printf("Red Meat cost %d cents, packaged in %d %d, expires in %d %d.",m1.cost1,m1.pckgm,m1.pckyr,m1.expm,m1.expyr);
break;
case 'P':
printf("Enter Name of item:");
scanf("%s",&m1.name1[20]);
printf("Enter Cost:");
scanf("%d",&m1.cost1);
printf("Enter Packaging Month:");
scanf("%d",&m1.pckgm);
printf("Enter Packaging Year:");
scanf("%d",&m1.pckyr);
printf("Enter Expiry Month:");
scanf("%d",&m1.expm);
printf("Enter Expiry Year:");
scanf("%d",&m1.expyr);
printf("Poultry Meat cost %d cents, packaged in %d %d, expires in %d %d.",m1.cost1,m1.pckgm,m1.pckyr,m1.expm,m1.expyr);
break;
case 'F':
printf("Enter Name of item:");
scanf("%s",&m1.name1[20]);
printf("Enter Cost:");
scanf("%d",&m1.cost1);
printf("Enter Packaging Month:");
scanf("%d",&m1.pckgm);
printf("Enter Packaging Year:");
scanf("%d",&m1.pckyr);
printf("Enter Expiry Month:");
scanf("%d",&m1.expm);
printf("Enter Expiry Year:");
scanf("%d",&m1.expyr);
printf("Fish Meat cost %d cents, packaged in %d %d, expires in %d %d.",m1.cost1,m1.pckgm,m1.pckyr,m1.expm,m1.expyr);
break;
default:
printf("Invalid");
mt();
}
void prd(void)
{
printf("Enter Category:");
scanf("%c",&p1.typ2);
switch(p1.typ2)
{
case 'F':
printf("Enter Name of item:");
scanf("%s",&p1.name2[20]);
printf("Enter Cost:");
scanf("%d",&p1.cost2);
printf("Enter Receiving Month:");
scanf("%d",&p1.recm);
printf("Enter Receiving Day:");
scanf("%d",&p1.recd);
printf("Fruit cost %d cents,received on %d %d",p1.cost2,p1.recd,p1.recm);
break;
case 'V':
printf("Enter Name of item:");
scanf("%s",&p1.name2[20]);
printf("Enter Cost:");
scanf("%d",&p1.cost2);
printf("Enter Receiving Month:");
scanf("%d",&p1.recm);
printf("Enter Receiving Day:");
scanf("%d",&p1.recd);
printf("Vegetable cost %d cents,received on %d %d",p1.cost2,p1.recd,p1.recm);
break;
default:
printf("Invalid");
prd();
}
}
void dry(void)
{
printf("Enter Name:");
scanf("%s",&d1.name3[20]);
printf("Enter Cost:");
scanf("%d",&d1.cost3);
printf("Enter Expiration Day:");
scanf("%d",&d1.date);
printf("Enter Expiration Month:");
scanf("%d",&d1.month);
printf("Dairy cost %d cents, expires on %d %d",d1.cost3,d1.date,d1.month);
}
void cng(void)
{
printf("Enter Name:");
scanf("%s",&cg1.name4[20]);
printf("Enter Cost:");
scanf("%d",&cg1.cost4);
printf("Enter Expiration Date:");
scanf("%d",&cg1.expiday);
printf("Enter Expiration Month:");
scanf("%d",&cg1.expimon);
printf("Enter Aisle Number:");
scanf("%d",&cg1.aislenum);
printf("Enter Aisle Side:");
scanf(" %c",&cg1.aisleside);
printf("canned cost %d cents, expires on %d %d, displayed in aisle %d
%c",cg1.cost4,cg1.expiday,cg1.expimon,cg1.aislenum,cg1.aisleside);
}
void nf(void)
{
printf("Enter Category:");
scanf(" %c",&n1.categ);
switch(n1.categ)
{
case 'C':
printf("Enter Name:");
scanf("%s",&n1.name5[20]);
printf("Enter Cost:");
scanf("%d",&n1.cost5);
printf("Enter Aisle Number:");
scanf("%d",&n1.anum);
printf("Enter Aisle Side:");
scanf("%c",&n1.aside);
printf("Cleaning Product cost %d cents, placed on aisle %d %c",n1.cost5,n1.anum,n1.aside);
break;
case 'P':
printf("Enter Name:");
scanf("%s",&n1.name5[20]);
printf("Enter Cost:");
scanf("%d",&n1.cost5);
printf("Enter Aisle Number:");
scanf("%d",&n1.anum);
printf("Enter Aisle Side:");
scanf("%c",&n1.aside);
printf("Pharmacy Product cost %d cents, placed on aisle %d %c",n1.cost5,n1.anum,n1.aside);
break;
case 'O':
printf("Enter Name:");
scanf("%s",&n1.name5[20]);
printf("Enter Cost:");
scanf("%d",&n1.cost5);
printf("Enter Aisle Number:");
scanf("%d",&n1.anum);
printf("Enter Aisle Side:");
scanf("%c",&n1.aside);
printf("Other Product cost %d cents, placed on aisle %d %c",n1.cost5,n1.anum,n1.aside);
break;
default:
printf("Invalid");
nf();
}
}
它仅适用于第一个函数,即 mt(void)。除此之外,编译器显示所有函数都具有未定义的引用。
解决方案
您在内部定义了函数mt()
。
使用更好的缩进方法更容易发现这类问题。
void mt(void) {
//code
void prd(void) {
//code
}
}
推荐阅读
- angular - 如何阻止 Visual Studio Code 在使用代码段生成的新行中添加两个空格?
- python - 非常基本的网络抓取查询,适合您的好人
- .net - 使用 Asp.Net core 3.0 打开串口时出现 UnauthorizedAccessException
- python - /usr/bin/ld: 找不到 -lpython3.6m
- php - 需要将数据从表传输到另一个模板
- flutter - 格式化飞镖文件时如何更改vscode中的飞镖行长度?
- gitlab - Gitlab安装在centos 7上没有响应
- node.js - 使用 mongoose 连接到 mongoDB:既不会触发错误也不会触发一次打开
- javascript - 为什么对象的属性未定义?
- sql-server - SQL Server:动态查询中的更改架构传输不起作用