c - C程序中的函数调用函数

标签 c windows date recursion time

我有一个这样的程序

#include <stdio.h>
#include <conio.h>

typedef struct {
    const char* dotw;
    int dd,mm,yyyy;
} date;

void indate(date *a);
void outdate(date a);
int datecmp(date a, date b);
int leapyear(int yyyy);
const char* dotw(date a);
date datecal(date a,int n);

int main()
{
    while (1) {
        date a;
        indate(&a);
        printf(dotw(a));
    }
    getch();
}

//print date on screen
void outdate(date a)
{
    printf("\nDay %d Month %d Year %d",a.dd,a.mm,a.yyyy);
}
//compare beetween two date
int datecmp(date a, date b)
{
        if (a.yyyy<b.yyyy||(a.yyyy==b.yyyy&&a.mm<b.mm)||(a.yyyy==b.yyyy&&a.mm==b.mm&&a.dd<b.dd)) return -1;
        else if (a.yyyy==b.yyyy&&a.mm==b.mm&&a.dd==b.dd) return 0;
        return 1;
}
//enter date
void indate(date *a)
{
    int tmp;
    printf("\nEnter Day: ");
    scanf("%d",&tmp);
    (*a).dd=tmp;
    printf("    Month: ");
    scanf("%d",&tmp);
    (*a).mm=tmp;
    printf("     Year: ");
    scanf("%d",&tmp);
    (*a).yyyy=tmp;
}
//Check for leap year
int leapyear(int yyyy)
{
    if (yyyy%4!=0||(yyyy%100==0&&yyyy%400!=0)) return 0;
    return 1;
} 
//day of the week
const char* dotw(date a)
{
    int i=0;
    const char* dayotw[]={"SaturDay","SunDay","MonDay","TuesDay","WednesDay","ThursDay","FriDay","SaturDay"};
    static date mark={"SaturDay",2,8,2014};
    if (datecmp(a,mark)==-1)
    {
        while (datecmp(datecal(a,i),mark) != 0) i++;
        return(dayotw[7-i%7]);
    }
    else
    {
        while (datecmp(datecal(mark,i),a) != 0) i++;
        return (dayotw[i%7]);
    }
}
//Which day is after n day of date a
date datecal(date a,int n)
{
    int i;
    static int Month1[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    static int Month2[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
    for (i=0;i<n;i++)
    {
        if ((a.dd+1>Month1[a.mm]&&!leapyear(a.yyyy))||(a.dd+1>Month2[a.mm]&&leapyear(a.yyyy)))
        {
            if (a.mm+1>12) 
            {
                a.yyyy+=1;
                a.mm=a.dd=1;
            }
            else
            {
                a.mm+=1;
                a.dd=1;
            }
        }
        else a.dd+=1;
    }
    a.dotw=dotw(a); **//if i insert this line, program will error while running program**
    return a;
}

查看代码末尾的a.dotw=dotw(a)。如果我插入该行,程序在运行时就会出错。但为什么会出错呢?

最佳答案

如果您使用调试器运行代码,您将看到有问题的行是这样的:

Process 89597 stopped
* thread #1: tid = 0x4598795, 0x0000000100000c06 t`datecmp(a=date at 0x00007fff5f400020, b=date at 0x00007fff5f400038) + 22 at t.c:33, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0x7fff5f3ffff8)
    frame #0: 0x0000000100000c06 t`datecmp(a=date at 0x00007fff5f400020, b=date at 0x00007fff5f400038) + 22 at t.c:33
   30   //compare beetween two date
   31   int datecmp(date a, date b)
   32   {
-> 33     if (a.yyyy<b.yyyy||(a.yyyy==b.yyyy&&a.mm<b.mm)||(a.yyyy==b.yyyy&&a.mm==b.mm&&a.dd<b.dd)) return -1;
   34     else if (a.yyyy==b.yyyy&&a.mm==b.mm&&a.dd==b.dd) return 0;
   35     return 1;
   36   }

由于您在 9765 行中递归调用 datecaldotw,因此出现了 stackoverflow。问题是:

dotw (line 65) -> datecal (line 97) -> dotw (line 65) -> datecal (line 97) -> ....

关于c - C程序中的函数调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25106753/

相关文章:

mysql - 如何在表格中显示多个两个日期之间的所有日期?

c++ - 加载到缓存时数据对齐

C++ U32 类型 header

windows - SIO_FLUSH 的行为

linux - 如何使用 Docker Desktop/Hyper-V/MobyLinuxVM 从 Windows 主机 LAN 透明访问 Linux 容器

windows - 我怎么知道 find_package() 在 cmake 中是否成功?

c - 需要帮助反转数组

c - 跳进argv?

php - 时间戳中的错误日期

javascript - 如何在 Javascript 中将常规日期转换为 unixtime?