![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
после BlockRead динамические массивы теряют ссылку на память. [D6, Win2k]
Losik © (2004-06-18 15:51:00)Ситуёвина следующая. Из переменной типа file читаю данные командой BlockRead. Смотрю в трассировщике. Все динамические массивы залиты чем-то полезным. Всё ок. Выполняю BlockRead. Как будто бы память и не выделялась под них. Весь день я с этим ... мучаюсь. Помогите. Очень охота до выходных всё сделать.
Кстати, если использовать менее рациональный метод и писать/читать в TextFile, то всё пролезает. Но мне надо именно переменная file.
Palladin (2004-06-20 17:29:00) [1]Да, сделать глобальным это выход. Спасает от всего...
Sormy (2004-06-18 18:57:00) [2]Может всё попробовать глобальным сделать?
Поотслеживай реальную длину массива в переходах между процедурами...
Тимохов (2004-06-18 17:59:00) [3]Автору, не тупи, дружок.
С помощью криворукого blockread можно затереть что угодно, хоть динамический массив (присему другой!!! :о))) да хоть строку, да хоть access viaolation вызывать.
кривым рукам нет преград.
Anatoly Podgoretsky (2004-06-18 17:57:00) [4]В приведном тобой коде коде ошибок нет!!!
Плохиш (2004-06-18 17:56:00) [5]>Losik (18.06.04 17:55) [39]
Читать Тимохов © (18.06.04 17:50) [37]до прояснения
Losik (2004-06-18 17:55:00) [6]2Тимохов: Читай внимательно! Я не сказал, что F затирается. Я сказал, что затираются ВСЕ другие динамические массивы. Код неаналогичен!
2Anatoly Podgoretsky: в том то и дело что я не читаю в динамический массив. Я просто читаю, а динамические массивы, которые существуют помимо всего теряются. В том то и дело. И это не шутка. Я с утра этот эффект наблюдаю.
Anatoly Podgoretsky (2004-06-18 17:51:00) [7]У тебя в твоем коде нет чтения в динамический массив!!! Нигде.
Тимохов (2004-06-18 17:50:00) [8]а если код большой, то и разбирайся сам.
вот в [34] описан ровно твой случай - работает!
ясно одно, что ты затираешь свой массив f нулями, поэтому он как бы становится пустым. Иди где ты это делаешь. НАйди место, где f стал пустым. Внимательно посмотри на строку. Может ты читаешь больше, чем переменная или еще что
Чудес не бывает.
Losik (2004-06-18 17:42:00) [9]Люди. Код очень большой поэтому я и привёл его обрывками. По большому счёту он заключается из одного фора от 1 до N по i. Сначала файл пишется во время накопления статистики (пишется он затем, что информации настолько много, что оперативки в больших задачах для накопленной статистики может не хватить). Потом закрывается, потом открывается на чтение и статистика обрабатывается. Процедура весит порядка 500 строк, не говоря о программе.
2Тимохов: ничо у меня не отключено.
SetLegth есть и в порядке, иначе бы он его ранее на запись не открыл.
2PVOzerski: Ты не врубился в ошибку. Он хорошо очень даже читает. Но после выполнения BlockRead у всех заведённых ранее динамических массивов непонятным образом теряются ссылки на память. Чтоб уж совсем было понятно. В трасировщике.
До блокрид. T[] = (1,1,1,1);
После. T[] = ();
Sandman25 (2004-06-18 17:35:00) [10]>Чаще всего более оправдано делать цикл от 0 до length-1.
Я рекомендую от Low до High, чтобы не задумываться о границах
PVOzerski (2004-06-18 17:29:00) [11]Во всяком случае, вот такое у меня сработало "на ура":
procedure TForm1.Button1Click(Sender: TObject);
var
f:array of file;
i:integer;
r:double;
begin
setlength(f,3);
for i:=1 to 3 do
begin
assignfile(f[i-1],IntToStr(i)+'.dat');
reset(f[i-1],8);
blockread(f[i-1],r,1);
ShowMessage(FloatToStr(r));
closefile(f[i-1]);
end;
end;
Хотя мне не нравится это i-1. Чаще всего более оправдано делать цикл от 0 до length-1.
Тимохов (2004-06-18 17:28:00) [12]
> меня от единицы до ленгфа, иначе трассировщик вылетал бы
> на блокриде
совершенно не факт, если отключено range check error, а его начинающие часто отключают - как типа крутые.
Тимохов (2004-06-18 17:24:00) [13]а я бы "end." чтобы знать, что это весь код...
Anatoly Podgoretsky (2004-06-18 17:23:00) [14]PVOzerski © (18.06.04 17:21) [30]
А я бы SetLength в придачу
PVOzerski (2004-06-18 17:21:00) [15]>Ты хочешь сказать что я не имею права читать из элемента масссива файловых переменных?
Нет, не хочу. А вот цикл for i:=... увидеть не отказался бы.
Anatoly Podgoretsky (2004-06-18 17:20:00) [16]Losik (18.06.04 17:16) [27]
Имеешь право, но ты должен делать это правильно.
Тебя же просили [18] приведи код, а ты что привел - обрывки
Losik (2004-06-18 17:20:00) [17]2PVOzerski: у меня от единицы до ленгфа, иначе трассировщик вылетал бы на блокриде, а он вылетает при первом после блокрида использовании динамического массива, ссылка на память у которого после блокрида потерялась...
Если работать с array of TextFile, то как я уже отмечал, всё замечательным образом получается.
Losik (2004-06-18 17:16:00) [18]Ты хочешь сказать что я не имею права читать из элемента масссива файловых переменных?
PVOzerski (2004-06-18 17:14:00) [19]>Anatoly Podgoretsky © (18.06.04 17:07) [24]
Круто!
PVOzerski (2004-06-18 17:14:00) [20]Интересно, а если вместо нетипизированного файла взять file of double и работать через read, то же будет?
Еще догадка: а всё ли в порядке с индексацией массива и счестчиком цикла? Вообще-то каждый раз рассчитывать i-1 не есть хорошо с точки зрения оптимальности кода. Хотя и не запрещено. А вот если неаккуратно прописан цикл, запросто можно вылететь за границы массива. В данном случае предельные границы будут от 1 (не от 0 !!!) до length(F). Это так в проге?