首页 > 解决方案 > 由于未知的参考错误,程序无法运行

问题描述

我创建了这个程序。但是它不起作用。它显示了 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)。除此之外,编译器显示所有函数都具有未定义的引用。

标签: c

解决方案


您在内部定义了函数mt()

使用更好的缩进方法更容易发现这类问题。

void mt(void) {
    //code
    void prd(void) {
         //code
     }
}

推荐阅读