аналог static в lazarus

Вопросы программирования и использования среды Lazarus.

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

Ответить
serge#LVL
новенький
Сообщения: 13
Зарегистрирован: 19.08.2016 12:17:36

аналог static в lazarus

Сообщение serge#LVL »

Доброго времени суток!

В Си есть переменные класса памяти static, которые инициируются один раз и сохраняют свое значение после выхода из функции. Вопрос: есть аналог в лазарус или использовать глобальные переменные?
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: аналог static в lazarus

Сообщение SSerge »

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

procedure TForm1.Button1Click(Sender: TObject);
const
 d : Double = 1.0;
begin
 d := d * 2;
 ShowMessage(Format("%.2f",[d]));
end;


...но сама идея эту методику использовать, очень нехороша, поскольку может повлечь трудно диагностируемые ошибки
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Re: аналог static в lazarus

Сообщение Снег Север »

SSerge писал(а):поскольку может повлечь трудно диагностируемые ошибки

Только при редкостной криворукости программиста
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: аналог static в lazarus

Сообщение SSerge »

Снег Север писал(а):Только при редкостной криворукости программиста


да никаких редкостей на самом деле. Зависит напрямую от того, что именно программист поместит в такого рода переменную, особенно если он склонен к извращениям в виде оптимальных красивостей и использования неявных способностей своего инструментария. :D
serge#LVL
новенький
Сообщения: 13
Зарегистрирован: 19.08.2016 12:17:36

Re: аналог static в lazarus

Сообщение serge#LVL »

SSerge,
спасибо, за подсказку.
Но разве можно константу изменять или такое объявление const d: integer = 0 не является константой?

Добавлено спустя 16 минут 41 секунду:
Типизированные константы.
Могут быть изменены, если {$WriteableConst On}
fedan
новенький
Сообщения: 70
Зарегистрирован: 15.09.2016 20:18:48

Re: аналог static в lazarus

Сообщение fedan »

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

unit Unit1;

{$mode objfpc}{$H+}

interface

function Func1: integer;
function Func2: integer;

implementation

type

  { TMyClass }

  TMyClass = class
    field: integer;
    constructor Create;
  end;

  TMyRec = record
    field: integer;
  end;

constructor TMyClass.Create;
begin
  field := 0;
end;

var
  MyClass: TMyClass = nil;
  MyRec: TMyRec = (field: 0);

function Func1: integer;
begin
  if MyClass = nil then
    MyClass := TMyClass.Create;

  Inc(MyClass.field);
  Result := MyClass.field;
end;

function Func2: integer;
begin
  Inc(MyRec.field);
  Result := MyRec.field;
end;

end.


Как-то так примерно.

Ещё можно увидеть в модулях динамической загрузки библиотек (dglOpenGL)

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

  if GL_LibHandle = nil then
     InitOpenGL;
DedFrend
постоялец
Сообщения: 157
Зарегистрирован: 25.11.2018 11:21:50

Re: аналог static в lazarus

Сообщение DedFrend »

А я тоже скажу, что это чрезвычайно плохая практика. Чем вам глобальные переменные не нравятся? Они специально для таких вещей существуют и видны сразу. Если хочется ввести такую внешнюю вещь к процедуре, то что-то не так со структурой программы.
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Re: аналог static в lazarus

Сообщение Alex2013 »

Вполне рабочая штука ... иногда позволяет не слабо экономить быстродействие за счет однократных операций инициализации(без освобождения) (стандартная практика инициализации/освобождения мало того, что бывает изрядно тормозной, так еще и может приводить к ошибкам - особенно если в инициализации/освобождении используется кривой внешний код на С++(как в OpenCV ) ) ....
"Трудно диагностируемых ошибок" не замечал... просто нужно знать, что переменная сохраняется. а вот клепать 100500 глобальных переменных (или полей в классе) если переменная, кроме одной единственной процедуры, нигде не встречается ИМХО полный моветон !
Аватара пользователя
Cheb
энтузиаст
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34
Контактная информация:

Re: аналог static в lazarus

Сообщение Cheb »

ИМО, более правильный подход всё таки - объявить её как class var.
Для читаемости кода нагляднее.
MylnikovDm
постоялец
Сообщения: 103
Зарегистрирован: 15.02.2007 20:26:10
Откуда: Челябинск

Re: аналог static в lazarus

Сообщение MylnikovDm »

Разница между глобальными переменными в pascal и static в функциях C только в области видимости. В остальном это одно и тоже. В обоих случаях компилятор выделяет область памяти в общем пуле программы и инициализирует данную переменную значением на этапе компиляции.

В некоторых случаях способ, который реализован в C, удобнее, но в целом отсутствие этой "фичи" в pascal писать на нём программы не мешает. С точки зрения быстродействия разницы нет.
Ответить