【问题标题】:can't get C method icalrecur_expand_recurrence to work无法让 C 方法 icalrecur_expand_recurrence 工作
【发布时间】:2013-02-12 15:02:12
【问题描述】:

这有点令人沮丧。我已经为此工作了一段时间,但我似乎无法让这种方法像 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

【问题讨论】:

    标签: c rrule libical


    【解决方案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));
      

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

    • 1234563编译器帮助您发现并修复错误。

    【讨论】:

    • ooOo 看起来开始起作用了 :) 吃我自己的话哈哈
    • 他们都这么说... ;-)
    【解决方案2】:

    现在您可以为 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)
    

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多