Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-38984
Эрик
2003-12-11 08:50
2004.02.13
Как сконвертировать представление ip-адреса в формате IPv4?


14-39061
Thor
2004-01-24 23:58
2004.02.13
Спрятать иконку в Systray...


14-39070
iudjen
2004-01-23 21:40
2004.02.13
по истечении 30 дней программа не работает если не ввел пароль


1-38897
Тимохов
2004-02-04 14:59
2004.02.13
Открытые массивы в параметрах методов и записи.


3-38678
Grayver
2004-01-24 06:42
2004.02.13
запрос





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский