Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-77401
Александр
2002-06-11 17:19
2002.06.24
Работа с логами


8-77506
Nikolay
2002-02-10 18:30
2002.06.24
GIF+Region=?


6-77516
DED_MAZAI
2002-04-12 22:39
2002.06.24
Как в Win2000 из моей прог. запустить прог. на другом комп.


1-77378
Night
2002-06-13 13:40
2002.06.24
Вопрос не по теме, но кажется никто кроме вас мне не поможет.


1-77364
Reticent
2002-06-13 12:47
2002.06.24
мааааленький вопросик про память





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский