我编写了一个程序,该程序从一个包含一个月左右信息的简单结构逐渐发展为包含 12 个非闰年相同信息结构的数组。现在,我试图包含一个函数,“当给定月份数时,返回一年中的总天数,直到包括那个月。假设问题 3 的结构模板和此类结构的适当数组已声明外部。”
当我按下运行时,出现两个错误,我都不理解。他们来了: “体系结构 x86_64 的 undefined symbol : “_months”,引用自: main.o 中的_days ld: 找不到体系结构 x86_64 的符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)”
非常感谢任何帮助,谢谢。
#include <stdio.h>
int days(int monthnum);
struct month {
char name[10];
char abbreviaton[4];
int days;
int monthnum;
};
int main(void)
{
struct month months[12] = {
{"January", "Jan", 31, 1},
{"February", "Feb", 28, 2},
{"March", "Mar", 31, 3},
{"April", "Apr", 30, 4},
{"May", "May", 31, 5},
{"June", "Jun", 30, 6},
{"July", "Jul", 31, 7},
{"August", "Aug", 31, 8},
{"September", "Sep", 30, 9},
{"October", "Oct", 31, 10},
{"November", "Nov", 30, 11},
{"December", "Dec", 31, 12},
};
struct month *sign;
sign = &months[12];
days(months[12].monthnum);
return 0;
}
extern struct month months[12];
int days(int monthnum)
{
int index, total;
if (monthnum < 1 || monthnum > 12)
return(-1);
else
{
for (index = 0, total = 0; index < monthnum; index++)
total += months[index].days;
return(total);
}
}
这是我现在的代码。该程序有效:
#include <stdio.h>
int days(int monthnum);
struct month {
char name[10];
char abbreviaton[4];
int days;
int monthnum;
};
struct month months[12] = {
{"January", "Jan", 31, 1},
{"February", "Feb", 28, 2},
{"March", "Mar", 31, 3},
{"April", "Apr", 30, 4},
{"May", "May", 31, 5},
{"June", "Jun", 30, 6},
{"July", "Jul", 31, 7},
{"August", "Aug", 31, 8},
{"September", "Sep", 30, 9},
{"October", "Oct", 31, 10},
{"November", "Nov", 30, 11},
{"December", "Dec", 31, 12},
};
int main(void)
{
int value;
int count = 0;
struct month *sign;
sign = &months;
printf("Enter month number: ");
scanf("%d", &months[count].monthnum);
value = days(sign->monthnum);
printf("%d", value);
return 0;
}
extern struct month months[];
int days(int monthnum)
{
int index, total;
if (monthnum < 1 || monthnum > 12)
return(-1);
else
{
for (index = 0, total = 0; index < monthnum; index++)
total += months[index].days;
return(total);
}
}
最佳答案
眼前的问题是由于这一行;
extern struct month months[12];
这里没有引用数组定义; months
是在 main
中声明的,没有其他地方。摆脱那条线。
接下来你有逻辑问题:
days(months[12].monthnum);
你已经超出了数组的边界。数组是 0 索引的,即十二个元素的数组包含有效索引 0-11。 12 太远了。
顺便说一句,当您显式初始化每个元素时,您不需要指定数组的维数。只需使用:
struct month months[] = {
{"January", "Jan", 31, 1},
{"February", "Feb", 28, 2},
{"March", "Mar", 31, 3},
{"April", "Apr", 30, 4},
{"May", "May", 31, 5},
{"June", "Jun", 30, 6},
{"July", "Jul", 31, 7},
{"August", "Aug", 31, 8},
{"September", "Sep", 30, 9},
{"October", "Oct", 31, 10},
{"November", "Nov", 30, 11},
{"December", "Dec", 31, 12},
};
编译器知道有十二个元素,因为你这样告诉它。现在,当/如果您添加或删除元素时,您不必更改维度。
下一个问题;可变范围。您在 days
函数中有这个:
total += months[index].days;
嗯,days
无法访问 months
,因为 months
是 main
的局部变量。您需要研究和理解变量作用域。
关于c - 为什么我的 C 程序使用一个函数来计算一年中的月份总数会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15630135/