Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.013 c
3-1138112255
HabarovSergey
2006-01-24 17:17
2006.03.19
ошибка сохранения записи(данные модифицированы).Как игнорировать?


6-1133691903
samalex
2005-12-04 13:25
2006.03.19
Сделать почтовые сообщения по-русски


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


2-1141239712
LostHero
2006-03-01 22:01
2006.03.19
TFont


2-1141077138
ArtemESC
2006-02-28 00:52
2006.03.19
Высота итема дерева...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский