Форум: "Основная";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];
ВнизДинамические массивы Найти похожие ветки
← →
Burmistroff (2002-06-09 21:22) [0]Добрый день. Подскажите пожалуйста, как увеличивать размер динамического массива?
Я предполагаю что для этого существует процедура SetLength(); НО:
type
TStrRec = record
from, to: DWORD;
data: string;
end;
TRegRec = record
size, addr: DWORD;
data: array of TStrRec;
end;
cfg = record
Keys: TRegRec;
end;
{...}
var
Cfg: TConfig;
{...}
begin
cfg.Keys.size:=ListBox1.Strings.Count;
{Программа работает нормально (и верно) но если её отлаживать,
то после прохождения debugger"ом следующей строчки возникает
Access Violation in module user32.dll, и Delphi 6 начинает кидать
это сообщение при любом действии (даже после закрытия программы)}
SetLength(cfg.Keys.data, cfg.Keys.size);
{...}
end;
Благодарю за помощь
← →
Игорь Шевченко (2002-06-10 10:38) [1]Побольше кода можно привести для воспроизведения ошибки ?
← →
McSimm (2002-06-10 10:51) [2]cfg = record
имелось в виду:
TConfig = record ?
← →
Burmistroff (2002-06-10 21:11) [3]> McSimm
Да, это я наглючил
> Игорь Шевченко
Я заметил, что эта ошибка возникает если выполнить SetLength пару раз. Мне кажется, что производится запись в занятое адресное пространство процесса, что вызывает эти глюки, возникающие только при обращении к этому неверно выделенному участку памяти.
вот исходник юнита:
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TStrRec = record
iFrom, iTo: DWORD;
Data: string;
end;
PStrRec = ^TStrRec;
TRegRec = record
iKey, iName, iValue, iReserved: TStrRec;
iType: Byte;
end;
TAppRec = record
iName: TStrRec;
iCRC: DWORD;
iAdminOnly: boolean;
iAllow: boolean;
iHooks: array [0..15] of boolean;
end;
TRegDb = record
size, addr: DWORD;
data: array of TRegRec;
end;
TAppDb = record
size, addr: DWORD;
data: array of TAppRec;
end;
TCapDb = record
size, addr: DWORD;
data: array of TStrRec;
end;
TRegKeyRec = record
iKey, iType: TStrRec;
end;
PRegKeyRec = ^TRegKeyRec;
TKeysDb = record
size, addr: DWORD;
data: array of TRegKeyRec;
end;
PKeysDb = ^TKeysDb;
TConfig = record
Version: byte;
CRC1: DWORD;
CRC2: DWORD;
// my headache ////////////////////////////////////////
Keys: TKeysDb;
Reg: TRegDb;
App: TAppDb;
Cap: TCapDb;
///////////////////////////////////////////////////////
Form1Metrics: array [1..5] of WORD;
Form3Metrics: array [1..5] of WORD;
FirstExec, LastExec: DWORD;
RegWatch, AppWatch, CapWatch, AutoRun, Locked,
AutoLogoff, HideTray, RCAlert, ATAlert,
ASAlert, AllowUserApp: Boolean;
KeyStroke: Char;
CGFPath, Password, Userkey: TStrRec;
end;
PConfig= ^TConfig;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Config: TConfig;
filename: string = "c:\temp.tmp";
x: integer;
implementation
{$R *.dfm}
procedure pck(var cfg: TCOnfig);
begin
{где-то здесь возникает ошибка}
cfg.Keys.size:=8000;
SetLength(cfg.Keys.data, cfg.Keys.size);
cfg.Reg.size:=8000;
SetLength(cfg.Reg.data, cfg.Reg.size);
cfg.App.size:=8000;
SetLength(cfg.App.data, cfg.App.size);
cfg.Form1Metrics[1]:=form1.Width;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
pck(config);
end;
end.
Если делать SetLength напрямую (без вызова pck) то все OK, или если в pck вместо SetLength(cfg, 999) писать SetLength(Config, 999) - то тоже всё OK.
← →
McSimm (2002-06-11 10:15) [4]А проблема, похоже, совсем в другом.
Скорее всего
cfg.Form1Metrics[1]:=form1.Width;
И при этом переменная form1 фактически не содержит указателя на экземпляр созданной формы.
Во всяком случае во всем остальном я ошибок не вижу.
Так?
← →
Игорь Шевченко (2002-06-11 10:35) [5]Нет ошибки. Я этот код откомпилировал и выполнил.
:-)))
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c