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

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

после BlockRead динамические массивы теряют ссылку на память. [D6, Win2k]


Страницы:   1 2 3

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). Это так в проге?


Страницы:   1 2 3

Наверх

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