Здравствуйте! Для передачи динамического массива между функциями хотелось бы использовать указатели. Ниже код:
| Код | function func(mas: Pointer):boolean; var ... body_mass: Pointer; ... begin ... While Start>0 do begin body_mass:=nil; if Resident_Attribute(mas,Start,body_mass, Body_len,Attr_Len,Attr_Type) then begin ... Start:=Next_Atribute(mas,start,Attr_Len); // если есть след аттр end else if Non_Resident_Attribute(mas,Start,body_mass,run_data_list_len,Attr_Len, Real_body_Size, Alloc_Body_Size,Attr_Type) then begin ... Start:=Next_Atribute(mas,start,Attr_Len); end; FreeMem(body_mass); end;
|
функции :
| Код | function Resident_Attribute(mas: Pointer; Start_Attr_Byte: integer; var Body_Attr: Pointer; var Body_Len: integer; var Attr_Len: integer;var type_attr: integer): boolean; var b: string; Name_len, i: integer; begin ... Body_Attr:=GetMemory(Body_Len); for i := 0 to Body_Len-1 do PArray(Body_Attr)^[i]:=PArray(mas)^[Start_Attr_Byte+2*Name_len+24+i]; // тело атрибута Result:=true; end;
|
и
| Код | function Non_Resident_Attribute(mas: Pointer; Start_Attr_Byte: integer; var run_data_list: Pointer; Var run_data_list_len: integer; var Attr_Len: integer; var Real_Attr_Body_Size: int64; var Alloc_Body_Atrr_size: int64;var type_attr: integer): boolean; var b: string; i, Name_Len: integer; begin ... run_data_list:=GetMemory(run_data_list_len); for i := 0 to run_data_list_len-1 do PArray(Run_data_list)^[i]:=PArray(mas)^[Start_Attr_Byte+2*Name_len+64+i]; // косячит тут!!!! Result:=true;
|
в функциях PArray это
| Код | ТArray = array of byte; PArray = ^TArray;
|
Собственно причина моего сообщения: после 2-х успешных разов завершения функции Residen_atribute (т.е. память выделяется, массив заполняется и т.д.), прохождение функции Non_Resident завершается ошибкой связаной с обращением к недоступному участку памяти! (Строка, где ывылетает эта ошибка помечена комментарием в коде) Мб я что то не правильно делаю?:( помогите плз, а то всю голову сломал уже...
|