аналог static в lazarus

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

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

аналог static в lazarus

Сообщение serge#LVL » 13.12.2018 22:32:53

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

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

Re: аналог static в lazarus

Сообщение SSerge » 14.12.2018 08:55:17

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
const
d : Double = 1.0;
begin
d := d * 2;
ShowMessage(Format("%.2f",[d]));
end;


...но сама идея эту методику использовать, очень нехороша, поскольку может повлечь трудно диагностируемые ошибки
SSerge
энтузиаст
 
Сообщения: 850
Зарегистрирован: 12.01.2012 05:34:14

Re: аналог static в lazarus

Сообщение Снег Север » 14.12.2018 09:43:01

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

Только при редкостной криворукости программиста
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 1726
Зарегистрирован: 27.11.2007 16:14:47

Re: аналог static в lazarus

Сообщение SSerge » 14.12.2018 11:16:40

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


да никаких редкостей на самом деле. Зависит напрямую от того, что именно программист поместит в такого рода переменную, особенно если он склонен к извращениям в виде оптимальных красивостей и использования неявных способностей своего инструментария. :D
SSerge
энтузиаст
 
Сообщения: 850
Зарегистрирован: 12.01.2012 05:34:14

Re: аналог static в lazarus

Сообщение serge#LVL » 14.12.2018 14:13:14

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

Добавлено спустя 16 минут 41 секунду:
Типизированные константы.
Могут быть изменены, если {$WriteableConst On}
serge#LVL
новенький
 
Сообщения: 13
Зарегистрирован: 19.08.2016 13:17:36

Re: аналог static в lazarus

Сообщение fedan » 14.12.2018 19:17:59

Код: Выделить всё
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;
fedan
новенький
 
Сообщения: 55
Зарегистрирован: 15.09.2016 21:18:48

Re: аналог static в lazarus

Сообщение DedFrend » 14.12.2018 23:36:09

А я тоже скажу, что это чрезвычайно плохая практика. Чем вам глобальные переменные не нравятся? Они специально для таких вещей существуют и видны сразу. Если хочется ввести такую внешнюю вещь к процедуре, то что-то не так со структурой программы.
DedFrend
новенький
 
Сообщения: 21
Зарегистрирован: 25.11.2018 12:21:50

Re: аналог static в lazarus

Сообщение Alex2013 » 15.12.2018 00:23:55

Вполне рабочая штука ... иногда позволяет не слабо экономить быстродействие за счет однократных операций инициализации(без освобождения) (стандартная практика инициализации/освобождения мало того, что бывает изрядно тормозной, так еще и может приводить к ошибкам - особенно если в инициализации/освобождении используется кривой внешний код на С++(как в OpenCV ) ) ....
"Трудно диагностируемых ошибок" не замечал... просто нужно знать, что переменная сохраняется. а вот клепать 100500 глобальных переменных (или полей в классе) если переменная, кроме одной единственной процедуры, нигде не встречается ИМХО полный моветон !
Alex2013
энтузиаст
 
Сообщения: 1247
Зарегистрирован: 03.04.2013 11:59:44

Re: аналог static в lazarus

Сообщение Cheb » 11.01.2019 14:04:27

ИМО, более правильный подход всё таки - объявить её как class var.
Для читаемости кода нагляднее.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 708
Зарегистрирован: 06.06.2005 15:54:34

Re: аналог static в lazarus

Сообщение MylnikovDm » 14.01.2019 11:29:43

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

В некоторых случаях способ, который реализован в C, удобнее, но в целом отсутствие этой "фичи" в pascal писать на нём программы не мешает. С точки зрения быстродействия разницы нет.
MylnikovDm
новенький
 
Сообщения: 92
Зарегистрирован: 15.02.2007 21:26:10
Откуда: Челябинск


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru