Форум: "Основная";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];
Внизпосле 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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.034 c