Как сделать Указатель на массив указателей?
в C прототип выглядит так:
void **open_keys_array
А как описать прототип в Кларионе?
Указатель на массив указателей
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
вот описываю функцию так:
Си-шное описание:
!check_file_sign_ex (char *file_name,void **open_keys_array, T32bit open_keys_quantity,P8bit count, Check_Status_Ptr *stat_array)
Описание на Кларионе:
check_file_sign_ex Procedure(*cstring file_name,long open_keys_array, long open_keys_quantity, long count, long stat_array),ushort,pascal,raw
при попытке вызвать валится в GPF -- может в описании ошибся?
Вызываю так:
F_in CSTRING(200)
open_keys_array CSTRING(305),DIM(10)
addr_keys_array LONG,DIM(10)
addr &LONG
addr_Count &LONG
addr_St &LONG
Count BYTE
Status_Array LONG
CODE
addr_keys_array[1] =address(open_keys_array[1])
addr_keys_array[2]=0
addr =address(addr_keys_array)
addr_Count =address(Count)
addr_St =address(Status_Array)
a#=check_file_sign_ex(F_in,addr,1,addr_Count,addr_St)
Си-шное описание:
!check_file_sign_ex (char *file_name,void **open_keys_array, T32bit open_keys_quantity,P8bit count, Check_Status_Ptr *stat_array)
Описание на Кларионе:
check_file_sign_ex Procedure(*cstring file_name,long open_keys_array, long open_keys_quantity, long count, long stat_array),ushort,pascal,raw
при попытке вызвать валится в GPF -- может в описании ошибся?
Вызываю так:
F_in CSTRING(200)
open_keys_array CSTRING(305),DIM(10)
addr_keys_array LONG,DIM(10)
addr &LONG
addr_Count &LONG
addr_St &LONG
Count BYTE
Status_Array LONG
CODE
addr_keys_array[1] =address(open_keys_array[1])
addr_keys_array[2]=0
addr =address(addr_keys_array)
addr_Count =address(Count)
addr_St =address(Status_Array)
a#=check_file_sign_ex(F_in,addr,1,addr_Count,addr_St)
- StillZero
- Ветеран
- Сообщения: 458
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Поблагодарили: 1 раз
- Контактная информация:
если ты опишешь &LONG, то это тебя не спасетНу, если я описываю просто 'LONG', то как я тогда освобождать память буду потом?

... отклоняясь немного от вызова си-шной процы:
сделай процу опиши в ней переменную
loc:MyVar &LONG
а на открытие окна сделай
loc:MyVar = 10
и твоя прога упадет с GPF...почему...потому что ты описал ссылку на LONG, т.е. по сути нет у тебя переменной LONG. Чтобы она появилась надо ее создать:
loc:MyVar &= new LONG
но зачем???
ну да, можно ее уничтожить потом:
dispose(loc:MyVar), это конечно же освободит память занимаемую loc:MyVar, но это всего лишь 4 байта, наивно надеяться, что если ты положишь в этот LONG адрес массива строк, то он тоже будет очищен
память, которую занимают CSTRING-и очистится сама собой в момент, который зависит от того где у тебя объявлены эти переменные, если глобально, то по завершению работы проги, если локально, то по выходу из процы
вообще можешь выложить DLL-ку, и ее описание если небольшое, после НГ посмотрю
Функция, которую я вызываю выделяет память, потом ее надо освободить.
Я, конечно, намудрил с описанием, согласен.
Надо описывать LONG.
И в прототипе надо бы C указывать -- во всяком случае, функция вызывется, возвращает значение (код ошибки, кстати, хотя не должна бы) и программа валится.
Если описываю как pascal -- то валится сразу, как вызываю функцию.
DLLину дал бы, но она бесполезна без ключей шифрования (это верба), а ключи, как ты сам понимаешь, дать не могу.
Самое интересеное, что некоторые функции из этой DLLины я вызываю нормально и они работают (например для расшифрования файла) -- описываю их как pascal
А вот эта функция (она память там у себя выделяет -- думаю, что проблема в этом) валится.
Я, конечно, намудрил с описанием, согласен.
Надо описывать LONG.
И в прототипе надо бы C указывать -- во всяком случае, функция вызывется, возвращает значение (код ошибки, кстати, хотя не должна бы) и программа валится.
Если описываю как pascal -- то валится сразу, как вызываю функцию.
DLLину дал бы, но она бесполезна без ключей шифрования (это верба), а ключи, как ты сам понимаешь, дать не могу.
Самое интересеное, что некоторые функции из этой DLLины я вызываю нормально и они работают (например для расшифрования файла) -- описываю их как pascal
А вот эта функция (она память там у себя выделяет -- думаю, что проблема в этом) валится.