Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.19;
Скачать: 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 вся ветка

Текущий архив: 2006.03.19;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.037 c
10-1115290907
Santyago
2005-05-05 15:01
2006.03.19
Как в Excel документе можно определить конец файла


5-1127376826
LLIR
2005-09-22 12:13
2006.03.19
компонент в dll-библиотеке


8-1129426196
Allocator
2005-10-16 05:29
2006.03.19
SampleGraber 2 AVI - DSPack


1-1139925539
BFG9k
2006-02-14 16:58
2006.03.19
Событие с несколькими обработчиками


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