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

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

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

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

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


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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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


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

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


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


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

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

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

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

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

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

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

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

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

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

Скажем так, в С# есть, в Delphi есть, си++ тоже есть (тока вероятно ни на что не влияют)
Можно легко и спокойно обходиться без IDL, если не нужно использовать COM технологию.
13 мар 19, 22:21    [21831887]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Delphi Ответить