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

Вниз

Open array parameters + Class reference   Найти похожие ветки 

 
ламер   (2004-02-02 19:20) [0]

Добрый день! Столкнулся с непонятной ошибкой. Есть абстрактный класс:

type
TMyField = class
function GetName: String; virtual; abstract;
end;

TMyFieldType = class of TMyField;

из этого класса выведено несколько производных. далее, есть функция вида:

function Execute(MyName: String; MyFields: array of TMyFieldType; MyParams: array of String);
begin
end;

тело функции пустое, т.е. пока что она ничего не делает, но при вызове Execute("abc", [TMyField1, TMyField2], []); вылетает Access violation.
если убрать из параметров один (любой) из массивов - всё работает прекрасно, вместе же - исключение.
помогите советом, знатоки!


 
Тимохов ©   (2004-02-02 19:25) [1]

Думаю, что данного кода не достаточно для выяснения причин ошибки.


 
VMcL ©   (2004-02-02 19:27) [2]

>>ламер (02.02.04 19:20)

Что по этому поводу глаголет отладчик?


 
Palladin ©   (2004-02-02 19:30) [3]

Ошибка явно не в Execute("abc", [TMyField1, TMyField2], []);, а повыше...


 
ламер   (2004-02-02 19:41) [4]

хм... если Вы думаете, что кода недостаточно, могу привести целиком.

модуль Unit2:

unit Unit2;

interface

type
TMyField = class
function GetName: String; virtual; abstract;
end;

TMyFieldType = class of TMyField;

TMyField1 = class (TMyField)
function GetName: String; override;
end;

TMyField2 = class (TMyField)
function GetName: String; override;
end;

function Execute(MyName: String; MyFields: array of TMyFieldType; MyParams: array of String): Boolean;

implementation

function Execute(MyName: String; MyFields: array of TMyFieldType; MyParams: array of String): Boolean;
begin

end;

{ TMyField1 }

function TMyField1.GetName: String;
begin
Result := "MYFIELD1";
end;

{ TMyField2 }

function TMyField2.GetName: String;
begin
Result := "MYFIELD2";
end;

end.


часть модуля Unit1:

uses
Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
Execute("abc", [TMyField1, TMyField2], []);
end;


на мой взгляд, в этом коде нет ничего потенциально опасного.


 
jack128 ©   (2004-02-02 19:43) [5]


> Execute("abc", [TMyField1, TMyField2], []);

А вот если написать Execute("abc", [TMyField1, TMyField2], ["test"]); то думаю ошибок не будет..


 
ламер   (2004-02-02 19:45) [6]

> VMcL © (02.02.04 19:27) [2]
отладчик ничего не глаголет. пытался трассировать CPU - происходит нормальный выход из функции Execute, из события OnClick, после чего на выходе из TControl.Perform происходит исключение Access Violation.


 
ламер   (2004-02-02 19:50) [7]

jack128 © (02.02.04 19:43) [5]
да, Вы правы. так работает. но это не выход, ибо в программе должен быть способ передавать пустой массив строк.


 
Тимохов ©   (2004-02-02 19:57) [8]

Абсолютно ничего криминального - должно работать и с "[]".
Почему не работает, хрен знает.


 
Юрий Зотов ©   (2004-02-02 19:57) [9]

> ламер

Проверил Ваш код. Работает без малейших проблем (W2K, D7).

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TMyField = class
function GetName: string; virtual; abstract;
end;

TMyFieldType = class of TMyField;

TMyField1 = class(TMyField)
function GetName: string; override;
end;

TMyField2 = class(TMyField)
function GetName: string; override;
end;

function Execute(MyName: string; MyFields: array of TMyFieldType; MyParams: array of string): boolean;

var
Form1: TForm1;

implementation

{$R *.dfm}

function Execute(MyName: string; MyFields: array of TMyFieldType; MyParams: array of string): boolean;
begin
Result := False
end;

{ TMyField1 }

function TMyField1.GetName: string;
begin
Result := "MyField1"
end;

{ TMyField2 }

function TMyField2.GetName: string;
begin
Result := "MyFiield2"
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := IntToStr(Ord(Execute("abc", [TMyField1, TMyField2], [])))
end;

end.


 
Тимохов ©   (2004-02-02 20:04) [10]

У вас, очевидно, проблемы в кусках кода, скрытого от нашего взора, в Unit1


 
jack128 ©   (2004-02-02 20:07) [11]


> Юрий Зотов © (02.02.04 19:57) [9]
Видимо пофиксили. В D5 sp1 не работает. Хотя вот инетересно, что выдаст
ShowMessage(Format("High = %d, Low = %d", [High(MyParams), Low(MyParams)])); ? "High = -1, Low = 0" - так что ли?


 
ламер   (2004-02-02 20:07) [12]

Unit1 - стандартная форма с кнопкой Button1: TButton и событием Button1.OnClick. больше в ней нет ничего.

сдаётся мне, что это баг компилятора. придётся, видно, искать обходные пути...


 
Юрий Зотов ©   (2004-02-02 20:13) [13]

> ламер

Насколько помню, для D5 был SP2 и некоторые баги VCL он фиксил.


 
Тимохов ©   (2004-02-02 20:14) [14]

В шестом тоже работает.
Очень похоже на баг компилятора.


 
ламер   (2004-02-02 20:23) [15]

покопался в баг-листе борланда, нашёл упоминание о похожей ошибке. советуется декларировать параметр-массив как const. проверил - работает.

всем спасибо!



Страницы: 1 вся ветка

Текущий архив: 2004.02.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.031 c
6-38978
senya
2003-12-12 14:34
2004.02.13
SMTP Аутентификация


3-38712
Volodya_
2004-01-22 13:02
2004.02.13
QReport


1-38959
$tranger
2004-01-31 21:36
2004.02.13
Проблема с кнопочками


1-38886
yot
2004-02-04 14:02
2004.02.13
Инерпритация


14-39090
InBass Project
2004-01-27 12:36
2004.02.13
Продолжаю творить...