Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.24;
Скачать: CL | DM;

Вниз

Динамические массивы   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
14-77606
copyr25
2002-05-18 21:28
2002.06.24
---|Ветка была без названия|---


1-77414
Гаргоша
2002-06-11 01:51
2002.06.24
Объединение ячеек таблицы в WORD


4-77656
Rad
2002-04-21 22:38
2002.06.24
GroupBox на WinAPI


6-77536
andy_sid
2002-04-17 16:56
2002.06.24
Проблема с SendStream :(((


1-77402
MyasNick
2002-06-13 15:27
2002.06.24
Настройки печати