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

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

Не совсем корректная работа с потоком [D7, XP, 2003]


beglec ©   (2006-03-18 18:11:00) 


procedure bebe;
var buf: array of byte;
  ReadSize: Integer;
  ST: TMemoryStream;
begin
  // ReadSize - может быть любым значением
  // ST:  TMemoryStream; - 100 % создан и в себе имеет информацию разного типа
  ReadSize:=980;
  SetLength(buf,ReadSize);
  St.Read(buf,ReadSize);
end;

Buf постоянно пустой. Почему ?
может я чего нетак делаю. Ошибок не вылетает.

а когда делаю так то все работает

procedure bebe;
var buf: array [1..980] of byte;
  ST: TMemoryStream;
begin
  // ReadSize - может быть любым значением
  // ST:  TMemoryStream; - 100 % создан и в себе имеет информацию разного типа
  St.Read(buf,SizeOf(buf));
end;

но дело то  как раз в том что заранее мне не известно -какой размер блока мне нужно протчитать :(


Desdechado   (2006-03-18 22:07:00) [1]

buf^


Virgo_Style   (2006-03-18 21:01:00) [2]

попробую простыми словами, ибо сложных уже и сам не вспомню %-)

пусть у нас будут статический и динамический массивы sbuf и dbuf. Разница между ними в том, что статический массив - штука безхитростная и подставить sbuf - это то же, что и sbuf[0]. Динамический же массив отличается тем, что dbuf не эквивалентен dbuf[0], ибо dbuf - это указатель на первый (нулевой) элемент массива (что такое указатели, я объяснять не буду, даже если надо %-) ).

Итого. (1) Когда в read(var buffer; ...) мы подставим "sbuf" - мы передадим в качестве параметра сам массив, без всяких хитростей.
Подставив же "dbuf" (2), мы передадим не массив, а указатель на него, и результат будет записываться на место адреса динамического массива. Подставляя же dbuf[0] (3), мы передадим первый элемент динамического массива, то есть, то же, что и в варианте (1).

Образно:
приходите вы, ну пусть зачет автоматом сдавать %-)
Даете свою зачетку - вам ставят зачет. Это вариант sbuf.
Даете записку "Вася ждет вас на углу" - зачет Васе нарисуют в этой бумажку, и что с ней делать - неизвестно %-). Это dbuf.
Но если привести Васю к преподавателю (dbuf[0]) - то все, опять же, будет в порядке, и Вася зачет получит %-).

Вот, на пальцах... что-то около и возле. лучше, конечно, почитать что-нибудь более умное и строгое %-)

P.S. Предполагается, что индексация sbuf начинается с нуля.


beglec   (2006-03-18 19:15:00) [3]


> а попробуй-ка Read(buf[0], ...), там же параметр - сам буфер,
>  а не указатель на него

Уважаемый Virgo_Style
А какое отличие между
Read(buf, ...)
Read(buf[0], ...)
Read(buf[1], ...) ???
Опишите поподробне пожалуйста


beglec   (2006-03-18 19:09:00) [4]

перегрузил Delphi вообще работать перестала :(
что то совсем запутался


beglec   (2006-03-18 18:42:00) [5]

По моему я вижу зеленых человечков :(
решил проверить все таки Position - просто на прямую. оказалось очень интересно

Итак:
входные данные
размер потока: 21780 byte - все в данных - то есть
размер чтения 980 byte;

попытка прочитать 1 запись SendStream[IDS].NumberRec=1;
SendStream[IDS].ReadSize:=980;

Было
Poss:=SendStream[IDS].NumberRec*SendStream[IDS].ReadSize;
poss показывает 21780 :(((( - хотя по идеии 980.

Проверяю понимаю что что- то не так
переделываю и получаю
Poss:=(SendStream[IDS].NumberRec-1)*SendStream[IDS].ReadSize;
работает все :((((
вот и сижу чешу репу - что я сделал такого ?????


Virgo_Style   (2006-03-18 18:25:00) [6]

а попробуй-ка Read(buf[0], ...), там же параметр - сам буфер, а не указатель на него


beglec   (2006-03-18 18:17:00) [7]

не забываю :)))
но вопрос не косается Position :)))
это после
а сейчас меня просто инетересует почему не читаются данные в первом варианте ?


Virgo_Style   (2006-03-18 18:16:00) [8]

Хотя вообще-то по описанию не похоже, что дело в нем...


Virgo_Style   (2006-03-18 18:15:00) [9]

у Stream есть Position, ты об этом не забываешь? я забывал)


Наверх

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