Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: строки на стеке  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 4229
ziv-2014,

в с++ ???

  • в дельфи есть out, safecall, fastcall.
  • в мс-плюсах есть thiscall, Vectorcall
    и что? это всего лишь декларации, которые все условно говоря фигачат как хотят

    PS:не системные языки вроде C# вообще рассматривать смысла нет в данном контексте
  • 14 мар 19, 00:18    [21831953]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    ziv-2014
    Member

    Откуда:
    Сообщений: 235
    kealon(Ruslan)
    ziv-2014,

    в с++ ???

    PS:не системные языки вроде C# вообще рассматривать смысла нет в данном контексте


    Там есть _In_ и _Out_ - но влияют ли они на что-то я не в курсе, хотя и использую. Но работает и с ними и без них.
    В принципе они особо и не нужны, главное соблюсти соглашение о вызовах и правильно передать параметры и все будет работать.
    Почему не имеет смысла рассматривать С#? Там все это работает и даже есть автоматический маршалинг - костыль, но работы нужно делать меньше в отличие от с++.
    14 мар 19, 09:37    [21832058]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    ziv-2014
    Member

    Откуда:
    Сообщений: 235
    kealon(Ruslan)
    ziv-2014,
    PS:не системные языки вроде C# вообще рассматривать смысла нет в данном контексте

    Кстати в с# реализовано по умолчанию safecall. У Delphi и С# в плане реализации интерфейсов много общего.
    14 мар 19, 09:39    [21832065]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 4229
    ziv-2014
    kealon(Ruslan)
    ziv-2014,

    в с++ ???

    PS:не системные языки вроде C# вообще рассматривать смысла нет в данном контексте


    Там есть _In_ и _Out_ - но влияют ли они на что-то я не в курсе, хотя и использую. Но работает и с ними и без них.
    В принципе они особо и не нужны, главное соблюсти соглашение о вызовах и правильно передать параметры и все будет работать.

    это называется SAL

    в плюсах и си вообще нет такого высокоуровнего понятия как "передача переменной по ссылке"
    14 мар 19, 09:49    [21832075]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    makhaon
    Member

    Откуда: A galaxy far far away
    Сообщений: 3061
    ziv-2014
    makhaon
    ziv-2014,
    пропущено...

    а где делфи задолжала?

    По логике внутри функции.

    По какой логике? Где-то описано, что out параметр должен быть явно инициализирован внутри функции?
    14 мар 19, 10:35    [21832135]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    Вспомнил я наконец.

    Косяки именно с не-managed типами в out-параметрах!

    procedure Err1(out X: integer; const Y: integer);
    begin
    // жуткая, тупая описка. Но которую хрен заметишь посреди другого кода
    // Должно бы было быть, но ... X := 2 * Y;
      X := 2 * X;
    end; 
    
    procedure TMyApplication.DoRun;
    var
      ErrorMsg: String; n: integer;
    begin
    
      { add your program here }
      Err1( n, 17 );
      Writeln(n);
    
      ReadLn;
      // stop program loop
      Terminate;
    end;
    


    И FPC и Delphi тут выдают мусор со стека.
    Ни FPC ни Delphi не выдают Note/Hint про unused variable Y
    Но FPC (но не Delphi!!!) хотя бы дают
    project1.ppr(25,12) Warning: Variable "X" does not seem to be initialized
    14 мар 19, 11:15    [21832196]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    ziv-2014
    Arioch
    это аналогично тому, что зачистка стека от парамтеров должна выполняться "внутри функции" перед выходом, но вот C делает её снаружи функции после вызова. "и при вызове не из C могут происходить разные пакости"

    Все верно в с соглашение о вызовах cdecl по-умолчанию и очистка стека происходит снаружи функции.


    Ну а в соглашении о вызовах Delphi fastcall - инициализация out-параметров managed-типов так же "происходит снаружи функции"

    ziv-2014
    Arioch
    пропущено...
    Семантически разница большая, на мой взгляд.

    В чем эта разница, кроме того, что при out обязательная инициализация параметра функции внутри функции (хотя не обязательно)


    А должна быть обязательной.

    var - мы берём существующее значений снаружи и модифицируем его, или не модифицируем.
    out - мы ничего не берём снаружи и должны полностью сформировать его в функции в любых ветках исполнения
    14 мар 19, 11:21    [21832204]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 4229
    Arioch
    var - мы берём существующее значений снаружи и модифицируем его, или не модифицируем.
    out - мы ничего не берём снаружи и должны полностью сформировать его в функции в любых ветках исполнения
    дай ссылочку на стандарт ISO? судиться будем с бракоделой :-)
    14 мар 19, 11:27    [21832212]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    ziv, я всё-таки повторю вопрос.
    Он, может быть, сам по себе и примитивен - но он IMHO важная отправная точка.

    Arioch
    На самом деле "инициализация внутри функции" означает просто работу с мусором в памяти.
    Вот передаю я в функцию IUnknown(GarbagePtr^) - что сделает функция для инициализации? вызовет GarbagePtr^._Release() - оппаньки!


    А следующий коан будет примерно таким.
    var x: string; // или любой managed-тип, например iUnknown; TArray<integer>
    
    var method: procedure(out n: string { или любой..... }) of object;
    
    begin
      method := nil; // формируем ошибку
      x := 'zzzzzz';
     
      try
        method(x);
      finally
        Writeln(x);
      end;
    end;
    


    В зависимости от места зануления out-managed-параметров получим разные результаты.
    14 мар 19, 11:27    [21832213]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    kealon(Ruslan),

    давно ли TurboPascal/Delphi стали ISO-пааскалем? хотя когда-нибудь были разве?
    14 мар 19, 11:28    [21832217]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    а вообще, конечно, "никто никому не должен"

    и const может разрешать изменение, кто мешает нa const повесить функцию threadvar или volatile?
    да никто.
    14 мар 19, 11:29    [21832223]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 4229
    Arioch,

    я это к чему..., говорить о том как должно быть без описания того, как должно быть, довольно странно
    14 мар 19, 11:29    [21832224]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    ziv-2014
    Member

    Откуда:
    Сообщений: 235
    makhaon
    ziv-2014
    пропущено...

    По логике внутри функции.

    По какой логике? Где-то описано, что out параметр должен быть явно инициализирован внутри функции?

    Out - предполагает инициализацию переменной, результат которой будет возвращен.
    Си# это делается внутри. По-моему внутри логичнее это делать и более безопасно и совместимо.
    14 мар 19, 11:29    [21832226]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    ziv-2014
    Member

    Откуда:
    Сообщений: 235
    Arioch
    А должна быть обязательной.

    Я за то, чтобы инициализация стала обязательной внутри вызываемой функции.
    14 мар 19, 11:33    [21832236]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    ziv-2014,

    21831754
    21832213
    14 мар 19, 11:54    [21832282]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 4229
    ziv-2014
    Arioch
    А должна быть обязательной.

    Я за то, чтобы инициализация стала обязательной внутри вызываемой функции.

    а может там вообще не будет ничего передаваться?
    по типу TryGetValue
    влупливать код который нафиг не нужен?
    14 мар 19, 12:09    [21832319]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    kealon(Ruslan),

    плохой пример

    TryGetValue ВСЕГДА пишет в out-параметр

    и это правильно, на то он и out, а не var
    14 мар 19, 12:10    [21832321]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    я имел в виду метод TDictionary<T,U>, есличё
    14 мар 19, 12:11    [21832324]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    Кстати, если функция написана так, что
    kealon(Ruslan)
    а может там вообще не будет ничего передаваться?


    ...то внешняя, вызывающая программа тем более этого знать не может.

    Т.е. внешняя инициализация параметров будет всегда выполняться, независимо от того, будет ли изменяться это значение внутри функции. То самое "нафиг не нужен" при внещней инициализации будет с гарантией
    14 мар 19, 12:13    [21832329]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    ziv-2014
    Си# это делается внутри.


    у C# нету "мусора в памяти" в контексте переменных и указателей на переменные

    например, у него GC вместо ARC
    14 мар 19, 12:15    [21832334]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    ziv-2014
    Member

    Откуда:
    Сообщений: 235
    Arioch, Всегда пишут в out параметр. Это такой же var, только с инициализацией. С var переменной можно ничего не делать, а out минимум надо инициализировать.
    14 мар 19, 13:28    [21832460]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    kealon(Ruslan)
    в плюсах и си вообще нет такого высокоуровнего понятия как "передача переменной по ссылке"


    в Си нету, в плюсах есть
    14 мар 19, 13:38    [21832484]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10598
    ziv-2014
    out минимум надо инициализировать.


    по логике, но она не всегда соблюдается

    21832196
    14 мар 19, 13:39    [21832488]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    _Vasilisk_
    Member

    Откуда: Украина, Харьков
    Сообщений: 10771
    ziv-2014
    С var переменной можно ничего не делать, а out минимум надо инициализировать.
    Где такое написано?

    Если мы вызвали функцию и функция вернула в качестве результата ошибку, то в out параметре допустим любой мусор. Вначале проверяем результат функции, а потом обращаемся к параметру.

    Никто же не жалуется, что при возникновении исключения в функции ее результат и значение var/out параметров не определены?
    14 мар 19, 14:09    [21832570]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    ziv-2014
    Member

    Откуда:
    Сообщений: 235
    Arioch
    по логике, но она не всегда соблюдается

    В Delphi да не всегда соблюдается - но как это считать, багом или фичей вот вопрос?
    _Vasilisk_
    Где такое написано?

    В MSDN это написано. И в out параметре не должно быть мусора, там должно быть default значение - если следовать логике MSDN.
    14 мар 19, 14:21    [21832596]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
    Все форумы / Delphi Ответить