Страница 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
А вот эта функция (она память там у себя выделяет -- думаю, что проблема в этом) валится.