g-cont
> В крестах по дефолту не принято так баловаться с исключениями, а тем более
> вообще их выключать.
> А вот в Делфи это наверное часть идеологии.
Где ты это видел? За этим ещё больше нужен глаз да глаз. Где-то отключил, надо обязательно включить.
samrrr
> и аналог std::vector приходится вручную освобождать
можно замарочиться и не вручную:
program ideone; {$mode objfpc} {$modeswitch advancedrecords} type generic TVec<T> = record private function GetVal(ofs: integer): T; procedure SetVal( ofs: integer; aval: T); public data: array of T; procedure insert( ofs: integer; const vl: T); property items[ofs: integer]: T read GetVal write SetVal ; default; function Count: Integer; end; TIntVec = specialize TVec<integer>; procedure TVec.insert( ofs: integer; const vl: T); begin if ofs<0 then Exit; if ofs>length( data) then Exit; SetLength( data, length( data)+1); if( ofs < length( data)-1) then move( data[ofs], data[ofs+1], sizeof( vl)*( length( data)-ofs)); data[ofs]:=vl; end; function TVec.GetVal( ofs: integer): T; begin Result:=data[ofs]; end; procedure TVec.SetVal( ofs: integer; aval: T); begin data[ofs]:=aval; end; function TVec.Count: Integer; begin result := length( data); end; var i : integer; iv : TIntVec; begin iv.Insert( 0, 5); iv.Insert( 0, 20); for i:=0 to iv.Count-1 do writeln( iv[i]); end.
а как быть с RAII, если переменные объявляются строго в секции var?
skalogryz
> можно замарочиться и не вручную:
TIntVec = specialize TVec<integer>;
Что-то мн кажется этот фокус не прокатит с классами в дельфи.
samrrr
> Что-то мн кажется этот фокус не прокатит с классами в дельфи.
У меня как-то так:
https://github.com/MrShoor/AvalancheProject/blob/master/Utils/avcontnrs.pas
Работает и в делфи и в лазарусе.
+ поскольку оно на интерфейсах - парится по поводу очистки памяти не надо
MrShoor
> У меня как-то так:
То-есть сделать нормальный массив в дельфи можно, но для этого прийдётся свой велосипед пилить?
skalogryz
> переменные объявляются строго в секции var?
Это самый эпичный фейл языка. В итоге написание любой функции на паскале начинается с копирования var из другой функции.
samrrr
> То-есть сделать нормальный массив в дельфи можно, но для этого прийдётся свой
> велосипед пилить?
В современном паскале дженерики есть. Включая наличие стандартных контейнеров в стандартных библиотеках (как в плюсах).
Проблема в тут в том, что по какой то причине во FreePascal стандартная библиотека контейнеров на дженериках называется по другому, включая названия классов.
Там у где у Delphi TList: https://docwiki.embarcadero.com/CodeExamples/Sydney/en/Generics_C… ctions_TList_(Delphi)
У FreePascal (и как следствие - Lazarus) - TFPGList https://www.freepascal.org/docs-html/rtl/fgl/tfpglist.html
Плюс вот эти мелкие отличия в синтаксисе с которыми надо осторожнее писать кроссплатформенный код.
Технически наверное проще съехать с платной Delphi совсем и пересесть на кроссплатформенный и бесплатный фрипаскаль.
=A=L=X=
> Там у где у Delphi TList:
> https://docwiki.embarcadero.com/CodeExamples/Sydney/en/Generics_C…
> ctions_TList_(Delphi)
>
List := TList<Integer>.Create; List.Free;
Руками всё это прописывать надо. О чём я и говорю.
=A=L=X=
> кроссплатформенный и бесплатный фрипаскаль.
а чё с .dfm их фрипаскать съест?
samrrr
> а чё с .dfm их фрипаскать съест?
В Lazarus делаются файлы с расширением lfm и таким содержимым:
object Form1: TForm1 Left = 256 Height = 240 Top = 127 Width = 320 Caption = 'Form1' ClientHeight = 240 ClientWidth = 320 LCLVersion = '2.2.2.0' object ToggleBox1: TToggleBox Left = 67 Height = 25 Top = 45 Width = 75 Caption = 'ToggleBox1' TabOrder = 0 end object RadioButton1: TRadioButton Left = 141 Height = 19 Top = 110 Width = 91 Caption = 'RadioButton1' TabOrder = 1 end end
Вроде всё то же самое в рамках совместимости.
Она далеко не 100%-ая, но конвертеры базовых вещей есть.
> Руками всё это прописывать надо. О чём я и говорю.
Да, тут паскаль не исправить и я не думаю что и надо. Те же интерфейсы присобачили просто чтобы поддерживать COM в Windows и они выглядят как имхо не очень органично. То как COM работает зауживает правильные способы применения и может даже ставить палки в колёса, а не помогать.
А всё легаси на ручном .Free сделано и... работает. Прошлый век, но ужасность проблемы преувеличена. Если совсем неохота думать про аллокации и циркулярные ссылки, то надо сдриснуть тогда в ужасе и из плюсов в Сишарп.
=A=L=X=
> Если совсем неохота думать про аллокации и циркулярные ссылки,
Дело не в аллокациях, еслиб я писал код на дельфи, мне бы быстро надоело постоянно писать конструкторы деструкторы, когда компилятор мог бы и сам их добавить запросто.
samrrr
> Руками всё это прописывать надо.
не всё. А только то, чему ты выделяешь память. Да и то, может на автомате прописаться на уничтожение (по крайней мере в FPC).
Это правила хорошего тона, подчищать за собой. Как и везде.
Mirrel
> Это правила хорошего тона, подчищать за собой. Как и везде.
А почему этим должен заниматься я, а не компилятор например?
MrShoor
> А почему этим должен заниматься я, а не компилятор например?
может быть потому что ты лучше знаешь, чем компилятор когда нужно освободить память.
вот зачем в шарпе IDisposable? а память не является таким же ресурсом?
Disposable тоже может кровушки попить
В шарповских программах бардак обычно понажористей, чем в дельфевых, хотя там вроде как автоматика за всем следит. "Раз тебе помогают, значит можно не думать" - видимо так считает большинство программистов и таки не думает, что дает вполне прогнозируемый результат.
В этом отношении С++ лучше тем, что там все взрывается сразу, если не подумаешь. Никакой надежды даже на иллюзию работоспособности.