Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];

Вниз

массив   Найти похожие ветки 

 
XbI   (2006-07-20 20:57) [0]

есть такая проблема...
есть файл и нужно из файла считывать данные в массив, причем массив по размеру всегда разный...
Делаю так:
var
 Mas: array of Byte;
 h: integer;
..........................
..........................
begin
..........................
SetLength(Mas,h);    ?????????????
BlockRead(F,Mas,sizeof(Mas));
.........................
end;

это все выполняется в цикле...

при первом проходе все нормально, но когда второй раз проходит этот участок то на строке {????????????} возникает ошибка ввода-вывода, как это можно исправить, не подскажете? как еще можно задавать размер массива?


 
Джо ©   (2006-07-20 21:00) [1]

Не мешало бы, я думаю, увидеть более полный код.


 
begin...end ©   (2006-07-20 21:07) [2]

> XbI   (20.07.06 20:57) [0]

На первом проходе у Вас затирается ссылка на тело динамического массива, поэтому в следующий раз в SetLength передаётся испорченная ссылка.

Строку с BlockRead, вероятно, следует записать так: BlockRead(F, Mas[0], Length(Mas)).


 
XbI   (2006-07-20 21:13) [3]


> Строку с BlockRead, вероятно, следует записать так: BlockRead(F,
>  Mas[0], Length(Mas)).

если я так сделаю, то он в первый элемент(в 1 байт) запишет эту информацию, а мне нужно заполнить всю структуру и дальше уже с ней работать, или это не так(нету сейчас возможности проверить это)?

> На первом проходе у Вас затирается ссылка на тело динамического
> массива, поэтому в следующий раз в SetLength передаётся
> испорченная ссылка.

а как это исправить, не подскажете?

> Не мешало бы, я думаю, увидеть более полный код.

там нет ничего интересного, там идет обработка этих данных...


 
Мефисто   (2006-07-20 21:21) [4]


> там нет ничего интересного, там идет обработка этих данных.
> ..


Отвечающим вообщето вообще фиолетого :)


>  а мне нужно заполнить всю структуру и дальше уже с ней
> работать,


Дан ответ в:


> begin...end ©   (20.07.06 21:07) [2]


 
Мефисто   (2006-07-20 21:24) [5]


> begin...end ©   (20.07.06 21:07) [2]



>  BlockRead(F, Mas[0], Length(Mas)).


Небольшая поправка :)
Скорее всего так:  Length(Mas) * SizeOf(TMyRecord)


 
begin...end ©   (2006-07-20 21:27) [6]

> XbI   (20.07.06 21:13) [3]

> если я так сделаю, то он в первый элемент(в 1 байт) запишет
> эту информацию...
> ...или это не так(нету сейчас возможности проверить это)?

Если Вы так сделаете, то в тело массива Mas запишется h = Length(Mas) байт информации из файла F (если, конечно, они там есть).

> а как это исправить, не подскажете?

Так, как написано в [1].

Дело вот в чём. В качестве параметра Buf процедуры BlockWrite нужно указывать переменную, по адресу которой нужно записать данные из файла. Переменная Mas представляет собой, фактически, указатель на тело динамического массива. Так вот -- если в качестве Buf передать Mas, то данные из файла запишутся в память туда, где расположена переменная Mas, т.е. в ссылку на массив, а не в его тело. Если же передать Mas[0], то запись будет по адресу элемента Mas[0], т.е. по адресу начала тела массива, и данные будут записаны в тело массива, что и требуется.


 
begin...end ©   (2006-07-20 21:32) [7]

> Мефисто   (20.07.06 21:24) [5]

Сорри, но в [0] я вижу array of Byte, а не array of TMyRecord. Поэтому, вероятно, верен всё же мой вариант -- если, конечно, файл F быт открыт с размером блока в 1 байт, иначе вместо Length(Mas) следует писать Length(Mas) div {размер_блока}.


 
Джо ©   (2006-07-20 21:33) [8]

Добавим сюда еще и "ошибку ввода/вывода" и усядемся гадать до утра :)


 
Мефисто   (2006-07-20 21:39) [9]


> begin...end ©   (20.07.06 21:32) [7]


Каюсь, недосмотрел. :( Все - ОК.


 
XbI   (2006-07-20 22:10) [10]

открытие файла происходит так:
AssignFile(F,fn);
Reset(F,1);

Спасибо, за подробное объяснение!!!
завтра проверю, надеюсь все получится...


 
Anatoly Podgoretsky ©   (2006-07-20 22:35) [11]

begin...end ©   (20.07.06 21:32) [7]
Сорри, но в [0] я вижу array of Byte, а не array of TMyRecord.

А не важно, все равно
Length(Mas) * SizeOf(Byte)
Сегодня байт, завтра Integer. Кстати примерно так же и оправдывали код
Length(Mas) * 2
Там же Integer


 
StriderMan ©   (2006-07-20 23:06) [12]


> Length(Mas)

уже вернет количество элементов * размер элемента! Разве нет?


 
Джо ©   (2006-07-20 23:11) [13]

> [12] StriderMan ©   (20.07.06 23:06)
>
> > Length(Mas)
>
> уже вернет количество элементов * размер элемента! Разве
> нет?

Нет.


 
Германн ©   (2006-07-21 02:12) [14]


> там нет ничего интересного, там идет обработка этих данных.
> ..

Ну это ты так считаешь. Или секретные сведения?
А я, лично, не понял в сабже вот это - есть файл и нужно из файла считывать данные в массив, причем массив по размеру всегда разный....
Имхо, очень много вариантов сабжа можно придумать на основе этой строки. Какой из них реально твой - непонятно. :-(


 
Elen ©   (2006-07-21 08:11) [15]


> открытие файла происходит так:
> AssignFile(F,fn);
> Reset(F,1);

В каком месте ты открываеш файл?

> BlockRead(F,Mas,sizeof(Mas));

Если не ошибаюсь после этого ты попадаеш в конец файла и при повторном считывании прога обьявляет тебе о конце файла I/O Error. Нужно в этой процедуре поставить Reset


 
Elen ©   (2006-07-21 08:12) [16]

P.S.

> ошибка ввода-вывода

Разве ошибка Ввода/вывода возникает на SetLength? Помоему к этой ошибке должен относится BlockRead?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.013 c
4-1145014299
Sinka
2006-04-14 15:31
2006.08.06
Задний фон на TCustomObject (в частности на TTreeView)


2-1152884670
Sirus
2006-07-14 17:44
2006.08.06
Замена сообщения об ошибке


6-1142581438
diMAN
2006-03-17 10:43
2006.08.06
Открытие сокета в системе


11-1131169925
Ilnur
2005-11-05 08:52
2006.08.06
Шрифты в TKolRichedit


15-1152265708
Layner
2006-07-07 13:48
2006.08.06
Как подать в разъём S-VHS обычный видео сигнал?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский