Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / строки на стеке / 25 сообщений из 61, страница 1 из 3
12.03.2019, 06:34
    #39784735
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
строки на стеке
Все таки как хорошо, что Delphi обнуляет строки на стеке в nil!
...
Рейтинг: 0 / 0
12.03.2019, 09:33
    #39784755
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
строки на стеке
Cobalt747,

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

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

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

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

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

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

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


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

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

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

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

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

на любой 10-ке или только на 10.3 (или кто там на сегодня последний) ?
...
Рейтинг: 0 / 0
12.03.2019, 18:18
    #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
13.03.2019, 10:51
    #39785228
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
строки на стеке
Arioch,

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

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

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

вроде всё логично? XE6. или 10-ку сломали?
...
Рейтинг: 0 / 0
13.03.2019, 11:18
    #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
13.03.2019, 11:34
    #39785257
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
строки на стеке
kealon(Ruslan)Ariochпропущено...


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


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

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

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

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

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

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

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

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

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


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

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

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

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

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

Скажем так, в С# есть, в Delphi есть, си++ тоже есть (тока вероятно ни на что не влияют)
Можно легко и спокойно обходиться без IDL, если не нужно использовать COM технологию.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / строки на стеке / 25 сообщений из 61, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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