鱼C论坛

 找回密码
 立即注册
查看: 436|回复: 1

[已解决]结构体指针作为函数参数

[复制链接]
发表于 2024-10-10 21:37:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求助:编译器提醒
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]

这是为什么?

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         struct Date
  5.         {
  6.                 int year;
  7.                 int month;
  8.                 int day;
  9.         }date;
  10.        
  11.         struct Date *p;
  12.         p = &date;
  13.         void D(struct Date *p);
  14.        
  15.         printf("请输入年 月 日:\n");
  16.         scanf("%d %d %d",p->year,p->month,p->day);
  17.        
  18.         D(p);
  19.        
  20.         return 0;
  21. }

  22. void D(struct Date *p)
  23. {
  24.         int i,n=0;
  25.         for(i = 1;i < p->month;i++)
  26.         {
  27.                
  28.                         switch(i)
  29.                         {
  30.                                
  31.                                 case 1:
  32.                                 case 3:
  33.                                 case 5:
  34.                                 case 7:
  35.                                 case 8:
  36.                                 case 10:
  37.                                 case 12:n=n+31;break;
  38.                                  case 2:n=n+28;break;
  39.                                 case 4:
  40.                                 case 6:
  41.                                 case 9:
  42.                                 case 11:n=n+30;break;
  43.                         }
  44.         }
  45.        
  46.         if(p->year%4==0&&p->year%100!=0||p->year%400==0)
  47.         {
  48.                 n = n+1;
  49.         }
  50.        
  51.         n = n+p->day;
  52.        
  53.         printf("%d年%d月%d日是%d年的第 %d 天\n",p->year,p->month,p->day,p->year,n);
  54. }
复制代码
最佳答案
2024-10-10 21:37:28
你遇到的错误是因为你在 `main` 函数中定义的 `Date` 结构体是局部类型,这意味着它的作用范围仅限于 `main` 函数内。这导致在其他地方(如 `D` 函数)无法访问到这个结构体类型。

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

  1. #include <stdio.h>

  2. struct Date
  3. {
  4.     int year;
  5.     int month;
  6.     int day;
  7. };

  8. void D(struct Date *p);

  9. int main()
  10. {
  11.     struct Date date;
  12.     struct Date *p;

  13.     p = &date;
  14.    
  15.     printf("请输入年 月 日:\n");
  16.     scanf("%d %d %d", &p->year, &p->month, &p->day);
  17.    
  18.     D(p);
  19.    
  20.     return 0;
  21. }

  22. void D(struct Date *p)
  23. {
  24.     int i, n = 0;
  25.     for(i = 1; i < p->month; i++)
  26.     {
  27.         switch(i)
  28.         {
  29.             case 1:
  30.             case 3:
  31.             case 5:
  32.             case 7:
  33.             case 8:
  34.             case 10:
  35.             case 12: n = n + 31; break;
  36.             case 2: n = n + 28; break;
  37.             case 4:
  38.             case 6:
  39.             case 9:
  40.             case 11: n = n + 30; break;
  41.         }
  42.     }
  43.    
  44.     if((p->year % 4 == 0 && p->year % 100 != 0) || p->year % 400 == 0)
  45.     {
  46.         n = n + 1;
  47.     }
  48.    
  49.     n = n + p->day;
  50.    
  51.     printf("%d年%d月%d日是%d年的第 %d 天\n", p->year, p->month, p->day, p->year, n);
  52. }
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-10-10 21:37:28 | 显示全部楼层    本楼为最佳答案   
你遇到的错误是因为你在 `main` 函数中定义的 `Date` 结构体是局部类型,这意味着它的作用范围仅限于 `main` 函数内。这导致在其他地方(如 `D` 函数)无法访问到这个结构体类型。

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

  1. #include <stdio.h>

  2. struct Date
  3. {
  4.     int year;
  5.     int month;
  6.     int day;
  7. };

  8. void D(struct Date *p);

  9. int main()
  10. {
  11.     struct Date date;
  12.     struct Date *p;

  13.     p = &date;
  14.    
  15.     printf("请输入年 月 日:\n");
  16.     scanf("%d %d %d", &p->year, &p->month, &p->day);
  17.    
  18.     D(p);
  19.    
  20.     return 0;
  21. }

  22. void D(struct Date *p)
  23. {
  24.     int i, n = 0;
  25.     for(i = 1; i < p->month; i++)
  26.     {
  27.         switch(i)
  28.         {
  29.             case 1:
  30.             case 3:
  31.             case 5:
  32.             case 7:
  33.             case 8:
  34.             case 10:
  35.             case 12: n = n + 31; break;
  36.             case 2: n = n + 28; break;
  37.             case 4:
  38.             case 6:
  39.             case 9:
  40.             case 11: n = n + 30; break;
  41.         }
  42.     }
  43.    
  44.     if((p->year % 4 == 0 && p->year % 100 != 0) || p->year % 400 == 0)
  45.     {
  46.         n = n + 1;
  47.     }
  48.    
  49.     n = n + p->day;
  50.    
  51.     printf("%d年%d月%d日是%d年的第 %d 天\n", p->year, p->month, p->day, p->year, n);
  52. }
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 07:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表