跑不掉 发表于 2024-10-10 21:37:07

结构体指针作为函数参数

求助:编译器提醒14        7        D:\code\C\homework\九\1\新文件3.cpp        [错误] 'void D(main()::Date*)', declared using local type 'main()::Date', is used but never defined [-fpermissive]
这是为什么?

#include <stdio.h>

int main()
{
        struct Date
        {
                int year;
                int month;
                int day;
        }date;
       
        struct Date *p;
        p = &date;
        void D(struct Date *p);
       
        printf("请输入年 月 日:\n");
        scanf("%d %d %d",p->year,p->month,p->day);
       
        D(p);
       
        return 0;
}

void D(struct Date *p)
{
        int i,n=0;
        for(i = 1;i < p->month;i++)
        {
               
                        switch(i)
                        {
                               
                                case 1:
                                case 3:
                                case 5:
                                case 7:
                                case 8:
                                case 10:
                                case 12:n=n+31;break;
                               case 2:n=n+28;break;
                                case 4:
                                case 6:
                                case 9:
                                case 11:n=n+30;break;
                        }
        }
       
        if(p->year%4==0&&p->year%100!=0||p->year%400==0)
        {
                n = n+1;
        }
       
        n = n+p->day;
       
        printf("%d年%d月%d日是%d年的第 %d 天\n",p->year,p->month,p->day,p->year,n);
}

FishC 发表于 2024-10-10 21:37:28

你遇到的错误是因为你在 `main` 函数中定义的 `Date` 结构体是局部类型,这意味着它的作用范围仅限于 `main` 函数内。这导致在其他地方(如 `D` 函数)无法访问到这个结构体类型。

为了修复这个问题,可以将 `Date` 结构体的定义移到函数外部,使其成为一个全局可访问的类型,像这样:

#include <stdio.h>

struct Date
{
    int year;
    int month;
    int day;
};

void D(struct Date *p);

int main()
{
    struct Date date;
    struct Date *p;

    p = &date;
   
    printf("请输入年 月 日:\n");
    scanf("%d %d %d", &p->year, &p->month, &p->day);
   
    D(p);
   
    return 0;
}

void D(struct Date *p)
{
    int i, n = 0;
    for(i = 1; i < p->month; i++)
    {
      switch(i)
      {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12: n = n + 31; break;
            case 2: n = n + 28; break;
            case 4:
            case 6:
            case 9:
            case 11: n = n + 30; break;
      }
    }
   
    if((p->year % 4 == 0 && p->year % 100 != 0) || p->year % 400 == 0)
    {
      n = n + 1;
    }
   
    n = n + p->day;
   
    printf("%d年%d月%d日是%d年的第 %d 天\n", p->year, p->month, p->day, p->year, n);
}

这里我还修正了 `scanf` 的用法,你需要传递变量的地址给 `scanf`。请注意对 `scanf` 参数的修改:`&p->year`, `&p->month`, `&p->day`。这样代码就能正确编译和运行了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 结构体指针作为函数参数