LINUX.ORG.RU

Ошибка сегментации при вызове функции Chicken Scheme из Си


0

0

game.scm:

(declare (unit game))
(define-external (callin (scheme-object xyz)) void
  (print "This is 'callin': " xyz))

main.c:

extern void callin(C_word x);

void callout(int x, int y, int z)
{
  C_word *ptr = C_alloc(C_SIZEOF_LIST(3));
  C_word lst;
  printf("This is 'callout': %d, %d, %d\n", x, y, z);
  lst = C_list(&ptr, 3, C_fix(x), C_fix(y), C_fix(z));
  callin(lst);  /* Note: `callin' will have GC'd the data in `ptr' */
}

После вызова callout(1,3,9) выдает

This is 'callout': 1, 3, 9
Ошибка сегментации(core dumped)
★★

Компилирую так:

csc -c game.scm
gcc -o server server.c game.o -I/usr/local/include -L/usr/local/lib/ -lchicken

xTERM ★★
() автор топика
Ответ на: комментарий от anonymous

В chicken. Ты бы на тему сначала посмотрел.

xTERM ★★
() автор топика

Сократил до немогу, все равно не работает:

(declare (unit game))
(define-external (callin) void
  (print "This is 'callin': "))

=========================================

extern void callin();

void callout(char *x)
{
  printf("This is 'callout': %s\n", x);
  callin();
}

xTERM ★★
() автор топика

Хм... пардон, конечно, я никогда не сталкивался с Chicken Scheme, но всё же - вот ты подключаешь некий libchicken.so (или что там?), а не нужно ли перед вызовом callin вызвать некую инициализирующую функцию для данной библиотеки?

И потом, приводи полные листинги примера, которые можно проверить. Какие заголовки подключаешь в main.c?

seiken ★★★★★
()
Ответ на: комментарий от seiken

>Какие заголовки подключаешь в main.c?

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <chicken.h>

Если головной файл (main) писать на scheme, то все нормально. Скорее всего он при трансляции в Си в main'е действительно инициализирует себя. А вот эту заветную функцию я пока не нашел. Пробовал смотреть сгенерированный код, там int main() нет o_O

xTERM ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.