Форум: "Основная";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.018 c