+ -
当前位置:首页 → 问答吧 → 各位大牛,救命啊。。time_t could not be resolved

各位大牛,救命啊。。time_t could not be resolved

时间:2011-11-17

来源:互联网

额,学习C++了,超级菜鸟,欢迎各位大牛拍砖,您拍的越厉害,额越高兴!
闲来无事,去网上找了点C++的源代码来看,发现John Burkardt的主页上有好多,这人应该是一大牛吧。他不仅有许多自己的源代码,亦还整理了许多其它人的源代码。并且这些源代码难度都不大,还都配有详尽的解释,真好啊!
down了一个用来发掘一个字符串中潜在单词的小软件的源代码——anagram.C,感觉有些难度,准备压后再看。
down了一个用来执行日历提醒的软件my-calendar的源代码,它通过读取一个calendar文本文件来提醒当日或者未来几日的重要事件。
这个相对来说简单一点。
花了一下午,一晚上的时间也仅仅搞懂了其子函数的运作方式,能够将其编译完成,并成功运行了。
但是对于其main程序的运行逻辑还是云里雾里,看来只能等明天再接着解读了。嗨,这效率还真不是很高的说啊。
基础知识掌握的不好也是一个很重要的原因。但正是感觉已经看完了谭老师的那本书,对于C++的大貌有些具体的了解了,读《C++ Primer》与《C++: The Complete Reference》这两本书呢,前者读起来感觉太纠结于细节了,不适合于我现有的学习阶段,后者呢读起来感觉太慢是一,程序又过于浅显了,不能快速的进阶。
故起了读一些相对复杂一些的小程序,贴近实际应用,能够遂行一定实际功能的小程序,对于不懂的知识点再回来翻教科书,应该相对来说会大大提高学习速度的吧。
研究起来相对于教科书上那泛泛的书本化的例子,也更有趣味,更有成就感。
研究my-calendar这个小程序的过程中,发现了一个ctime库, 从名字看来,显然,它是一个继承自C语言的时间库。

在提取时间的过程中,子函数中设定了一个结构体struct tm *tm;没太搞懂。size_t len;这个搞懂了。一个time_t;这个又搞不懂了。其中tm的输出为一堆16进制数,now的输出为一堆无规则数,不过now一直是递增的,所以它应够是一个时间的某种表示形式,但是我还不会解码。

now = time ( NULL );
tm = localtime ( &now );
len = strftime ( time_buffer, TIME_SIZE, "%d %B %Y %I:%M:%S %p", tm );
这三句结合起来能够给出规则格式的时间。
第三句通过man,已经懂了即是将tm中的时间格式化后输出给time_buffer,第二句中的tm是一堆十六进制数,所以strftime应该就是从中解读出的时间。
擦,又找了一下man,结果发现localtime的作用是找出now时间与1970年1月1号0点整所差的秒数。晕菜。
明天再接着研究吧。 明天得提高点效率了。

还发现了一点就是如果有库函数不了解含义的话,man竟然也能帮着解决,太牛了。
越来越喜欢linux了。
程序的结构
1. include包含头文件
2. using namespace std;
3. 进行函数的声明(包括main函数)
4. main函数

程序中经过验证,发现__DATE__与__TIME__两个变量为程序预定义的变量,为程序编译进行的日期与时间。可直接引用,采用date_time程序验证。

程序中在timestamp子程序与main主程序中均使用了系统时间的获取程序段:

# include <iostream>
# define TIME_SIZE 40
# define DMAX 100
// 此处提取系统时间不许要添加ctime头文件。居然自己就可以调用,不依赖任何其它文件,太神奇了.
// 额,发现了。 iostream头文件还是必不可少的,因为在后期定义size_t与time_t文件类型的时候必须要用到这个头文件。strftime函数竟然也包含在这个头文件中,我还以为是在cstring头文件中呢。
using namespace std;

int main()
{

int daynum[DMAX];
int monnum[DMAX];
int yearnum[DMAX];
int wdaynum;
static char time_buffer[40];
// 下面这个tm结构体应该是系统默认的,我去掉iostream头文件也没有报错,所以应够是系统默认的。
// 嗯,定义了一个loctim的结构体指针。
const struct tm *loctim;
size_t len; // 这个就是一个size_t类型的变量,专门用无符整形来存储长度。
time_t systim; // 这个吗,应该跟size_t相同,不过应够是专门用来存储系统时间的变量。不过我输出看了一下,发现是一个莫名奇妙的十进制数,搞不懂。(后来又认真算了一下,发现竟然是现在时间距1970年1月1日0时整的秒数,晕菜,1970年1月1日0时是个啥时间啊?改天查查。

//
// Get the system time.
// 下面这个time函数应够就是获取那个奇妙的秒数了。
systim = time ( NULL );
//
// Convert system time to local time.
//
// localtime 函数
// Purpose: Translate the num of seconds to a time struct.
// Input: Address of the variable of the num of seconds.
// Output: Address of the time struct constructed by the function of localtime.
loctim = localtime ( &systim );
//
// Pick out useful items from the local time structure.
//
//下面这些应够是tm这个结构体中的一些功能函数了,分别用来获取当天的日,月,年,星期几等等。
daynum[0] = (*loctim).tm_mday;
monnum[0] = (*loctim).tm_mon + 1;
yearnum[0] = 1900 + (*loctim).tm_year;

wdaynum = (*loctim).tm_wday;

// 下面这一函数strftime竟然是存在于iostream这个头文件中,再次奇怪一下。它的作用就死将tm这个结构体中日期转变为time_buffer中的格式化的可读日期。
len = strftime ( time_buffer, TIME_SIZE, "%d %B %Y %I:%M:%S %p", loctim );

cout << time_buffer << "\n";

return 0;
}




calendar中用来解析命令行的子程序

说明: argc “argument counter” 储存命令行中参数的个数: eg. my_calendar -N 3 此时argc = 3.
argv “argument array“ 用于储存命令行参数的一个字符数组 依旧为上例, argv[1]中储存的是my_calendar, argv[2]中储存的是-N,依次类推。


bool parse_command_line ( int argc, char *argv[], int *lookahead )

// Parameters:
//
// Input, int ARGC, the command line argument counter.
//
// Input, char *ARGV[], the command line argument array.
//
// Output, int *LOOKAHEAD, the calendar lookahead, if specified.
//
// Output, bool PARSE_COMMAND_LINE, is true if there was no error.
{
//
// This macro sets the character pointer x to the address of the string
// containing the parameter's argument. The argument may be specified as
// either: -xargument or -x argument.
//
while ( --argc > 0 && **++argv == '-' )
/*--上面这句话用来判断调用my_calendar程序的命令行不止具有一个参数,且第二个参数的第一个字符是"-",这个指针真是难懂啊,到现在也没搞明白其实现原理,只是大概明白了是表示这个意思而已,其实此处**++argv写成(*argv)[0]也可以。--*/
{
switch( (*argv)[1] )
// 判定一下-的下一个字符是n,或者N。n的话就不作用,N吗,请继续往下看。
{
//
// N: Specifying number of days of lookahead.
//
case 'n':
case 'N':

if ( (*argv)[2] )
// 如果是N,而且N的下一个字符不为空,类似于这种格式”-N5”,那么就直接把“-N5”这个字符数组中的除前两个字符中的所有字符以整形(%d)的形式赋值给lookahead。呃,这里的这个+2还真是邪恶啊,让哥老半天没理解。找man,也没发现上面写着这个参数啊。只好自己实验,最后才得出了上面的结论。
{
sscanf ( (*argv)+2, "%d", lookahead );

}
else if ( argc > 1 )
// 然后是第二种情况,当第二个字符数组中只有-N时,那么请检查是否存在第三个数组吧,如果存在的话,就直接将第三个数组中的东东整形赋值给lookahead吧。但这个地方假如第三个数组是字母不是数字呢? 会不会是一个bug呢?试验一下。额,程序没有报错,但是程序依旧当作没有参数处理了,接着研究,看这个地方是怎么容错的。
{
argc = argc - 1;
argv = argv + 1;
sscanf ( *argv, "%d", lookahead );
}

break;

default:
cout << "\n";
cout << "CALENDAR - Fatal error!\n";
cout << " Invalid arguments.\n";
return false;
}
}

return true;
}
/
附件:
文件注释: my_calendar的源代码
my_calendar.C [13.12 KiB]
还未被下载

作者: yonpana   发布时间: 2011-11-17

lz好认真...

同学习c++,就是没那么多精力...

作者: phoenixlzx   发布时间: 2011-11-17

整天闲的蛋疼,找点事儿来做,不至于闷的慌,还防止得老年痴呆,:-)!

作者: yonpana   发布时间: 2011-11-17

热门下载

更多