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

また、読み取り専用の文字列リテラルを、-を期待する関数に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それを返そうとしているので、これも意味がありません。コンパイラの警告をオンにして、間違いを見つけて修正できるようにします。

于 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 に答える