[баг?] приведение типов

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

[баг?] приведение типов

Сообщение AlexVinS » 29.06.2009 23:54:23

Есть иерархия типа TObject -> TBase -> TChild. Указатель на объект TChild лежит в переменной объявленной как obj:TObject, я пишу так
Код: Выделить всё
TBase(obj).SomeVirtualMethod();


Метод переопределен в TChild, он и вызывается, но Self почему то становится nil :shock:

А вот так нормально работает:
Код: Выделить всё
TChild(obj).SomeVirtualMethod();


FPC 2.2.2 и 2.2.4
Аватара пользователя
AlexVinS
новенький
 
Сообщения: 95
Зарегистрирован: 27.01.2009 01:18:01

Re: [баг?] приведение типов

Сообщение Max Rusov » 30.06.2009 00:06:54

FPC 2.2.4 - не подтверждается.

Код в студию.
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: [баг?] приведение типов

Сообщение Mr.Smart » 30.06.2009 01:15:28

Self это указатель на самого себя в случае использования классов/объектов.
Код: Выделить всё
type
  TSample = class
  protected
    Val: String;
    procedure proc;
  end;

procedure TSample.proc;
var
Val: Integer;
begin
  Val:=123; // Это обращение к локальной переменной
  self.Val:='Привет!';  // Это обращение к переменной класса
end;

В коде предствлен один из частных случаев доступу к классу из себя самого.
Возможно следующий код будет более понятен:
Код: Выделить всё
type
  TSample = class
   public
      constructor Create;
  end;

var
  List: TList;

constructor TSample.Create;
begin
  List.Add(Self);
end;

Возможно я перемудрил :oops:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: [баг?] приведение типов

Сообщение AlexVinS » 30.06.2009 01:17:58

Max Rusov писал(а):FPC 2.2.4 - не подтверждается.

Код в студию.


На "чистом примере" не воспроизодится. Похоже проблема в другом. капаю)
Аватара пользователя
AlexVinS
новенький
 
Сообщения: 95
Зарегистрирован: 27.01.2009 01:18:01

Re: [баг?] приведение типов

Сообщение AlexVinS » 01.07.2009 03:40:43

Теперь заметил следующее: если в модуль с базовым классом добавить в implementation uses модуль с потомком и больше вообще ничего не менять глюк пропадает, но воспроизвести на чистом примере так и не получается...

Добавлено спустя 30 минут 2 секунды:
Mr.Smart писал(а):Возможно я перемудрил :oops:


Не это все понятно. Конкретно глюк появляется в AV при обращении к полю объекта.

Код: Выделить всё
function TChannelAccount.SetStatus(iNewStatus: int): int;
begin
  Result:=0;
  if _active then //вот тут вылетает
  begin
//дальше много кода еще

Аватара пользователя
AlexVinS
новенький
 
Сообщения: 95
Зарегистрирован: 27.01.2009 01:18:01

Re: [баг?] приведение типов

Сообщение Mr.Smart » 01.07.2009 10:07:52

AlexVinS писал(а):Не это все понятно. Конкретно глюк появляется в AV при обращении к полю объекта.

Код: Выделить всё
function TChannelAccount.SetStatus(iNewStatus: int): int;
begin
  Result:=0;
  if _active then //вот тут вылетает
  begin
//дальше много кода еще


Это свидетельствует о том, что класс несоздан. Посмотрите в коде внимательно происходит ли вызов контструктора класса...
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: [баг?] приведение типов

Сообщение AlexVinS » 01.07.2009 17:04:37

Mr.Smart писал(а):
AlexVinS писал(а):Не это все понятно. Конкретно глюк появляется в AV при обращении к полю объекта.

Код: Выделить всё
function TChannelAccount.SetStatus(iNewStatus: int): int;
begin
  Result:=0;
  if _active then //вот тут вылетает
  begin
//дальше много кода еще


Это свидетельствует о том, что класс несоздан. Посмотрите в коде внимательно происходит ли вызов контструктора класса...


В том то и дело что перед вызовом этого метода. указатель на объект нормальный...

Код: Выделить всё
      function StubSetStatus (p1: PPROTO_INTERFACE; iNewStatus: Integer): Integer; cdecl;
      begin
           Result := TMirandaAccount(p1.obj).SetStatus(iNewStatus); //тут все нормально и p1 и p1.obj  указывают на то что нужно, а внутри SetStatus нет.
      end;
Аватара пользователя
AlexVinS
новенький
 
Сообщения: 95
Зарегистрирован: 27.01.2009 01:18:01

Re: [баг?] приведение типов

Сообщение Mr.Smart » 01.07.2009 17:34:38

Остановитесь в методе SetStatus и сравните значения реального адреса объекта и значение Self.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: [баг?] приведение типов

Сообщение AlexVinS » 02.07.2009 05:27:28

Mr.Smart писал(а):Остановитесь в методе SetStatus и сравните значения реального адреса объекта и значение Self.

см. первое собщение темы.
Аватара пользователя
AlexVinS
новенький
 
Сообщения: 95
Зарегистрирован: 27.01.2009 01:18:01


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru