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

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

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

Программы, написанные на Делфи, после крэша почему-то продолжают работать и я уже не понимаю что с ними происходит в этот момент.
Чёрт его знает, как это устроено.

#496
15:12, 4 авг 2022

g-cont
> Программы, написанные на Делфи, после крэша почему-то продолжают работать и я
> уже не понимаю что с ними происходит в этот момент.
> Чёрт его знает, как это устроено.
Вангую что ты можешь представить себе что каждая отдельная функция/метод обернут в трай кэтч.
И продолжение работы это просто скип данной функции.

#497
(Правка: 15:41) 15:40, 4 авг 2022

g-cont
> Программы, написанные на Делфи, после крэша почему-то продолжают работать
А почему бы и нет?

#498
15:46, 4 авг 2022

g-cont
> Чёрт его знает, как это устроено.
https://docs.microsoft.com/ru-ru/cpp/cpp/structured-exception-han… view=msvc-170

...
__declspec(noinline) void TestCPPEX()
{
#ifdef CPPEX
    printf("Throwing C++ exception\r\n");
    throw std::exception("");
#else
    printf("Triggering SEH exception\r\n");
    volatile int *pInt = 0x00000000;
    *pInt = 20;
#endif
}

__declspec(noinline) void TestExceptions()
{
    TestClass d;
    TestCPPEX();
}

int main()
{
    __try
    {
        TestExceptions();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        printf("Executing SEH __except block\r\n");
    }

    return 0;
}
#499
16:27, 4 авг 2022

=A=L=X=
В крестах по дефолту не принято так баловаться с исключениями, а тем более вообще их выключать.
А вот в Делфи это наверное часть идеологии.

#500
16:32, 4 авг 2022

Aslan
> А почему бы и нет?
А что можно гарантировать в такой ситуации? Не думаю что всё это детально тестировалось.

#501
16:34, 4 авг 2022

=A=L=X=
> __try
BRUTAL TRY! Handle anything!

#502
17:14, 4 авг 2022

g-cont
> а тем более вообще их выключать.

Так никто ничего не выключает.

> А вот в Делфи это наверное часть идеологии.

Идеология не при чём - просто в какой то момент реализацию исключений полностью реализовали вокруг майкрософтовского механизма Structured Exception Handling который встроен в MS Windows и как последствие EAccessViolation просто одно из возможных исключений в Дельфи.

#503
(Правка: 17:49) 17:47, 4 авг 2022

  Краши в Паскале обычно легко отлавливаются(например, где-то указатель не инициализирован или массив). Но есть еще такой тип ошибок как логический, то есть, когда функционал программы работает не так как ожидается. Куда более трудно устранимое явление. Эти ошибки зачастую хоть и не вызывают крашей, но являются неприятным моментом при тестировании и тут уже любой компилятор бессилен(так как комп тупо не знает, какой функционал программист хочет заложить в ту или иную программу).

#504
19:15, 4 авг 2022

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

#505
(Правка: 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?

#506
3:03, 5 авг 2022

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

 TIntVec = specialize TVec<integer>;

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

#507
3:37, 5 авг 2022

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

#508
5:50, 5 авг 2022

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

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

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

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