0

这有点令人沮丧。我已经为此工作了一段时间,但我似乎无法让这种方法像它所说的那样工作。

#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

4

2 回答 2

1

查看文档,您似乎有一个不需要的额外间接级别 - 您需要更改:

    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);

此外,您将只读字符串文字传递给需要 a 的函数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));
    

    所有这些演员都是“代码味道”,这应该告诉你你在这里做错了什么

  • 你的函数被定义为返回 a int,但是你试图将你的数组转换为 atime_t并返回它,这也是没有意义的——再次打开编译器警告——让编译器帮助你找到并修复你的错误。

于 2013-02-12T15:08:54.657 回答
0

现在您可以将此扩展用于 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)
于 2014-09-15T11:51:11.297 回答