【问题标题】:Function call function in C programC程序中的函数调用函数
【发布时间】:2014-09-26 05:20:48
【问题描述】:

我有一个这样的程序

#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)。如果我插入该行,程序将在我运行时出错。但是为什么会出错呢?

【问题讨论】:

  • 这是显示错误的最短完整示例吗?疑。请阅读MCVEthe more expansive blog by Matt Gemmel
  • 您可以使用以下技术使您的datecmp() 函数更简单:if (a.yyyy &lt; b.yyyy) return -1; else if (a.yyyy &gt; b.yyyy) return +1; else if (a.mm &lt; b.mm) return -1; else if (a.mm &gt; b.mm) return +1; else if (a.dd &lt; b.dd) return -1; else if (a.dd &gt; b.dd) return +1; else return 0;
  • 您确定给定日期的星期几的算法不好。每次将日期递增或递减 1 天,直到您到达已知日期(星期六 2014-08-02)是不好的。有许多更好的技术可用。即使正确实施,随着日期离您的参考日期越来越远,您的技术也会越来越慢。此外,日期名称中的“日期”通常不大写:它应该是 Sunday 而不是 SunDay
  • 谢谢,我有另一个更好的dotw函数代码。

标签: c windows date recursion time


【解决方案1】:

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

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   }

您有一个 stackoverflow,因为您在 9765 行中递归调用 datecaldotw。问题是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多