powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / строки на стеке
61 сообщений из 61, показаны все 3 страниц
строки на стеке
    #39784735
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все таки как хорошо, что Delphi обнуляет строки на стеке в nil!
...
Рейтинг: 0 / 0
строки на стеке
    #39784755
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747,

плохо что поломался определитель неиспользуемых переменных
...
Рейтинг: 0 / 0
строки на стеке
    #39784837
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)плохо что поломался определитель неиспользуемых переменных

это как? примеры?
...
Рейтинг: 0 / 0
строки на стеке
    #39784838
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747Все таки как хорошо, что Delphi обнуляет строки на стеке в nil!

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

плохо, что Delphi не обнуляет out-параметры и по сути вообще не понимает, что такое out-параметр
...
Рейтинг: 0 / 0
строки на стеке
    #39784863
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochплохо, что Delphi не обнуляет out-параметры и по сути вообще не понимает, что такое out-параметрЕще и как понимает. По этому поводу я даже багрепорт завел. Метод интерфейса, который описан как возвращающий out VARIANT, в делфи объявлен как var OleVariant. В результате - утечки. Меняешь объявление на out - утечки пропадают
...
Рейтинг: 0 / 0
строки на стеке
    #39784907
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

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

Кстати, если ты в процедуре не будешь присваивать out-variant параметр, то предупреждение про отсутсвие result'a или not-initialized var будет ?
...
Рейтинг: 0 / 0
строки на стеке
    #39784910
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochkealon(Ruslan)плохо что поломался определитель неиспользуемых переменных

это как? примеры?
Код: pascal
1.
2.
3.
4.
5.
6.
procedure Test;
var
  s: string;
begin
  s := 'Test';
end;


есть варнинг?
такая же фигня со структурами, Variant
...
Рейтинг: 0 / 0
строки на стеке
    #39784998
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

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

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

и... в данном коде должен быть варнинг не на теме "неиспользуемых переменных", а на тему неиспользуемого присвоенного значения. Но варнинг должен быть, если не отключён программистом.
...
Рейтинг: 0 / 0
строки на стеке
    #39785002
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

ну ни того, ни другого нет на 10-ке, и это пипец
...
Рейтинг: 0 / 0
строки на стеке
    #39785021
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

на любой 10-ке или только на 10.3 (или кто там на сегодня последний) ?
...
Рейтинг: 0 / 0
строки на стеке
    #39785025
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochзначит, с вариантом работает
а с длинными строками - только в ARC

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

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

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

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

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
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;
...
Рейтинг: 0 / 0
строки на стеке
    #39785228
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

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

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

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

вроде всё логично? XE6. или 10-ку сломали?
...
Рейтинг: 0 / 0
строки на стеке
    #39785242
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon,

Код: pascal
1.
2.
3.
4.
5.
- Err1(s, 1);
       mov eax,$004278d4 // S
       call @UStrClr //  := '';
       mov edx,$00000001 // 1
       call Err1
...
Рейтинг: 0 / 0
строки на стеке
    #39785257
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Ariochпропущено...


это как? примеры?
Код: pascal
1.
2.
3.
4.
5.
6.
procedure Test;
var
  s: string;
begin
  s := 'Test';
end;


есть варнинг?
такая же фигня со структурами, Variant
А с чего бы это варнинг должен выдаваться?
может, ты менеджер памяти таким способом тестируешь?
...
Рейтинг: 0 / 0
строки на стеке
    #39785264
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxpc,

out параметр очищается до входа, что не так?
...
Рейтинг: 0 / 0
строки на стеке
    #39785309
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747А с чего бы это варнинг должен выдаваться?
может, ты менеджер памяти таким способом тестируешь?с TRect тоже?
какая доля разработчиков тестирует менеджер памяти?

согласен, что для сложных типов всё что угодно может быть, например вызов локов и пр. - в плюсах это сплошь и рядом, но неправильно это как-то
область жизни переменной должна быть понятна
...
Рейтинг: 0 / 0
строки на стеке
    #39785443
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonвроде всё логично?

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

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

По коду выше - убери вызов Err1 вообще, остальное оставь.
...
Рейтинг: 0 / 0
строки на стеке
    #39785452
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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;
...
Рейтинг: 0 / 0
строки на стеке
    #39785569
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,
При out должна происходить инициализация параметра внутри функции. В делфи инициализация параметра происходит перед вызовом функции, а должна происходить внутри функции. Поэтому при вызове не из делфи будут происходить разного рода пакости. Поэтому в принципе разницы в var и out практически нет. Но для совместимости с кодом из других языков, лучше использовать var и в ручную инициализировать параметр = out.
...
Рейтинг: 0 / 0
строки на стеке
    #39785572
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014,

скажем так, в других языках просто нет ни var ни out, эти нотации в IDL описаны
...
Рейтинг: 0 / 0
строки на стеке
    #39785575
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014,
автора должна происходить внутри функции
а где делфи задолжала?
...
Рейтинг: 0 / 0
строки на стеке
    #39785580
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014При out должна происходить инициализация параметра внутри функции. В делфи инициализация параметра происходит перед вызовом функции, а должна происходить внутри функции.

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

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


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

Семантически разница большая, на мой взгляд.
...
Рейтинг: 0 / 0
строки на стеке
    #39785616
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonziv-2014,
автора должна происходить внутри функции
а где делфи задолжала?
По логике внутри функции.
...
Рейтинг: 0 / 0
строки на стеке
    #39785617
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochэто аналогично тому, что зачистка стека от парамтеров должна выполняться "внутри функции" перед выходом, но вот C делает её снаружи функции после вызова. "и при вызове не из C могут происходить разные пакости"

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

Ariochziv-2014Поэтому в принципе разницы в var и out практически нет
Семантически разница большая, на мой взгляд.

В чем эта разница, кроме того, что при out обязательная инициализация параметра функции внутри функции (хотя не обязательно)
...
Рейтинг: 0 / 0
строки на стеке
    #39785619
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)ziv-2014,
скажем так, в других языках просто нет ни var ни out, эти нотации в IDL описаны

Скажем так, в С# есть, в Delphi есть, си++ тоже есть (тока вероятно ни на что не влияют)
Можно легко и спокойно обходиться без IDL, если не нужно использовать COM технологию.
...
Рейтинг: 0 / 0
строки на стеке
    #39785624
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014,

в с++ ???

в дельфи есть out, safecall, fastcall.

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

PS:не системные языки вроде C# вообще рассматривать смысла нет в данном контексте
...
Рейтинг: 0 / 0
строки на стеке
    #39785683
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)ziv-2014,

в с++ ???

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

Там есть _In_ и _Out_ - но влияют ли они на что-то я не в курсе, хотя и использую. Но работает и с ними и без них.
В принципе они особо и не нужны, главное соблюсти соглашение о вызовах и правильно передать параметры и все будет работать.
Почему не имеет смысла рассматривать С#? Там все это работает и даже есть автоматический маршалинг - костыль, но работы нужно делать меньше в отличие от с++.
...
Рейтинг: 0 / 0
строки на стеке
    #39785687
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)ziv-2014,
PS:не системные языки вроде C# вообще рассматривать смысла нет в данном контексте
Кстати в с# реализовано по умолчанию safecall. У Delphi и С# в плане реализации интерфейсов много общего.
...
Рейтинг: 0 / 0
строки на стеке
    #39785695
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014kealon(Ruslan)ziv-2014,

в с++ ???

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

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

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

в плюсах и си вообще нет такого высокоуровнего понятия как "передача переменной по ссылке"
...
Рейтинг: 0 / 0
строки на стеке
    #39785740
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014makhaonziv-2014,
пропущено...

а где делфи задолжала?
По логике внутри функции.
По какой логике? Где-то описано, что out параметр должен быть явно инициализирован внутри функции?
...
Рейтинг: 0 / 0
строки на стеке
    #39785786
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вспомнил я наконец.

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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
...
Рейтинг: 0 / 0
строки на стеке
    #39785791
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Ariochэто аналогично тому, что зачистка стека от парамтеров должна выполняться "внутри функции" перед выходом, но вот C делает её снаружи функции после вызова. "и при вызове не из C могут происходить разные пакости"

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


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

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

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

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

var - мы берём существующее значений снаружи и модифицируем его, или не модифицируем.
out - мы ничего не берём снаружи и должны полностью сформировать его в функции в любых ветках исполнения
...
Рейтинг: 0 / 0
строки на стеке
    #39785796
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochvar - мы берём существующее значений снаружи и модифицируем его, или не модифицируем.
out - мы ничего не берём снаружи и должны полностью сформировать его в функции в любых ветках исполнениядай ссылочку на стандарт ISO? судиться будем с бракоделой :-)
...
Рейтинг: 0 / 0
строки на стеке
    #39785797
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv, я всё-таки повторю вопрос.
Он, может быть, сам по себе и примитивен - но он IMHO важная отправная точка.

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

А следующий коан будет примерно таким.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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-параметров получим разные результаты.
...
Рейтинг: 0 / 0
строки на стеке
    #39785800
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

давно ли TurboPascal/Delphi стали ISO-пааскалем? хотя когда-нибудь были разве?
...
Рейтинг: 0 / 0
строки на стеке
    #39785805
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вообще, конечно, "никто никому не должен"

и const может разрешать изменение, кто мешает нa const повесить функцию threadvar или volatile?
да никто.
...
Рейтинг: 0 / 0
строки на стеке
    #39785806
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

я это к чему..., говорить о том как должно быть без описания того, как должно быть, довольно странно
...
Рейтинг: 0 / 0
строки на стеке
    #39785808
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonziv-2014пропущено...

По логике внутри функции.
По какой логике? Где-то описано, что out параметр должен быть явно инициализирован внутри функции?
Out - предполагает инициализацию переменной, результат которой будет возвращен.
Си# это делается внутри. По-моему внутри логичнее это делать и более безопасно и совместимо.
...
Рейтинг: 0 / 0
строки на стеке
    #39785814
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochА должна быть обязательной.

Я за то, чтобы инициализация стала обязательной внутри вызываемой функции.
...
Рейтинг: 0 / 0
строки на стеке
    #39785850
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014,

21831754
21832213
...
Рейтинг: 0 / 0
строки на стеке
    #39785874
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014AriochА должна быть обязательной.

Я за то, чтобы инициализация стала обязательной внутри вызываемой функции.
а может там вообще не будет ничего передаваться?
по типу TryGetValue
влупливать код который нафиг не нужен?
...
Рейтинг: 0 / 0
строки на стеке
    #39785876
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

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

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

и это правильно, на то он и out, а не var
...
Рейтинг: 0 / 0
строки на стеке
    #39785878
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я имел в виду метод TDictionary<T,U>, есличё
...
Рейтинг: 0 / 0
строки на стеке
    #39785881
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, если функция написана так, что
kealon(Ruslan)а может там вообще не будет ничего передаваться?

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

Т.е. внешняя инициализация параметров будет всегда выполняться, независимо от того, будет ли изменяться это значение внутри функции. То самое "нафиг не нужен" при внещней инициализации будет с гарантией
...
Рейтинг: 0 / 0
строки на стеке
    #39785884
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Си# это делается внутри.

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

например, у него GC вместо ARC
...
Рейтинг: 0 / 0
строки на стеке
    #39785946
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch, Всегда пишут в out параметр. Это такой же var, только с инициализацией. С var переменной можно ничего не делать, а out минимум надо инициализировать.
...
Рейтинг: 0 / 0
строки на стеке
    #39785960
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)в плюсах и си вообще нет такого высокоуровнего понятия как "передача переменной по ссылке"

в Си нету, в плюсах есть
...
Рейтинг: 0 / 0
строки на стеке
    #39785963
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014out минимум надо инициализировать.

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

21832196
...
Рейтинг: 0 / 0
строки на стеке
    #39786011
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014С var переменной можно ничего не делать, а out минимум надо инициализировать.Где такое написано?

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

Никто же не жалуется, что при возникновении исключения в функции ее результат и значение var/out параметров не определены?
...
Рейтинг: 0 / 0
строки на стеке
    #39786029
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochпо логике, но она не всегда соблюдается

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

В MSDN это написано. И в out параметре не должно быть мусора, там должно быть default значение - если следовать логике MSDN.
...
Рейтинг: 0 / 0
строки на стеке
    #39786031
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_и значение var/out параметров не определены?

как минимум частично они определены: если они managed-типов, то мусора в них быть не может вообще никогда, даже при исключениях
...
Рейтинг: 0 / 0
строки на стеке
    #39786032
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, в си-шарпе вы не сможете откомпилировать программу, пока не инициализируете out параметр.
...
Рейтинг: 0 / 0
строки на стеке
    #39786033
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014out минимум надо инициализировать.

кроме того, ты вроде спорил не про надо/не надо а про то, где это делать, внутри функции или снаружи
...
Рейтинг: 0 / 0
строки на стеке
    #39786035
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014_Vasilisk_, в си-шарпе вы не сможете откомпилировать программу, пока не инициализируете out параметр.

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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;



вот такого рода код в шарпе по умолчанию скомпилируется или нафиг пошлёт ?
...
Рейтинг: 0 / 0
строки на стеке
    #39786044
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014В Delphi да не всегда соблюдается - но как это считать, багом или фичей вот вопрос?


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

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

А в новых версиях гвоорят вообще пц - 21830333
...
Рейтинг: 0 / 0
строки на стеке
    #39786046
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,
Ошибка использование локальной переменной, которой не присвоено значение
...
Рейтинг: 0 / 0
строки на стеке
    #39786055
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochziv-2014В Delphi да не всегда соблюдается - но как это считать, багом или фичей вот вопрос?


Судя по всему - обратной совместимостью.
21830333
Вот и я решил, что это фича, но в контексте interface это конечно ошибка. Поэтому всегда стараюсь использовать var и инициализацию.
...
Рейтинг: 0 / 0
строки на стеке
    #39786120
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Ошибка использование локальной переменной, которой не присвоено значение

Это хорошо.

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

т.е. вместо assignment - binding
...
Рейтинг: 0 / 0
строки на стеке
    #39786121
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014но в контексте interface это конечно ошибка

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

так что я за out :-)
...
Рейтинг: 0 / 0
строки на стеке
    #39786126
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochА однократно-присваиваемые переменный в C# есть?

Не понял тебя? Есть переменные read only. Создал указатель, поменять уже нельзя.
...
Рейтинг: 0 / 0
строки на стеке
    #39786139
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.

Пичалько. Вещь хорошая, но что-то её слишком сильно урезали...
...
Рейтинг: 0 / 0
61 сообщений из 61, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / строки на стеке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]