Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2014, 17:41   #1
varich
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 22
По умолчанию TStream to TStrings error

возникла необходимость читать строки из TStream. вот ф-я, которая должна это делать.
Код:
 type pstream= ^tstream; //.....
function streamtotstrings(adata:pstream;count:integer):tstrings;
var s:string;
b:array of char;
i,j,last_i:integer;
begin
  s:='';//result:=nil;
  setlength(b,adata^.size);
  adata^.Position:=0;
  j:=adata^.read(b,adata^.Size);
{debug}
 form1.Memo2.Lines.Add('скопировано байт в массив: '+inttostr(j));
  j:=adata^.Size;
  form1.Memo2.Lines.Add('байт в потоке: '+inttostr(j));
{/debug}
 last_i:=0;
 if b[0]<>#0 then begin //  <--  access violation here
for i:=0 to count-1 do
    begin
      if b[i]=#0 then
          begin
              setlength(s,i-last_i);
              move(b[last_i],s,i-1-last_i); 
              last_i:=i+1;
              result.Add(s);
          end;
    end;
end;
end;
но ф-я выдаёт access violation при попытке чтения b[0]. где может быть ошибка? настройки проекта стандартные(D7)

зы кол-во символов в стриме определяется верно(adata^.size), но массив на момент возникновения ошибки забит нулями(#0) и неверного размера(судя по watch list) либо его размер =0

зыы замена типа adata с pstream на tstream ничего не меняет

зыыы косячит функция tstream.read. потому как до её выполнения length(b)=adata.size. после выполнения length(b)=0; а альтернитивного способа читать из потока я не знаю(readbuffer тоже не работает)

Последний раз редактировалось varich; 02.09.2014 в 18:11.
varich вне форума Ответить с цитированием
Старый 02.09.2014, 19:14   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
j:=adata^.read(b,adata^.Size);
В динамический массив нельзя так читать, можно так:
Код:
j:=adata^.read(b[0],adata^.Size);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.09.2014, 20:06   #3
varich
Пользователь
 
Регистрация: 01.03.2013
Сообщений: 22
По умолчанию

спасибо. не знал что эта фишка относится к дин. массивам. теперь работает
varich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TStrings и String Dima_D Общие вопросы Delphi 6 04.08.2010 15:48
tstrings.loadfromstream Gumer Общие вопросы Delphi 9 05.07.2010 10:00
Проблема с TStrings GBAXA Общие вопросы Delphi 1 30.06.2010 21:15
TStream Владимир1988 Помощь студентам 2 17.12.2009 10:16
Проблема с TStrings Никки Общие вопросы Delphi 11 16.02.2008 20:42