这有点令人沮丧。我一直在研究这个问题已经有一段时间了,我似乎无法像it says it does那样使用这种方法。
#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
,因此我甚至不需要包含整个库。
~: ./hello
Segmentation fault
任何时候我改变任何指针,它会在编译期间开始抱怨某事。谁能让这个上班?源文件来自Marketcircle on github。
答案 0 :(得分:1)
查看documentation您似乎有一个不需要的额外间接级别 - 您需要更改:
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
并返回它,这也没有意义 - 再次打开编译器警告 - 让编译器帮助您找到并修复您的错误。
答案 1 :(得分:0)
现在,您可以对postgresql使用this扩展名。
使用示例:
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)