Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Проблемма с типизированным файлом

Автор: ninja 26.11.2009 5:06

Доброй ночи уважаемые форумчане!!! Пишу программу, что-то наподобие базы данных, сама программа работает номально, а вот при сохранении результата в типизированный файл возникла проблама.

Сохранение происходит следующим образом:



procedure TForm1.N2Click(Sender: TObject); {save}
type
zapis=record
mas1:array[1..4,1..3] of string[20];
mas2:array[1..3,1..10] of integer;
kolvo_chel:integer;
flag:boolean;
end;
var
s:zapis;
f:file of zapis;
fname:string;
a,b:integer;
begin
savedialog1.InitialDir:=getcurrentdir;
SaveDialog1.Title:='Сохранить в файле';
SaveDialog1.Filter :='Файлы базы данных |*.bd';
SaveDialog1.DefaultExt:='bd';
if SaveDialog1.Execute then
begin
fname:=SaveDialog1.FileName;
AssignFile(f,fname);
Rewrite(f);
reset(f);
s.kolvo_chel:=stringgrid1.rowcount-2;
write(f,s);
for a:=1 to stringgrid1.RowCount-2 do
begin
for b:=1 to stringgrid1.ColCount-1 do
begin
s.mas1[b,a]:=stringgrid1.Cells[b,a];
write(f,s);
end;
end;

closefile(f);
end;

end;




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

Сама программа

Прикрепленный файл  Прога.rar ( 217.87 килобайт ) Кол-во скачиваний: 416


Помогите разобраться с данной проблемой, заранее благодарю.

Автор: Lapp 26.11.2009 8:13

Цитата(ninja @ 26.11.2009 1:06) *
вылетает ошибка.

какая?

Автор: ninja 26.11.2009 17:14

Ошибка такая:

Код
Access violation at address 00402DC9 in module 'Project1.exe'. Write of address 20E0F2F5

Автор: ninja 26.11.2009 18:27

Проблема решена smile.gif

Автор: volvo 26.11.2009 18:36

Ты вылетаешь за пределы массива, неужели не видно? Смотри:

Цитата
zapis=record
mas1:array[1..4,1..3] of string[20];
mas2:array[1..3,1..10] of integer;
kolvo_chel:integer;
flag:boolean;
end;

Запомнил, какие индексы могут быть у mas2? А теперь см. сюда:
Цитата
        for a:=1 to stringgrid1.RowCount-2 do
begin
for b:=1 to stringgrid1.ColCount-1 do
begin
s.mas1[b,a]:=stringgrid1.Cells[b,a];
write(f,s);
end;
end;
И что будет, если RowCount больше 12? Что будет, если ColCount больше 4?

Автор: ninja 30.11.2009 1:56

Да Вы правы, в данном примере я вылетаю за пределы массива.

type
zapis=record
mas1:array[1..4,1..3] of string[20];
mas2:array[1..3,1..10] of integer;
kolvo_chel:integer;
flag:boolean;
end;


Но, если поменять значение например вот так:

type
zapis=record
mas1:array[1..4,1..100] of string[20];
mas2:array[1..3,1..10] of integer;
kolvo_chel:integer;
flag:boolean;
end;


То появляется таже ошибка, могу только предположить, что не хватает памяти и я неверно организовал запись, т.к. судя по моему алгоритму я для каждого значения выделяю массив.

Исправил так:

type
zapis=record
flag:boolean;
kolvo_chel:integer;
zapici:string[20];
vznoci:string[10];
data:string[2];
end;