不能让C方法icalrecur_expand_recurrence工作

时间:2013-02-12 15:02:12

标签: c rrule libical

这有点令人沮丧。我一直在研究这个问题已经有一段时间了,我似乎无法像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

2 个答案:

答案 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)