私はDelphiで異なる大規模なデータベースの種類を保存中に問題を抱えています。これにはTItemの配列[1..3500]が含まれています.Titemには2つの配列[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;
非常に良い答えです。そこにあるフィールドだけを書き込むだけでファイルサイズが小さくなるだけでなく、データ型のハードコードされた制限の1つに違反するとコードがクラッシュすることもありません。 – mghie
彼はそれをString [255]にコピーしているように見えるので、結果は切り詰めであり、クラッシュではありません。 –
@Loren:fItemCount> High(fItems)の場合、またはfCategoryCount> High(Categories)の場合は、OPコードでどうなるのでしょうか?それはクラッシュするでしょう。 0,1および無限を除いて限界が任意であることに気をつけてください。なぜ3500アイテムしかないのですか?なぜコメントの長さは最大1220ですか? – mghie