【发布时间】:2018-05-08 20:04:28
【问题描述】:
我有一些代码可以计算上一次满月发生的时间。
int humanreadable(seconds){
time_t now=seconds;
struct tm ts;
char buf[80];
ts = *localtime(&now);
strftime(buf, sizeof(buf), "%Y %m %d", &ts);
printf("%s\n", buf); // Works correctly, returns "2016 12 14", not needed, only used to for a check
int prevY = &ts.tm_year+1900;
int prevM = &ts.tm_mon+1;
int prevD = &ts.tm_mday;
printf("%d %d %d\n", prevY,prevM,prevD); // Does not work, returns random numbers
//later add return prevY/prevM/prevD pointers so I can pass them on
return 0;
}
int prevFullMoon ( int y, int m, int d){ // int * prevY, int * prevM, int * prevD){//temporarely disabled pointers, later need to add them back so assert in main works
if(valid_date(y,m,d)==INVALID_DATE){
return valid_date(y,m,d);
}
int tmp=epoch(y,m,d);
while (isFullMoonEpochCheck(tmp)!=1) {
tmp=tmp-ONE_DAY;
}
humanreadable(tmp);
return 1;
}
int main ( int argc, char * argv [] )
{
prevFullMoon( 2017, 1, 11); //temporary code to check what it is returning
//assert ( prevFullMoon ( 2017, 1, 11, &y, &m, &d ) == 1 && y == 2016 && m == 12 && d == 14 ); //this needs to pass
}
我有一个问题,我的“人类可读”函数没有打印我需要的年、月和日。当我打印“buf”变量时,它会正确返回日期,但我需要三个单独变量中的日期,以便我可以从“prevFullMoon”函数传递它们。
如果您在代码中阅读了我的 cmets,您应该了解正在发生的事情以及我想要实现的目标。
我在结构和指针方面很迷茫,因此感谢任何帮助。
附言。在这个线程中,我主要想知道为什么我的时间转换不起作用,但如果您愿意帮助我解决指针并传递 prevY、prevM 和 prevD,我将不胜感激。
谢谢
【问题讨论】:
-
弄清楚您想要什么以及问题的具体性质的责任在于您,而不是读者。
-
struct tm ts; .... int prevY = &ts.tm_year+1900;应该发出警告并为您保存关于 SO 的帖子。启用编译器警告并节省时间。 -
第二个提示:“函数不打印我需要的年、月和日”和
ts = *localtime(&now); strftime(...是两个首先应该检查其返回值的函数。 -
这甚至不能编译,除非你有一个严重损坏的编译器。 :F 或者默认为 28 岁的 C 标准的东西。编译器需要为此吐出 5 条诊断消息,但我在问题中没有看到它们