Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамический массив в методе компонента [D5, Win2k, WinXP]


Vcoder ©   (2005-09-22 10:05:00) 

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

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

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

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


Vcoder   (2005-09-22 12:55:00) [1]

icWasya ©   (22.09.05 12:24) [3]

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

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


ShiFT   (2005-09-22 12:28:00) [2]

создавай тип

type
 ArrayOfByte = Array of Byte;


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

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


:)


icWasya   (2005-09-22 12:24:00) [3]

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


Vcoder   (2005-09-22 12:20:00) [4]

Объявление процедуры, использующей массив:
   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)


umbra   (2005-09-22 10:27:00) [5]


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо