Страница 1 из 1

Указатель на массив указателей

Добавлено: 29 Декабрь 2005, 17:43
AnDS
Как сделать Указатель на массив указателей?

в C прототип выглядит так:
void **open_keys_array

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

Добавлено: 30 Декабрь 2005, 2:00
StillZero
как LONG, т.е. MyFunc (LONG inPtr)
указатель это по сути адрес, передашь так MyFunc(address(inPtr)), где inPtr - твой массив указателей

Добавлено: 30 Декабрь 2005, 12:46
AnDS
вот описываю функцию так:
Си-шное описание:
!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)

Добавлено: 30 Декабрь 2005, 13:52
StillZero
addr &LONG
addr_Count &LONG
addr_St &LONG
надо просто 'LONG', а не '&LONG', т.е.

addr LONG
addr_Count LONG
addr_St LONG

а вообще эти переменные лишние можно просто вызывать так:

MyFunc(address(MyArray))

и вот это еще может быть
pascal,raw
так как есть еще "C", а не "pascal"

Добавлено: 30 Декабрь 2005, 14:41
AnDS
Ну, если я описываю просто 'LONG', то как я тогда освобождать память буду потом?

Насчет C -- я сейчас попробую -- но, насколько я помню, это не помогает.

Добавлено: 31 Декабрь 2005, 4:43
StillZero
Ну, если я описываю просто 'LONG', то как я тогда освобождать память буду потом?
если ты опишешь &LONG, то это тебя не спасет :)

... отклоняясь немного от вызова си-шной процы:
сделай процу опиши в ней переменную
loc:MyVar &LONG
а на открытие окна сделай
loc:MyVar = 10
и твоя прога упадет с GPF...почему...потому что ты описал ссылку на LONG, т.е. по сути нет у тебя переменной LONG. Чтобы она появилась надо ее создать:
loc:MyVar &= new LONG
но зачем???
ну да, можно ее уничтожить потом:
dispose(loc:MyVar), это конечно же освободит память занимаемую loc:MyVar, но это всего лишь 4 байта, наивно надеяться, что если ты положишь в этот LONG адрес массива строк, то он тоже будет очищен

память, которую занимают CSTRING-и очистится сама собой в момент, который зависит от того где у тебя объявлены эти переменные, если глобально, то по завершению работы проги, если локально, то по выходу из процы

вообще можешь выложить DLL-ку, и ее описание если небольшое, после НГ посмотрю

Добавлено: 02 Январь 2006, 1:52
AnDS
Функция, которую я вызываю выделяет память, потом ее надо освободить.

Я, конечно, намудрил с описанием, согласен.
Надо описывать LONG.

И в прототипе надо бы C указывать -- во всяком случае, функция вызывется, возвращает значение (код ошибки, кстати, хотя не должна бы) и программа валится.

Если описываю как pascal -- то валится сразу, как вызываю функцию.

DLLину дал бы, но она бесполезна без ключей шифрования (это верба), а ключи, как ты сам понимаешь, дать не могу.

Самое интересеное, что некоторые функции из этой DLLины я вызываю нормально и они работают (например для расшифрования файла) -- описываю их как pascal
А вот эта функция (она память там у себя выделяет -- думаю, что проблема в этом) валится.