У меня проблема с сохранением большого размера базы данных в Delphi. Он содержит массив [1..3500] TItem, который, в свою очередь, имеет два массива [1.50] и [1..20]. Я получаю переполнение стека, если не установить переменную как указатель и использовать команды GetMem, FreeMem ниже, но тогда я не могу ее сохранить. Код ниже.Сохранение и переполнение стека
procedure TDatabase.SaveDB;
var
TempDB: ^TSaveDB;
K, X: integer;
sComment, sTitle, sComposer, sISDN, sCategory: string;
begin
GetMem(TempDB, SizeOf(TSaveDB));
TempDB.CatCount := fCategoryCount;
TempDB.ItemCount := fItemCount;
for K := 1 to fCategoryCount do
TempDB.Categories[K] := fCategories[K];
for K := 1 to fItemCount do
begin
fItems[K].ReturnSet(sTitle, sComposer, sCategory, sISDN, sComment);
with TempDB.Items[K] do
begin
Title := sTitle;
Composer := sComposer;
Category := sCategory;
ISDN := sISDN;
end;
TempDB.Items[K].Comments[1] := Copy(sComment, 1, 255);
Delete(sComment, 1, 255);
TempDB.Items[K].Comments[2] := Copy(sComment, 1, 255);
Delete(sComment, 1, 255);
TempDB.Items[K].Comments[3] := Copy(sComment, 1, 255);
Delete(sComment, 1, 255);
TempDB.Items[K].Comments[4] := Copy(sComment, 1, 255);
Delete(sComment, 1, 255);
TempDB.Items[K].KeyWCount := fItems[K].GetKeyCount;
for X := 1 to fItems[K].GetKeyCount do
TempDB.Items[K].Keywords[X] := fItems[K].GetKeywords(X);
end;
AssignFile(DBSave, fSaveName);
Rewrite(DBSave);
Write(DBSave, TempDB);
Closefile(dBSave);
FreeMem(TempDB, sizeof(TSaveDB));
end;
Очень хороший ответ. Написание только такого количества полей, как есть, не только уменьшит размер файла, но и не сработает код, если будет нарушен один из жестко заданных пределов в типе данных. – mghie
Он, кажется, копирует его в String [255], поэтому результат - усечение, а не сбой. –
@Loren: Это не то, что я имею в виду - что происходит в OP-коде, если fItemCount> High (fItems) или if fCategoryCount> High (Категории)? Он потерпит крах. Не обращайте внимания на то, что пределы, кроме 0, 1 и бесконечности, произвольны. Почему только 3500 предметов? Почему максимальная длина комментария 1220? – mghie