Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];

Вниз

Проблема с BlockRead и динамическим массивом   Найти похожие ветки 

 
Galiaf ©   (2008-03-08 12:37) [0]

Доброго времени суток всем, а девушек поздравляю с праздником!
У меня небольшая проблемка с одним динамическим массивом, его описание выглядит так:

type
 tImg = record
   path: string;
   checked: boolean;
 end;

var
 Images: array of tImg;

Когда я пытаюсь прочитать из файла процедурой BlockRead, изменяется размер Images
Код:

type
 tSettings = record
   randomize: boolean;
   setonstart: boolean;
   startonlogon: boolean;
   trayicon: boolean;
   norepeat: boolean;
   circular: boolean;
   interval: byte;
   intervaltype: byte;
 end;

var
 settings: tsettings;

procedure TForm1.FormCreate(Sender: TObject);
var
 f: file;
begin
   assignfile(f,"config.cfg");
   Reset(F);
   blockread(f, settings, sizeof(settings));
   closefile(f);
   setlength(images,1)
end;

До выполнения blockread(f, settings, sizeof(settings)), массив settings пуст, после - в нем появляется много пустых записей. После closefile(f) он снова пуст, но setlength(images,1) выдает ошибку. Если удалить blockread(f, settings, sizeof(settings)), ошибка пропадает.
Почему так происходит и как этого избежать?
Спасибо.


 
Leonid Troyanovsky ©   (2008-03-08 14:42) [1]


> Galiaf ©   (08.03.08 12:37)  

> У меня небольшая проблемка с одним динамическим массивом,
>  его описание выглядит так:

http://www.podgoretsky.com/DM/BadTips.html#BT-11

Да и, во-ще, дался оный BlockRead,
TFileStream - forever.

--
Regards, LVT.


 
Galiaf ©   (2008-03-08 15:13) [2]


> TFileStream - forever.

Ну не знаю, не нравится мне этот TFileStream, я сторонник WinAPI


 
Galiaf ©   (2008-03-08 15:26) [3]

исправил path: string; на path: string[255];
Эффекта не дало


 
Григорьев Антон ©   (2008-03-08 15:43) [4]

Совет с сайта Анатолия Подгорецкого в данном случае, похоже, не при чём...

> До выполнения blockread(f, settings, sizeof(settings)),
> массив settings пуст

Разве settings - это массив? Из вашего кода этого не видно...

Где объявлены переменные settings и Images? Это поля класса? Или глобальные переменные? Код точно такой же, как в реальном проекте, или вы что-то из него выкинули? В том коде, который у вас, я ничего неправильного не вижу.

> Galiaf ©   (08.03.08 15:13) [2]
> Ну не знаю, не нравится мне этот TFileStream, я сторонник
> WinAPI

Раз вы сторонник WinAPI, то почему используете Assign, Reset и BlockRead? WinAPI - это CreateFile, ReadFile, WriteFile. А Assign, Reset и BlockRead - это RTL Delphi.


 
Anatoly Podgoretsky ©   (2008-03-08 17:16) [5]

Массив в коде не наблюдается.


 
Galiaf   (2008-03-08 17:51) [6]

Извиняюсь, попутал, массив images, а не rettingrs


 
Anatoly Podgoretsky ©   (2008-03-08 19:41) [7]

Не установлен размер записи для файла и зачем нетипизированый файл, если у тебя типизированая запись.


 
Galiaf   (2008-03-08 20:01) [8]

А как это влияет на мою проблему?


 
Anatoly Podgoretsky ©   (2008-03-08 20:03) [9]

Ты с кем разговариваешь?


 
Григорьев Антон ©   (2008-03-08 21:44) [10]


> Galiaf   (08.03.08 20:01) [8]
> А как это влияет на мою проблему?

А влияет это так: по умолчанию размер блока равен 128 байт, а функция BlockRead использует размер в блоках, а не в байтах. Поэтому у вас читается 128*SizeOf(Settings) байт, т.е. в 128 раз больше, чем нужно. Поэтому портится память, не принадлежащая переменной settings.


 
Galiaf ©   (2008-03-11 00:26) [11]


> Григорьев Антон ©   (08.03.08 21:44) [10]

Спасибо, учту. Но именно на массив images как это может влиять?

>  Код точно такой же, как в реальном проекте, или вы что-
> то из него выкинули?

После появления ошибки, создал новый проект и вставил в него выше указанный код - ошибка осталась.


 
Германн ©   (2008-03-11 00:41) [12]


> Спасибо, учту. Но именно на массив images как это может
> влиять?
>

На массив
 tImg = record
  path: string[255];
  checked: boolean;

var
Images: array of tImg;

таких записей что-ли?
Тогда blockread(f, Images, sizeof(settings));
прочтет из файла 300*128 байт


 
Германн ©   (2008-03-11 00:43) [13]

Короче приведи еще раз код, но уже со всеми поправками. Похоже что ты читаешь не то и не туда.


 
Galiaf ©   (2008-03-11 01:55) [14]


> Тогда blockread(f, Images, sizeof(settings));

В моем вопросе:
 blockread(f, settings, sizeof(settings));
Никаких поправок, читаю тольо из settings, а images использую толко один раз - изменяю его размер на 1 и больше нигде не использую.


 
Германн ©   (2008-03-11 02:19) [15]


> Galiaf ©   (11.03.08 01:55) [14]

Пока не приведешь реальный код без каких-либо оговорок, на решение твоей проблемы не надейся.


 
Anatoly Podgoretsky ©   (2008-03-11 02:22) [16]

Ты [7] и прочее прочитал, что же не делаешь.
Но в твоем случае лучше типизированый файл.

http://podgoretsky.com/ftp/Docs/Delphi/Podgoretsky/PasFiles.html


 
Сергей М. ©   (2008-03-11 11:49) [17]


> я сторонник WinAPI


Если "сторонник", то за каким лешим используешь VCL ?)


 
zensan ©   (2008-03-11 11:55) [18]

Ispolzuj "packed record". Eto reshit tvoju problemu. Ti ispolzuesh aligned record, eto vse i portit. I dinamicheskij massiv tozhe samo soboj dolzhen bitj "packed".


 
zensan ©   (2008-03-11 11:56) [19]

Удалено модератором
Примечание: Забаню за неуважение к правилам


 
icWasya ©   (2008-03-11 13:53) [20]

и динамические массивы читать и писать нужно так

BlockWrite(F,Images[0],Length(Images)*SizeOf(Images[0]));


 
tesseract ©   (2008-03-11 14:13) [21]


> Ispolzuj "packed record". Eto reshit tvoju problemu. Ti
> ispolzuesh aligned record, eto vse i portit. I dinamicheskij
> massiv tozhe samo soboj dolzhen bitj "packed".


Не решит. Учи теорию. А как это packed array ?


type
tImg = record
  path: string;
  checked: boolean;
end;


Sizeof(path) - будет 4 string - это тоже динамический массив. И в записи это указатель.

Так правильнее :

type
tImg = record
  path: string[255]; // запись должна быть целой
  checked: boolean;
end;


сам проверь Sizeof-ом.


 
Григорьев Антон ©   (2008-03-11 15:25) [22]

Тут что, народ вопросы по диагонали читает? Ну не нужно автору читать массив Images! И не надо ему советовать как это делать и как изменить тип TImg - не в том проблема. Проблема в том, что он читает гораздо больше, чем надо и портит память других переменных, в т.ч. Images, который не является источником проблемы, а просто оказывается в неудачном месте в неудачное время.



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

Форум: "Начинающим";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
2-1204986380
NSer
2008-03-08 17:26
2008.04.06
Как сделать, чтобы программа не запускалась при условии?


6-1184016935
batya-xep
2007-07-10 01:35
2008.04.06
При dial-up ить комп


2-1205258821
HITMAN
2008-03-11 21:07
2008.04.06
Как зделать выборку по дате???


2-1205344281
Wowa
2008-03-12 20:51
2008.04.06
fsStayOnTop, виснит приложение


15-1203510685
Raven
2008-02-20 15:31
2008.04.06
Процедура для изучения Delphi для новичков :)





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