这有点令人沮丧。我已经在这上面工作了一段时间了,我似乎不能让这个方法像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,所以我甚至不需要包含整个ical库。
~: ./hello
Segmentation fault任何时候我改变任何指针,它都会在编译过程中开始抱怨一些东西。有人能让它工作吗??源文件来自Marketcircle on github。
发布于 2013-02-12 23:08:55
看看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并返回它,这也是没有意义的-同样,打开编译器警告-让编译器帮助你找到并修复错误。发布于 2014-09-15 19:51:11
现在您可以使用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)https://stackoverflow.com/questions/14835443
复制相似问题