Главная страница
    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.011 c
1-77465
PTE
2002-06-10 18:02
2002.06.24
CheckBox1 запрос при выходе из программы


7-77626
Просто чел
2002-03-26 01:09
2002.06.24
Как узнать программно серийный номер материнской платы


1-77420
CrazyHacKeRs
2002-06-10 23:56
2002.06.24
Ассоциативные массивы


14-77574
MaximatorVeter
2002-05-20 19:22
2002.06.24
Как стать мастером Дельфи?


14-77613
III@K@/\
2002-05-19 19:35
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский