Проблема с использованием статических полей напрямую

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

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

Ответить
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Проблема с использованием статических полей напрямую

Сообщение Brainenjii »

Обращение к статическому полю через свойство напрямую происходит некорректно:

Код: Выделить всё

program Project1;

{$mode objfpc}{$H+}
{$static on}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

{$R *.res}

Type

{ TMyClass }

TMyClass = Class
  Private
    fMyInteger: Integer;  Static;
    fMyString: ShortString; Static;
    Function GetInternalInteger: Integer;
    Function GetInternalString: String;
  Public
    Property MyString: ShortString Read fMyString;
    Property MyInteger: Integer Read fMyInteger;

    Property InternalString: String Read GetInternalString;
    Property InternalInteger: Integer Read GetInternalInteger;
    Constructor Create;
End;

{ TMyClass }

Function TMyClass.GetInternalInteger: Integer;
Begin
  Result := fMyInteger;
end;

Function TMyClass.GetInternalString: String;
Begin
  Result := fMyString;
end;

Constructor TMyClass.Create;
Begin
  fMyInteger := 100;
  fMyString := 'hello world';
End;

begin
  With TMyClass.Create Do
    Begin
      WriteLn(MyInteger); // <- Мусор
      WriteLn(MyString); // <- Пустая строка

      WriteLn(InternalInteger); // <- 100
      WriteLn(InternalString); // <- Hello world
      Free;
    End;
end.
MageSlayer
постоялец
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Сообщение MageSlayer »

И из каких соображений вы запостили это тут, а не на баг-трекер?
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Я сначала думал, что это я неправильно обращаюсь к статическим полям (пост много раз корректировался). После полутора часов экспериментов свёл к этому варианту
Kitayets
постоялец
Сообщения: 174
Зарегистрирован: 05.05.2010 21:15:24

Сообщение Kitayets »

А вы разве не знали что свойства (property) нельзя передавать как аргумент в функции и процедуры?

сделайте поля публичными и передавайте их в процедуру, либо введите временные переменные и передайте им значения свойств, после чего передавайте в процедуру.

ИМХО ошибка тут одна - компилятор должен был выдать ошибку при попытки передать свойство в процедуру.
Ask
постоялец
Сообщения: 163
Зарегистрирован: 25.12.2008 02:51:37

Сообщение Ask »

Kitayets писал(а):свойства (property) нельзя передавать как аргумент в функции и процедуры?

Надеюсь, это была шутка.

Brainenjii: Я считаю, что баг-репорт закрыли зря. Как минимум, компилятор должен выдавать ошибку,
а ещё лучше просто работать -- не вижу, почему нормальное свойство не может обращаться к статической переменной.
ИМХО это максимум тянет на warning. Попробую побороться.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Kitayets, что-то я не вижу в коде криминала. Плохо смотрю?
Kitayets
постоялец
Сообщения: 174
Зарегистрирован: 05.05.2010 21:15:24

Сообщение Kitayets »

прошу извинить, попутал. свойство нельзя передавать по ссылке (через var параметр), а в обычном случае, при передаче по значению, видимо должна создаться автоматическая переменная.
Ответить