OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 19 Апрель, 2024 22:29

Часовой пояс: UTC + 3 часа




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

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Здравствуйте.

Вот процедура на 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;
}

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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 01 Август, 2006 12:59 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 674
Откуда: СССР
Если импортировать SYSTEM, то [untagged] ставится
и программа срабатывает, но возникаем другая проблема

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 01 Август, 2006 13:43 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Правильный заголовок процедуры:
Код:
PROCEDURE Test* (lenMomentNodes: INTEGER;
     VAR momentNodes: ARRAY [untagged] OF INTEGER): INTEGER;


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

extern "C" __stdcall...

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

PROCEDURE [ccall] Test* ...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB