Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.04;
Скачать: CL | DM;

Вниз

после BlockRead динамические массивы теряют ссылку на память.   Найти похожие ветки 

 
Losik   (2004-06-18 15:51) [0]

Ситуёвина следующая. Из переменной типа file читаю данные командой BlockRead. Смотрю в трассировщике. Все динамические массивы залиты чем-то полезным. Всё ок. Выполняю BlockRead. Как будто бы память и не выделялась под них. Весь день я с этим ... мучаюсь. Помогите. Очень охота до выходных всё сделать.
Кстати, если использовать менее рациональный метод и писать/читать в TextFile, то всё пролезает. Но мне надо именно переменная file.


 
Тимохов ©   (2004-06-18 16:00) [1]

Ситуевина следующая - последний телепат из отпуска так и не вернулся, а без него угадывать возможный вид кода ни у кого не получается.


 
Cobalt ©   (2004-06-18 16:05) [2]

Может, попробуешь использовать TFileStream?


 
Плохиш ©   (2004-06-18 16:06) [3]

>Losik   (18.06.04 15:51)

Ощибка при использовании параметра Buf.


 
Anatoly Podgoretsky ©   (2004-06-18 16:06) [4]

У тебя ошибка в программе!


 
TUser ©   (2004-06-18 16:11) [5]

Надо написать код.
Есть на Королевтсве статьи А.Подгорецкого и еще чего-нибудь наыверняка есть.
Есть TFileStream, очень удобно.


 
Тимохов ©   (2004-06-18 16:11) [6]

о, телепаты подтягиваются ...
щас советами завалят
:))


 
TUser ©   (2004-06-18 16:12) [7]

Опс. Уже все написали *)


 
PVOzerski ©   (2004-06-18 16:12) [8]

А blockread-то 2-м параметром что получает?


 
Плохиш ©   (2004-06-18 16:14) [9]


> Тимохов ©   (18.06.04 16:11) [6]
> о, телепаты подтягиваются ...

Лишь бы мозги у автора вопроса не изжарили своими способностями, а то будет как всегда :-)


 
Sam Stone ©   (2004-06-18 16:14) [10]

если buf - динамический массив, то читай не в buf, а в buf[1]


 
Тимохов ©   (2004-06-18 16:15) [11]


> Sam Stone ©   (18.06.04 16:14) [10]

точно, на фиг нам первый элемент.


 
Sandman25 ©   (2004-06-18 16:15) [12]

[10] Sam Stone ©   (18.06.04 16:14)

Buf[Low(Buf)]


 
PVOzerski ©   (2004-06-18 16:16) [13]

>если buf - динамический массив, то читай не в buf, а в buf[1]
Точнее, от нулевого и дальше.


 
Тимохов ©   (2004-06-18 16:16) [14]

да можно и в buf, только к pointer надо преобразовать и с крышечкой типа pointer(buf)^


 
Anatoly Podgoretsky ©   (2004-06-18 16:18) [15]

Тимохов ©   (18.06.04 16:15) [11]
А по большому счету и второй нафиг


 
panov ©   (2004-06-18 16:32) [16]

ну тогда просто read


 
Losik   (2004-06-18 16:38) [17]

Да всё нормально со вторым параметров. Я специально вместо массива туда темповую переменную подставил. Та же фигня.


 
default ©   (2004-06-18 16:39) [18]

код!!!


 
Losik   (2004-06-18 16:40) [19]

Код? Какой код. Вот пожалуйста, на этой ботве обезпамячивает.
BlockRead(F[i-1], TmpDouble, 1);


 
Sandman25 ©   (2004-06-18 16:47) [20]

[19] Losik   (18.06.04 16:40)

Классный код. Вы бы еще написали BlockRead(A, B, C)... Описания у переменных есть?


 
PVOzerski ©   (2004-06-18 16:47) [21]

BlockRead(F[i-1], TmpDouble[0], 1); не помогает? Кстати, какие параметры у Reset?


 
Anatoly Podgoretsky ©   (2004-06-18 16:56) [22]

А может у него массив F


 
Losik   (2004-06-18 16:58) [23]

TmpDouble : double
F : array of file;

процесс: открыл файл, записал, закрыл, открыл, прочитал - правильно прочитал, но динамика обнулилась...
мимо памяти в F я не мажу!

AssignFile(F[i-1], FileName);
Reset(F[i-1], 8);
...
BlockRead(F[i-1], TmpDouble, 1);


 
Anatoly Podgoretsky ©   (2004-06-18 17:07) [24]

PVOzerski ©   (18.06.04 16:47) [21]
Ну как мои телепатические способности :-)


 
PVOzerski ©   (2004-06-18 17:14) [25]

Интересно, а если вместо нетипизированного файла взять file of double и работать через read, то же будет?

Еще догадка: а всё ли в порядке с индексацией массива и счестчиком цикла? Вообще-то каждый раз рассчитывать i-1 не есть хорошо с точки зрения оптимальности кода. Хотя и не запрещено. А вот если неаккуратно прописан цикл, запросто можно вылететь за границы массива. В данном случае предельные границы будут от 1 (не от 0 !!!) до length(F). Это так в проге?


 
PVOzerski ©   (2004-06-18 17:14) [26]

>Anatoly Podgoretsky ©   (18.06.04 17:07) [24]
Круто!


 
Losik   (2004-06-18 17:16) [27]

Ты хочешь сказать что я не имею права читать из элемента масссива файловых переменных?


 
Losik   (2004-06-18 17:20) [28]

2PVOzerski: у меня от единицы до ленгфа, иначе трассировщик вылетал бы на блокриде, а он вылетает при первом после блокрида использовании динамического массива, ссылка на память у которого после блокрида потерялась...
Если работать с array of TextFile, то как я уже отмечал, всё замечательным образом получается.


 
Anatoly Podgoretsky ©   (2004-06-18 17:20) [29]

Losik   (18.06.04 17:16) [27]
Имеешь право, но ты должен делать это правильно.
Тебя же просили [18] приведи код, а ты что привел - обрывки


 
PVOzerski ©   (2004-06-18 17:21) [30]

>Ты хочешь сказать что я не имею права читать из элемента масссива файловых переменных?
Нет, не хочу. А вот цикл for i:=... увидеть не отказался бы.


 
Anatoly Podgoretsky ©   (2004-06-18 17:23) [31]

PVOzerski ©   (18.06.04 17:21) [30]
А я бы SetLength в придачу


 
Тимохов ©   (2004-06-18 17:24) [32]

а я бы "end." чтобы знать, что это весь код...


 
Тимохов ©   (2004-06-18 17:28) [33]


>  меня от единицы до ленгфа, иначе трассировщик вылетал бы
> на блокриде

совершенно не факт, если отключено range check error, а его начинающие часто отключают - как типа крутые.


 
PVOzerski ©   (2004-06-18 17:29) [34]

Во всяком случае, вот такое у меня сработало "на ура":

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.


 
Sandman25 ©   (2004-06-18 17:35) [35]

>Чаще всего более оправдано делать цикл от 0 до length-1.

Я рекомендую от Low до High, чтобы не задумываться о границах


 
Losik   (2004-06-18 17:42) [36]

Люди. Код очень большой поэтому я и привёл его обрывками. По большому счёту он заключается из одного фора от 1 до N по i. Сначала файл пишется во время накопления статистики (пишется он затем, что информации настолько много, что оперативки в больших задачах для накопленной статистики может не хватить). Потом закрывается, потом открывается на чтение и статистика обрабатывается. Процедура весит порядка 500 строк, не говоря о программе.
2Тимохов: ничо у меня не отключено.
SetLegth есть и в порядке, иначе бы он его ранее на запись не открыл.
2PVOzerski: Ты не врубился в ошибку. Он хорошо очень даже читает. Но после выполнения BlockRead у всех заведённых ранее динамических массивов непонятным образом теряются ссылки на память. Чтоб уж совсем было понятно. В трасировщике.
До блокрид. T[] = (1,1,1,1);
После. T[] = ();


 
Тимохов ©   (2004-06-18 17:50) [37]

а если код большой, то и разбирайся сам.
вот в [34] описан ровно твой случай - работает!

ясно одно, что ты затираешь свой массив f нулями, поэтому он как бы становится пустым. Иди где ты это делаешь. НАйди место, где f стал пустым. Внимательно посмотри на строку. Может ты читаешь больше, чем переменная или еще что
Чудес не бывает.


 
Anatoly Podgoretsky ©   (2004-06-18 17:51) [38]

У тебя в твоем коде нет чтения в динамический массив!!! Нигде.


 
Losik   (2004-06-18 17:55) [39]

2Тимохов: Читай внимательно! Я не сказал, что F затирается. Я сказал, что затираются ВСЕ другие динамические массивы. Код неаналогичен!
2Anatoly Podgoretsky: в том то и дело что я не читаю в динамический массив. Я просто читаю, а динамические массивы, которые существуют помимо всего теряются. В том то и дело. И это не шутка. Я с утра этот эффект наблюдаю.


 
Плохиш ©   (2004-06-18 17:56) [40]

>Losik   (18.06.04 17:55) [39]

Читать Тимохов ©   (18.06.04 17:50) [37] до прояснения



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

Текущий архив: 2004.07.04;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.069 c
3-1086764520
LittleGirly
2004-06-09 11:02
2004.07.04
Как обуздать большой dbf файл


1-1087329553
AAAlexeyAAA
2004-06-15 23:59
2004.07.04
Ув. мастера. К вам вопрос о представлении типов данных.


14-1087448627
R
2004-06-17 09:03
2004.07.04
Регистрация псевдонима автора


1-1087796059
DmitryNekl
2004-06-21 09:34
2004.07.04
Размер шрифта в TLabel


3-1086781586
BorisMor
2004-06-09 15:46
2004.07.04
ADO и CD