这有点令人沮丧。我已经做了一段时间了,我似乎无法像它所说的那样让这种方法发挥作用。
#include "icalrecur.h"
#include <time.h> /* for time() */
#include <stdio.h>
int get_occurrences(char* rrule, time_t start, int count)
{
//char* rule; /* rule string */
// *rule = PG_GETARG_CHAR(0);
time_t *result[count]; /* output array */
icalrecur_expand_recurrence(rrule, start, count, *result);
return (time_t) *result;
}
//time_t *output[5*8];
void main() {
time_t right_now = time(0);
char *_rrule = "FREQ=WEEKLY;INTERVAL=2;COUNT=8;WKST=SU;BYDAY=TU,TH";
get_occurrences(_rrule, right_now, 5);
}
我将此测试文件保存为ical_recur.h
。然后我输入bash:
gcc -I/usr/local/libical/include/libical -L/usr/local/libical/lib/ -lical -o hello ical_recur.c
包括libical.a
库。include/libical
目录中有icalrecur.h
,所以我真的不需要包含整个ical库。
~: ./hello
Segmentation fault
每当我改变任何指针时,它都会在编译过程中抱怨一些事情。有人能把它用起来吗??源文件来自github上的Marketcircle。
查看文档,您似乎有一个不需要的额外间接级别-您需要更改:
time_t *result[count]; /* output array */
icalrecur_expand_recurrence(rrule, start, count, *result);
至:
time_t result[count]; /* output array */
icalrecur_expand_recurrence(rrule, start, count, result);
此外,您将一个只读字符串文本传递给一个需要char *
的函数——这至少应该给您一个编译器警告(提示:始终使用gcc -Wall ...
,仔细阅读警告,理解并修复它们)。main()
应该更像这样:
int main() {
time_t right_now = time(0);
char _rrule[] = "FREQ=WEEKLY;INTERVAL=2;COUNT=8;WKST=SU;BYDAY=TU,TH";
get_occurrences(_rrule, right_now, 5);
return 0;
}
更多问题:
这条线没有任何有用的作用,但不清楚你想要实现什么:
char _size = (char)(((int)'0') + sizeof(result));
所有这些转换都是一种"代码气味",这应该告诉你你在这里做了一些非常错误的事情
你的函数被定义为返回
int
,但你试图将数组强制转换为time_t
并返回它,这也是没有意义的——同样,打开编译器警告——让编译器帮助你发现并修复错误。
现在您可以将此扩展用于postgresql。
示例用法:
SELECT * FROM
unnest(
rrule_get_occurrences('FREQ=WEEKLY;INTERVAL=1;WKST=MO;UNTIL=20200101T045102Z;BYDAY=SA;BYHOUR=10;BYMINUTE=51;BYSECOND=2'::rrule,
'2019-12-07 10:51:02+00'::timestamp with time zone)
);
unnest
------------------------
2019-12-07 10:51:02+00
2019-12-14 10:51:02+00
2019-12-21 10:51:02+00
2019-12-28 10:51:02+00
(4 rows)