Форум: "Начинающим";
Текущий архив: 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.007 c