Войти
ПрограммированиеФорумОбщее

Вопросы по Delphi (34 стр)

Страницы: 133 34 35 3646 Следующая »
#495
19:15, 4 авг 2022

g-cont
> В крестах по дефолту не принято так баловаться с исключениями, а тем более
> вообще их выключать.
> А вот в Делфи это наверное часть идеологии.
Где ты это видел? За этим ещё больше нужен глаз да глаз. Где-то отключил, надо обязательно включить.

#496
(Правка: 21:31) 21:26, 4 авг 2022

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?

#497
3:03, 5 авг 2022

skalogryz
> можно замарочиться и не вручную:

 TIntVec = specialize TVec<integer>;

Что-то мн кажется этот фокус не прокатит с классами в дельфи.

#498
3:37, 5 авг 2022

samrrr
> Что-то мн кажется этот фокус не прокатит с классами в дельфи.
У меня как-то так:
https://github.com/MrShoor/AvalancheProject/blob/master/Utils/avcontnrs.pas
Работает и в делфи и в лазарусе.
+ поскольку оно на интерфейсах - парится по поводу очистки памяти не надо

#499
5:50, 5 авг 2022

MrShoor
> У меня как-то так:
То-есть сделать нормальный массив в дельфи можно, но для этого прийдётся свой велосипед пилить?

#500
(Правка: 5:52) 5:52, 5 авг 2022

skalogryz
> переменные объявляются строго в секции var?
Это самый эпичный фейл языка. В итоге написание любой функции на паскале начинается с копирования var из другой функции.

#501
(Правка: 5:58) 5:57, 5 авг 2022

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 совсем и пересесть на кроссплатформенный и бесплатный фрипаскаль.

#502
6:14, 5 авг 2022

=A=L=X=
> Там у где у Delphi TList:
> https://docwiki.embarcadero.com/CodeExamples/Sydney/en/Generics_C…
> ctions_TList_(Delphi)
>

List := TList<Integer>.Create;
List.Free;

Руками всё это прописывать надо. О чём я и говорю.

#503
6:17, 5 авг 2022

=A=L=X=
> кроссплатформенный и бесплатный фрипаскаль.
а чё с .dfm их фрипаскать съест?

#504
6:43, 5 авг 2022

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 сделано и... работает. Прошлый век, но ужасность проблемы преувеличена. Если совсем неохота думать про аллокации и циркулярные ссылки, то надо сдриснуть тогда в ужасе и из плюсов в Сишарп.

#505
17:48, 5 авг 2022

=A=L=X=
> Если совсем неохота думать про аллокации и циркулярные ссылки,
Дело не в аллокациях, еслиб я писал код на дельфи, мне бы быстро надоело постоянно писать конструкторы деструкторы, когда компилятор мог бы и сам их добавить запросто.

#506
19:26, 5 авг 2022

samrrr
> Руками всё это прописывать надо.
не всё. А только то, чему ты выделяешь память. Да и то, может на автомате прописаться на уничтожение (по крайней мере в FPC).
Это правила хорошего тона, подчищать за собой. Как и везде.

#507
21:06, 5 авг 2022

Mirrel
> Это правила хорошего тона, подчищать за собой. Как и везде.
А почему этим должен заниматься я, а не компилятор например?

#508
(Правка: 22:29) 22:27, 5 авг 2022

MrShoor
> А почему этим должен заниматься я, а не компилятор например?
может быть потому что ты лучше знаешь, чем компилятор когда нужно освободить память.

вот зачем в шарпе IDisposable? а память не является таким же ресурсом?

Disposable тоже может кровушки попить

#509
22:33, 5 авг 2022

В шарповских программах бардак обычно понажористей, чем в дельфевых, хотя там вроде как автоматика за всем следит. "Раз тебе помогают, значит можно не думать" - видимо так считает большинство программистов и таки не думает, что дает вполне прогнозируемый результат.
В этом отношении С++ лучше тем, что там все взрывается сразу, если не подумаешь. Никакой надежды даже на иллюзию работоспособности.

Страницы: 133 34 35 3646 Следующая »
ПрограммированиеФорумОбщее