Форум: "Компоненты";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
ВнизДинамический массив в методе компонента Найти похожие ветки
← →
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 Bytefunction 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 вся ветка
Форум: "Компоненты";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.021 c