c - 为什么我的 C 程序使用一个函数来计算一年中的月份总数会失败?

标签 c function structure

我编写了一个程序,该程序从一个包含一个月左右信息的简单结构逐渐发展为包含 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,因为 monthsmain 的局部变量。您需要研究和理解变量作用域。

关于c - 为什么我的 C 程序使用一个函数来计算一年中的月份总数会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15630135/

相关文章:

c - 指向另一个结构中的一个结构的指针,从文件中写入和读取它会产生 SegFault

c# - 在 C# 中定义可以接受大量参数的函数

php - 添加功能不适用于数据库

php - Symfony2 文件夹结构、优先级和顺序

c++ - 预编译头文件中的错误 C2512?

iphone - 动态声明函数名?

c++ - 访问多个 I2C 设备

c - 使用 C 程序获取程序标志

c - K&R 中边界有限的 qsort |排序过程不会在字符串中的下一个位置继续

c - c程序删除字符串中重复的单词