Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1087886239
san
2004-06-22 10:37
2004.07.04
Grid с большой шапкой шапкой


1-1087333605
DDA
2004-06-16 01:06
2004.07.04
Универсальная переменная


8-1082250510
Игорь
2004-04-18 05:08
2004.07.04
Длина AVI файла


1-1087537714
Ш-К
2004-06-18 09:48
2004.07.04
Найти свойство по имени


14-1087299677
Vlad Oshin
2004-06-15 15:41
2004.07.04
подскажите как из 1.frp(FastReport) достать текст.





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