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

Откуда:
Сообщений: 2120
Все таки как хорошо, что Delphi обнуляет строки на стеке в nil!
12 мар 19, 06:34    [21829916]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
kealon(Ruslan)
Member

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

плохо что поломался определитель неиспользуемых переменных
12 мар 19, 09:33    [21829956]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
Arioch
Member

Откуда:
Сообщений: 11038
kealon(Ruslan)
плохо что поломался определитель неиспользуемых переменных


это как? примеры?
12 мар 19, 12:56    [21830161]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
Arioch
Member

Откуда:
Сообщений: 11038
Cobalt747
Все таки как хорошо, что Delphi обнуляет строки на стеке в nil!


вероятно, только длинный строки, которые ARC

плохо, что Delphi не обнуляет out-параметры и по сути вообще не понимает, что такое out-параметр
12 мар 19, 12:57    [21830163]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11192
Arioch
плохо, что Delphi не обнуляет out-параметры и по сути вообще не понимает, что такое out-параметр
Еще и как понимает. По этому поводу я даже багрепорт завел. Метод интерфейса, который описан как возвращающий out VARIANT, в делфи объявлен как var OleVariant. В результате - утечки. Меняешь объявление на out - утечки пропадают
12 мар 19, 13:40    [21830217]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
Arioch
Member

Откуда:
Сообщений: 11038
_Vasilisk_,

значит, с вариантом работает
а с длинными строками - только в ARC

Кстати, если ты в процедуре не будешь присваивать out-variant параметр, то предупреждение про отсутсвие result'a или not-initialized var будет ?
12 мар 19, 14:55    [21830327]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5192
Arioch
kealon(Ruslan)
плохо что поломался определитель неиспользуемых переменных


это как? примеры?

procedure Test;
var
  s: string;
begin
  s := 'Test';
end;

есть варнинг?
такая же фигня со структурами, Variant
12 мар 19, 15:00    [21830333]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
Arioch
Member

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

ты меня не спрашивай, у меня нет ничего после xe2 :-)

точнее кажется дома 10.1 стартер, но я его запускал раза 3 не больше.

и... в данном коде должен быть варнинг не на теме "неиспользуемых переменных", а на тему неиспользуемого присвоенного значения. Но варнинг должен быть, если не отключён программистом.
12 мар 19, 17:35    [21830574]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
kealon(Ruslan)
Member

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

ну ни того, ни другого нет на 10-ке, и это пипец
12 мар 19, 17:38    [21830584]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
Arioch
Member

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

на любой 10-ке или только на 10.3 (или кто там на сегодня последний) ?
12 мар 19, 18:04    [21830615]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
Arioch
Member

Откуда:
Сообщений: 11038
Arioch
значит, с вариантом работает
а с длинными строками - только в ARC


тут я какую-то полную дичь написал по запарке

правильно так: классическая Delphi (про LLVM не знаю, вероятно так же) считает long-string out-параметры процедур var-параметрами. Что ещё смешнее, Result long-string функции тоже var-параметр вместо out-параметра.

Таким образом

1) не может быть предупреждения о неинициализированнйо переменной для out-параметра и для var-параметра
2) начальное значение этих таких переменных (включая Result у функций!) не Default(string) - пустое - а ПЕРЕДАЁТСЯ снаружи.

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

procedure Err1(out create_new_value: string; const task: integer);
begin
   case task of
     0: create_new_value := 'aaaa';
//    1: create_new_value := 'bbbb';  -- убили при отлдадке и забыли включить обратно
     2: create_new_value := 'cccc';
//  else create_new_value := 'dddd';
   end;
end;

function Err2(const task: integer): string;
begin
   case task of
     0: Result := '111';
//    1: Result := '222';  
     2: Result := '333';
//  else Result := '444';
   end;
end;

function Err3(const task: integer): string;
begin
   Result := IntToStr(task) + Result;
end;

procedure TestErr; var s: string;
begin
   s := '--------';

   Err1(s, 1); ShowMessage(s);
 // ну тут мы более-менее "морально готовы", что присваивания не будет

   s := Err2(1); ShowMessage(s);  
 // тут тоже присваивания НЕ БУДЕТ, "не верь глазам своим" (с)

   s := Err3(1); ShowMessage(s);   
 // а тут будет передача значения функции из вызывающей программу внутрь функции

   ShowMessage(Err3(1));   
 // а тут будет создание невидимой анонимной переменной, у которой
 //  "хорошо, что Delphi обнуляет строки на стеке в nil!" (c)
 // так что в этом случае всё выглядит нормально и ожидаемо....
 // ...хотя лучше бы Delphi ругалась на использование неинициализированнйо переменной, чес-слово
end;
12 мар 19, 18:18    [21830625]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3339
Arioch,

не понял, что с примером не так?

у меня показало:

пусто
пусто
1
1

вроде всё логично? XE6. или 10-ку сломали?
13 мар 19, 10:51    [21831051]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
Foxpc
Member

Откуда:
Сообщений: 162
makhaon,

- Err1(s, 1);
       mov eax,$004278d4 // S
       call @UStrClr //  := '';
       mov edx,$00000001 // 1
       call Err1
13 мар 19, 11:18    [21831076]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
Cobalt747
Member

Откуда:
Сообщений: 2120
kealon(Ruslan)
Arioch
пропущено...


это как? примеры?

procedure Test;
var
  s: string;
begin
  s := 'Test';
end;

есть варнинг?
такая же фигня со структурами, Variant

А с чего бы это варнинг должен выдаваться?
может, ты менеджер памяти таким способом тестируешь?
13 мар 19, 11:34    [21831099]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3339
Foxpc,

out параметр очищается до входа, что не так?
13 мар 19, 11:40    [21831107]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5192
Cobalt747
А с чего бы это варнинг должен выдаваться?
может, ты менеджер памяти таким способом тестируешь?
с TRect тоже?
какая доля разработчиков тестирует менеджер памяти?

согласен, что для сложных типов всё что угодно может быть, например вызов локов и пр. - в плюсах это сплошь и рядом, но неправильно это как-то
область жизни переменной должна быть понятна
13 мар 19, 12:37    [21831187]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
Arioch
Member

Откуда:
Сообщений: 11038
makhaon
вроде всё логично?


Хммм...
Странно.
Значит, память в чём-то подвела и с out-параметром какой-то другой был глюк.

Но что в какому-то месте FPC понимает отличие out от var, а Delphi нет - факт.
Просто на вскидку не вспомнил точный пример.

По коду выше - убери вызов Err1 вообще, остальное оставь.
13 мар 19, 15:08    [21831417]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
Arioch
Member

Откуда:
Сообщений: 11038
function Err2(const task: integer): string;
begin
case task of
0: Result := '111' + Result;
1: Result := '222' + Result;
2: Result := '333' + Result;
// else Result := '444';
end;
end;

procedure TestO(out s: string);
begin
s := Err2(1);
end;

procedure TestV(var s: string);
begin
s := Err2(2);
end;

procedure TestL();
var s: string;
begin
s := '--------';
s := Err2(0);
Writeln(s);

s := '--------';
TestO(s);
Writeln(s);

s := '--------';
TestV(s);
Writeln(s);
end;
13 мар 19, 15:27    [21831438]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
ziv-2014
Member

Откуда:
Сообщений: 462
Arioch,
При out должна происходить инициализация параметра внутри функции. В делфи инициализация параметра происходит перед вызовом функции, а должна происходить внутри функции. Поэтому при вызове не из делфи будут происходить разного рода пакости. Поэтому в принципе разницы в var и out практически нет. Но для совместимости с кодом из других языков, лучше использовать var и в ручную инициализировать параметр = out.
13 мар 19, 19:19    [21831718]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
kealon(Ruslan)
Member

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

скажем так, в других языках просто нет ни var ни out, эти нотации в IDL описаны
13 мар 19, 19:28    [21831733]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3339
ziv-2014,
автор
а должна происходить внутри функции

а где делфи задолжала?
13 мар 19, 19:31    [21831739]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
Arioch
Member

Откуда:
Сообщений: 11038
ziv-2014
При out должна происходить инициализация параметра внутри функции. В делфи инициализация параметра происходит перед вызовом функции, а должна происходить внутри функции.


это аналогично тому, что зачистка стека от парамтеров должна выполняться "внутри функции" перед выходом, но вот C делает её снаружи функции после вызова. "и при вызове не из C могут происходить разные пакости"

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


ziv-2014
Поэтому в принципе разницы в var и out практически нет


Семантически разница большая, на мой взгляд.
13 мар 19, 19:41    [21831754]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
ziv-2014
Member

Откуда:
Сообщений: 462
makhaon
ziv-2014,
автор
а должна происходить внутри функции

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

По логике внутри функции.
13 мар 19, 22:11    [21831879]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
ziv-2014
Member

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

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

Arioch
ziv-2014
Поэтому в принципе разницы в var и out практически нет

Семантически разница большая, на мой взгляд.

В чем эта разница, кроме того, что при out обязательная инициализация параметра функции внутри функции (хотя не обязательно)
13 мар 19, 22:19    [21831883]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
ziv-2014
Member

Откуда:
Сообщений: 462
kealon(Ruslan)
ziv-2014,
скажем так, в других языках просто нет ни var ни out, эти нотации в IDL описаны

Скажем так, в С# есть, в Delphi есть, си++ тоже есть (тока вероятно ни на что не влияют)
Можно легко и спокойно обходиться без IDL, если не нужно использовать COM технологию.
13 мар 19, 22:21    [21831887]     Ответить | Цитировать Сообщить модератору
 Re: строки на стеке  [new]
kealon(Ruslan)
Member

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

в с++ ???

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

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

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

    в с++ ???

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


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

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

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

    Откуда: Нижневартовск
    Сообщений: 5192
    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
    Сообщений: 3339
    ziv-2014
    makhaon
    ziv-2014,
    пропущено...

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

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

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

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

    Косяки именно с не-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

    Откуда:
    Сообщений: 11038
    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

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

    Откуда:
    Сообщений: 11038
    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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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

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

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


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

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


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

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

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

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

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

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

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

    В MSDN это написано. И в out параметре не должно быть мусора, там должно быть default значение - если следовать логике MSDN.
    14 мар 19, 14:21    [21832596]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 11038
    _Vasilisk_
    и значение var/out параметров не определены?


    как минимум частично они определены: если они managed-типов, то мусора в них быть не может вообще никогда, даже при исключениях
    14 мар 19, 14:22    [21832604]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    ziv-2014
    Member

    Откуда:
    Сообщений: 462
    _Vasilisk_, в си-шарпе вы не сможете откомпилировать программу, пока не инициализируете out параметр.
    14 мар 19, 14:23    [21832605]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

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


    кроме того, ты вроде спорил не про надо/не надо а про то, где это делать, внутри функции или снаружи
    14 мар 19, 14:24    [21832607]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 11038
    ziv-2014
    _Vasilisk_, в си-шарпе вы не сможете откомпилировать программу, пока не инициализируете out параметр.


    с неинициализированной локальной переменнйо можно скомпилировать?

    int i;
    
    switch(j) {
      case 0: i = 1; break;
      case 1: i = 2; break;
      case 2: i = 3; break;
      case 3: i = 4; break;
    };
    
    i = i + 1;
    


    вот такого рода код в шарпе по умолчанию скомпилируется или нафиг пошлёт ?
    14 мар 19, 14:26    [21832614]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 11038
    ziv-2014
    В Delphi да не всегда соблюдается - но как это считать, багом или фичей вот вопрос?


    Судя по всему - обратной совместимостью.
    Частный случай использования неинициализированной переменной.
    Которая в Turbo Pascal не запрещалась.
    И в Delphi по умолчанию - Warning а не Error (хотя я, затрахавшись ловить ошибки, перевёл в Error).

    В XE2 детектор часто даёт false positive, туповат он, приходится делать холостое присваивание.

    А в новых версиях гвоорят вообще пц - 21830333
    14 мар 19, 14:32    [21832626]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    ziv-2014
    Member

    Откуда:
    Сообщений: 462
    Arioch,
    Ошибка использование локальной переменной, которой не присвоено значение
    14 мар 19, 14:33    [21832630]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    ziv-2014
    Member

    Откуда:
    Сообщений: 462
    Arioch
    ziv-2014
    В Delphi да не всегда соблюдается - но как это считать, багом или фичей вот вопрос?


    Судя по всему - обратной совместимостью.
    21830333

    Вот и я решил, что это фича, но в контексте interface это конечно ошибка. Поэтому всегда стараюсь использовать var и инициализацию.
    14 мар 19, 14:40    [21832641]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 11038
    ziv-2014
    Ошибка использование локальной переменной, которой не присвоено значение


    Это хорошо.

    А однократно-присваиваемые переменный в C# есть?

    т.е. вместо assignment - binding
    14 мар 19, 16:08    [21832775]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 11038
    ziv-2014
    но в контексте interface это конечно ошибка


    я предпочитаю в интерфейсе выражать, что я хочу получить, даже если компилятор это не enforsing

    так что я за out :-)
    14 мар 19, 16:12    [21832780]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    ziv-2014
    Member

    Откуда:
    Сообщений: 462
    Arioch
    А однократно-присваиваемые переменный в C# есть?

    Не понял тебя? Есть переменные read only. Создал указатель, поменять уже нельзя.
    14 мар 19, 16:20    [21832790]     Ответить | Цитировать Сообщить модератору
     Re: строки на стеке  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 11038
    https://stackoverflow.com/questions/443687/why-does-c-sharp-disallow-readonly-local-variables

    disallow....


    https://www.c-sharpcorner.com/UploadFile/0c1bb2/read-only-and-constant-in-C-Sharp/
    Readonly can be declared only at class level not inside the method.
    Readonly can not be declared using static keyword because they are by default static.


    Пичалько. Вещь хорошая, но что-то её слишком сильно урезали...
    14 мар 19, 16:38    [21832812]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: 1 2 3      [все]
    Все форумы / Delphi Ответить