Главная страница
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.045 c
15-1140624041
Loginov Dmitry
2006-02-22 19:00
2006.03.19
Вопрос по PHP


2-1141166680
MotorManayk
2006-03-01 01:44
2006.03.19
Работа с WinAPI


15-1140603184
Старик
2006-02-22 13:13
2006.03.19
Информация по FoxPro


15-1140531601
vecna
2006-02-21 17:20
2006.03.19
Windows Millennium


3-1138267273
kyn66
2006-01-26 12:21
2006.03.19
Как спрятать скроллинг по гриду ?