![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() При попытке присвоения данных из файла(через FileStream) динамическому массиву, вылетает ошибка. Если массив обычный,то работает все нормально, что сделать что бы и с динамическим было тоже самое?
Текст программы: Код:
var Form1: TForm1; A: Tfilestream; data: array of integer; i: integer; procedure TForm1.Button1Click(Sender: TObject); begin setlength(data,100); if opendialog1.Execute then A:=Tfilestream.Create(opendialog1.FileName, fmOpenRead); A.Read(data,sizeof(data)); for i:=0 to 99 do begin memo1.Lines.Add(inttostr(data[i])); end; end; ![]() |
#2
|
||||
|
||||
![]() Цитата:
Давай зырить, вот смотри: Кусочек из твоего кода Код:
if opendialog1.Execute then A:=Tfilestream.Create(opendialog1.FileName, fmOpenRead); A.Read(data,sizeof(data)); Да и потом, если на то уж пошло, то должно быть чето типа A.ReadBuffer(data[0], Length(data)); Так-то, господин Змий. Олсо, существую спецовые ридеры и врайтеры (TReader, TWriter) для того, чтобы такой говнокод не набирать. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
![]() Вместо:
Код:
A.Read(data,sizeof(data)); Код:
A.Read(data,length(data)); ![]() Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 28.11.2011 в 22:08. |
#4
|
|||
|
|||
![]() Только
Код:
A.Read(data,length(data) * SizeOf(Integer)); |
#5
|
||||
|
||||
![]() Код:
var AFileStream: TFileStream; Data: array of Byte; begin if not OpenDialog1.Execute then Exit; AFileStream:=TFileStream.Create(OpenDialog1.FileName, fmOpenRead); try SetLength(Data, AFileStream.Size); AFileStream.Read(Data[0], Length(Data)); Memo1.Text:=Copy(PChar(@Data[0]), 1, Length(Data)); // это так... finally AFileStream.Free; end; end; Пишу программы за еду. __________________ |
#6
|
|||
|
|||
![]() Спасибо за ответы. Но только не совсем понятно,считывание происходит побайтно как я понял и побайтно записывается в массив (length(data) равено A.size), а как сделать чтобы считалось по 4 байта,то есть как тип integer?
Вот так писал,эту проблему не решает Код:
A.Read(data,length(data) * SizeOf(Integer)); |
#7
|
||||
|
||||
![]() В случае со статичными массивами, начало массива = начало первого (нулевого, да) элемента. В случае с динамическими массивами, мы имеем:
начало массива: 4 байта [длина], элемент 0, элемент 1, ... Начинай присвоение с нулевого элемента, а не с начала массива. Код:
A.Read(data[0],length(data) * SizeOf(Integer)); Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#8
|
|||
|
|||
![]() Цитата:
Не пойму почему A.size равен length(data), ведь A.size это размер в байтах а length(data) количество элементов массива,получается что в массиве элементы по одному байту |
#9
|
||||
|
||||
![]() а data у тебя сейчас array of byte или array of integer?
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#10
|
|||
|
|||
![]() array of integer (смотри первое сообщение)
|
#11
|
||||
|
||||
![]() Код:
SetLength(Data, ceil(A.Size/sizeof())); Читай так: Код:
A.Read(data[0],A.Size); Код:
A.Seek(0,soFromBeginning); Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 07.12.2011 в 00:49. |
#12
|
|||
|
|||
![]() Извините, предыдущий пост не до конца разобрал, там все есть
![]() Всем спасибо! Ребят,все равно не получается Читаю WAV файл,как тут писали, допустим размер файла WAV.size=20.000.000, тогда размер считываемых данных должен быть примерно в 2 раза меньше(если заголовок не учитывать), то есть 10.000.000, потому что данные по 2 байта, вроде делаю все как нужно,но в итоге если посмотреть считанные данные,то начиная со второй половины все равно нулю,в данном случае с 5.000.000 до 10.000.000 Код:
var Form1: TForm1; WAV: Tfilestream; i: integer; data: array of smallint; procedure TForm1.Button1Click(Sender: TObject); begin if not opendialog1.Execute then exit; WAV:=Tfilestream.Create(opendialog1.FileName, fmopenread); try setlength(data,trunc((WAV.size-44)/sizeof(smallint))); WAV.Seek(44, sofrombeginning); WAV.read(data[0], length(data)); for i:=7000000 to 7000100 do memo1.Lines.Add(inttostr(data[i])); edit1.Text:=inttostr(WAV.size); edit2.Text:=inttostr(length(data)); finally WAV.free; end; end; end. Последний раз редактировалось Змей, 13.12.2011 в 18:27. |