Указатели возвращаются из функции dll при вызове из rebol

Я пытаюсь выяснить погоду, я могу использовать ребол для нескольких задач по программированию. Я написал небольшую программу, которая загружает внешнюю библиотеку и вызывает функцию, которая возвращает указатели в некоторых аргументах. Когда я запускаю программу, происходит сбой rebol.exe. Я надеюсь, что кто-нибудь сможет мне помочь. Функция dll выглядит следующим образом:

void xxx swe_utc_time_zone(int32 iyear, int32 imonth, int32 iday, 
int32 ihour, int32 imin, double dsec, double dtimezone, 
int32 *iyear_utc, int32 *imonth_utc, int32 *iday_utc, 
int32 *ihour_utc, int32 *imin_utc, double *dsec_utc)

а это моя небольшая тестовая программа:

rebol []
astrology-lib: load/library %/c/sweph/bin/swedll32.dll
swe-utc-time-zone: make routine! [
   iyear [integer!]
   imonth [integer!]
   iday [integer!]
   ihour [integer!]
   iminute [integer!]
   dsec [decimal!]
   dtimezone [decimal!]
   iyear-utc [char*]
   imonth-utc [char*]
   iday-utc [char*]
   ihour-utc [char*]
   iminute-utc [char*]
   dsec-utc [char*]
] astrology-lib "_swe_utc_time_zone@60"
swe-utc-time-zone 2015 6 20 0 19 0 -4.5 none none none none none none

Программа вылетает в последней строке, где я пытаюсь вызвать функцию. Сообщение об ошибке: «REBOL / View system перестала работать».


person user1897830    schedule 19.06.2015    source источник
comment
Здесь есть еще несколько примеров обращения к библиотекам re-bol.com /rebol.html#section-9.8   -  person johnk    schedule 20.06.2015
comment
@johnk Там нет ничего, что использует параметры указателя, и я чувствую, что именно в этом и заключается ошибка.   -  person user1897830    schedule 20.06.2015
comment
Звездочки предсказывают более интересную удачу с реализацией FFI (интерфейс внешних функций) для ROUTINE! это находится в форке Rebol3 от Atronix. (Также rebol3 имеет открытый исходный код, и у него более вероятное будущее.) Я мало что знаю об этом, но тестовый файл здесь, и вы можете спросить их, есть ли у вас проблемы. Страница загрузки См. также: Красный   -  person HostileFork says dont trust SE    schedule 20.06.2015


Ответы (1)


Вы должны предоставить память по крайней мере того же размера, что и указатель, который вы хотите получить от вашего вызова.

Поэтому вместо none вы должны использовать слова, инициализированные чем-то в строке

iyear-utc: make struct! [
    point [integer!]
] none

Возможно, эти ссылки дадут вам дополнительную помощь по адресу, конверсии, больше конверсий

person sqlab    schedule 22.06.2015