Вниз
Скачать: CL | DM;

Динамический массив в методе компонента   Найти похожие ветки 

← →
Vcoder ©   (2005-09-22 10:05) [0]

Пишу компонент - наследник TStringList. По ходу дела заюзал динамический массив - объявил как Array of byte, затем в коде делаю SetLength - и на ближайшем вызове (или выходе из) процедуры все вываливается даже не в просто ошибку, а в дизассемблер, причем по таким адресам, что сам дизассемблер не имеет туда доступа и вместо команд отображает "????".
Пробовал вставлять объявление массива:
1) В разделе var метода, где он используется;
2) В разделе var секции implementation модуля;
3) В секции private компонента -
результат один - фатальная ошибка, лишь адреса разные

Объявил массив как статический - все ОК, работает без проблем

Я понял так, что массив создается в стеке и при изменении (а именно увеличении) размера затирает адреса перехода.

Выходит, что при написании компонентов использовать динамические массивы не получится? А что же тогда использовать вместо них? TMemoryStream?


← →
umbra ©   (2005-09-22 10:27) [1]


> что при написании компонентов использовать динамические
> массивы не получится

Ничего такого я не слышал. И чего это массив в стеке создается если он - поле компонента. И вообще неясно каким образом был "заюзан" массив. Можно яснее?


← →
Vcoder ©   (2005-09-22 12:20) [2]

Объявление процедуры, использующей массив:
   procedure EncodeStr(const SrcBuf: array of byte; SrcLen: integer;
                       var DestStr: string);


Код процедуры, из которой она вызывается:
procedure TVcBase64Strings.EncodeFromStream(Stream: TStream);
var
 BufLen, WasRead : integer;
 Buf             : array of byte;
 s               : string;
begin
 Clear;

 BufLen:=(FStringLen shr 2);        // То же, что и
 BufLen:=(BufLen shl 1) + BufLen;   // BufLen:=FStringLen/4*3;

 SetLength(Buf, BufLen);

 repeat
   WasRead:=Stream.Read(Buf,BufLen);
   if WasRead>0 then begin
     EncodeStr(Buf,WasRead,s);
     Add(s);
   end;// if WasRead>0
 until WasRead<BufLen;
end;


Вот на вызове EncodeStr и происходит вылет.

ЗЫ. Здесь показан код, соответствующий первому пункту в Vcoder ©   (22.09.05 10:05)


← →
icWasya ©   (2005-09-22 12:24) [3]

вместо
WasRead:=Stream.Read(Buf,BufLen);
надо
WasRead:=Stream.Read(Buf[0],BufLen);


← →
ShiFT   (2005-09-22 12:28) [4]

создавай тип

type
 ArrayOfByte = Array of Byte;


и работай уже с ним как с Array of Byte

function NewLength( x : ArrayOfByte; i: integer): ArrayOfByte;
begin
 SetLength( x, i);
 result := x;
end;


:)


← →
Vcoder ©   (2005-09-22 12:55) [5]

icWasya ©   (22.09.05 12:24) [3]

Блин, так и знал, что решается все просто! И как я мог не сообразить, что в случае динамического массива Buf указывает не на массив, а на указатель на массив... Что-ж, бывает, тормозим...

Всем спасибо за участие. Проблема решена.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.026 c
15-1141033381
DelphiN!
2006-02-27 12:43
2006.03.19
Контроль печати на принтере


2-1141406651
Alex7
2006-03-03 20:24
2006.03.19
Перехват исключения из "Paradox"


11-1121750231
hunn
2005-07-19 09:17
2006.03.19
Работа с событиями в KOLEcmListEdit


2-1141194386
StelS
2006-03-01 09:26
2006.03.19
Справка


1-1139936640
Knight
2006-02-14 20:04
2006.03.19
Есть у кого-нить пример как заюзать сервер автоматизации mspaint?




   Наверх