аналог static в lazarus
Модератор: Модераторы
аналог static в lazarus
Доброго времени суток!
В Си есть переменные класса памяти static, которые инициируются один раз и сохраняют свое значение после выхода из функции. Вопрос: есть аналог в лазарус или использовать глобальные переменные?
В Си есть переменные класса памяти static, которые инициируются один раз и сохраняют свое значение после выхода из функции. Вопрос: есть аналог в лазарус или использовать глобальные переменные?
Re: аналог static в lazarus
Код: Выделить всё
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 писал(а):поскольку может повлечь трудно диагностируемые ошибки
Только при редкостной криворукости программиста
Re: аналог static в lazarus
Снег Север писал(а):Только при редкостной криворукости программиста
да никаких редкостей на самом деле. Зависит напрямую от того, что именно программист поместит в такого рода переменную, особенно если он склонен к извращениям в виде оптимальных красивостей и использования неявных способностей своего инструментария.
Re: аналог static в lazarus
SSerge,
спасибо, за подсказку.
Но разве можно константу изменять или такое объявление const d: integer = 0 не является константой?
Добавлено спустя 16 минут 41 секунду:
Типизированные константы.
Могут быть изменены, если {$WriteableConst On}
спасибо, за подсказку.
Но разве можно константу изменять или такое объявление const d: integer = 0 не является константой?
Добавлено спустя 16 минут 41 секунду:
Типизированные константы.
Могут быть изменены, если {$WriteableConst On}
Re: аналог static в lazarus
Код: Выделить всё
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;Re: аналог static в lazarus
А я тоже скажу, что это чрезвычайно плохая практика. Чем вам глобальные переменные не нравятся? Они специально для таких вещей существуют и видны сразу. Если хочется ввести такую внешнюю вещь к процедуре, то что-то не так со структурой программы.
Re: аналог static в lazarus
Вполне рабочая штука ... иногда позволяет не слабо экономить быстродействие за счет однократных операций инициализации(без освобождения) (стандартная практика инициализации/освобождения мало того, что бывает изрядно тормозной, так еще и может приводить к ошибкам - особенно если в инициализации/освобождении используется кривой внешний код на С++(как в OpenCV ) ) ....
"Трудно диагностируемых ошибок" не замечал... просто нужно знать, что переменная сохраняется. а вот клепать 100500 глобальных переменных (или полей в классе) если переменная, кроме одной единственной процедуры, нигде не встречается ИМХО полный моветон !
"Трудно диагностируемых ошибок" не замечал... просто нужно знать, что переменная сохраняется. а вот клепать 100500 глобальных переменных (или полей в классе) если переменная, кроме одной единственной процедуры, нигде не встречается ИМХО полный моветон !
Re: аналог static в lazarus
ИМО, более правильный подход всё таки - объявить её как class var.
Для читаемости кода нагляднее.
Для читаемости кода нагляднее.
-
MylnikovDm
- постоялец
- Сообщения: 103
- Зарегистрирован: 15.02.2007 20:26:10
- Откуда: Челябинск
Re: аналог static в lazarus
Разница между глобальными переменными в pascal и static в функциях C только в области видимости. В остальном это одно и тоже. В обоих случаях компилятор выделяет область памяти в общем пуле программы и инициализирует данную переменную значением на этапе компиляции.
В некоторых случаях способ, который реализован в C, удобнее, но в целом отсутствие этой "фичи" в pascal писать на нём программы не мешает. С точки зрения быстродействия разницы нет.
В некоторых случаях способ, который реализован в C, удобнее, но в целом отсутствие этой "фичи" в pascal писать на нём программы не мешает. С точки зрения быстродействия разницы нет.
