OberonCore
https://forum.oberoncore.ru/

BB dll - MSVC exe передача массивов
https://forum.oberoncore.ru/viewtopic.php?f=2&t=283
Страница 1 из 1

Автор:  Kubanych [ Вторник, 01 Август, 2006 07:53 ]
Заголовок сообщения:  BB dll - MSVC exe передача массивов

Здравствуйте.

Вот процедура на BB ([untagged] после ARRAY компилятор не принимает)

PROCEDURE test*
(
lenMomentNodes:INTEGER;
VAR momentNodes:ARRAY OF INTEGER

):INTEGER;
VAR i:INTEGER;
BEGIN
FOR i :=0 TO lenMomentNodes-1 DO
momentNodes[i]:=i*2;
END;

RETURN 2
END test;

И вот вызывающая на MSVC 7 ее программа
extern "C" int __declspec(dllimport) test
(
int lenMomentNodes,
int * momentNodes
);

int _tmain(int argc, _TCHAR* argv[])
{
int i;
int a[10];

printf("%d \n\n",test(10,a));
for(i=0;i<10;i++)
{
printf(" %d \n",a[i]);
}
return 0;
}

При обращении к элементам массива программа вылетает.
Этот вопрос уже поднимался для Дельфи, но из текста форума не совсем ясно решение.

Как правильно оформить передачу параметра - массива.

Заранее благодарю.

С уважением,
Кубаныч.

Автор:  Kubanych [ Вторник, 01 Август, 2006 12:59 ]
Заголовок сообщения: 

Если импортировать SYSTEM, то [untagged] ставится
и программа срабатывает, но возникаем другая проблема

элемент массива с индексом 0 принимает не то значение, которое установили в процедуре, а результат, возвращаемый процедурой через RETURN .

Как правильно поступить?

Автор:  Илья Ермаков [ Вторник, 01 Август, 2006 13:43 ]
Заголовок сообщения: 

Правильный заголовок процедуры:
Код:
PROCEDURE Test* (lenMomentNodes: INTEGER;
     VAR momentNodes: ARRAY [untagged] OF INTEGER): INTEGER;


Однако надо учитывать, что процедуры ББ используют соглашения вызова STDCALL. Поэтому в заголовке на С нужно поставить модификатор __stdcall:

extern "C" __stdcall...

Либо наоборот, поставить в заголовке ББ модификатор [ccall]:

PROCEDURE [ccall] Test* ...

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/