|
|
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
ziv-2014, в с++ ??? в дельфи есть out, safecall, fastcall. в мс-плюсах есть thiscall, Vectorcall и что? это всего лишь декларации, которые все условно говоря фигачат как хотят PS:не системные языки вроде C# вообще рассматривать смысла нет в данном контексте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 00:18 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)ziv-2014, в с++ ??? PS:не системные языки вроде C# вообще рассматривать смысла нет в данном контексте Там есть _In_ и _Out_ - но влияют ли они на что-то я не в курсе, хотя и использую. Но работает и с ними и без них. В принципе они особо и не нужны, главное соблюсти соглашение о вызовах и правильно передать параметры и все будет работать. Почему не имеет смысла рассматривать С#? Там все это работает и даже есть автоматический маршалинг - костыль, но работы нужно делать меньше в отличие от с++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 09:37 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)ziv-2014, PS:не системные языки вроде C# вообще рассматривать смысла нет в данном контексте Кстати в с# реализовано по умолчанию safecall. У Delphi и С# в плане реализации интерфейсов много общего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 09:39 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
ziv-2014kealon(Ruslan)ziv-2014, в с++ ??? PS:не системные языки вроде C# вообще рассматривать смысла нет в данном контексте Там есть _In_ и _Out_ - но влияют ли они на что-то я не в курсе, хотя и использую. Но работает и с ними и без них. В принципе они особо и не нужны, главное соблюсти соглашение о вызовах и правильно передать параметры и все будет работать. это называется SAL в плюсах и си вообще нет такого высокоуровнего понятия как "передача переменной по ссылке" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 09:49 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
ziv-2014makhaonziv-2014, пропущено... а где делфи задолжала? По логике внутри функции. По какой логике? Где-то описано, что out параметр должен быть явно инициализирован внутри функции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 10:35 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
Вспомнил я наконец. Косяки именно с не-managed типами в out-параметрах! Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. И 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.03.2019, 11:15 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
ziv-2014Ariochэто аналогично тому, что зачистка стека от парамтеров должна выполняться "внутри функции" перед выходом, но вот C делает её снаружи функции после вызова. "и при вызове не из C могут происходить разные пакости" Все верно в с соглашение о вызовах cdecl по-умолчанию и очистка стека происходит снаружи функции. Ну а в соглашении о вызовах Delphi fastcall - инициализация out-параметров managed-типов так же "происходит снаружи функции" ziv-2014Ariochпропущено... Семантически разница большая, на мой взгляд. В чем эта разница, кроме того, что при out обязательная инициализация параметра функции внутри функции (хотя не обязательно) А должна быть обязательной. var - мы берём существующее значений снаружи и модифицируем его, или не модифицируем. out - мы ничего не берём снаружи и должны полностью сформировать его в функции в любых ветках исполнения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 11:21 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
Ariochvar - мы берём существующее значений снаружи и модифицируем его, или не модифицируем. out - мы ничего не берём снаружи и должны полностью сформировать его в функции в любых ветках исполнениядай ссылочку на стандарт ISO? судиться будем с бракоделой :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 11:27 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
ziv, я всё-таки повторю вопрос. Он, может быть, сам по себе и примитивен - но он IMHO важная отправная точка. AriochНа самом деле "инициализация внутри функции" означает просто работу с мусором в памяти. Вот передаю я в функцию IUnknown(GarbagePtr^) - что сделает функция для инициализации? вызовет GarbagePtr^._Release() - оппаньки! А следующий коан будет примерно таким. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. В зависимости от места зануления out-managed-параметров получим разные результаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 11:27 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), давно ли TurboPascal/Delphi стали ISO-пааскалем? хотя когда-нибудь были разве? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 11:28 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
а вообще, конечно, "никто никому не должен" и const может разрешать изменение, кто мешает нa const повесить функцию threadvar или volatile? да никто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 11:29 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
Arioch, я это к чему..., говорить о том как должно быть без описания того, как должно быть, довольно странно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 11:29 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
makhaonziv-2014пропущено... По логике внутри функции. По какой логике? Где-то описано, что out параметр должен быть явно инициализирован внутри функции? Out - предполагает инициализацию переменной, результат которой будет возвращен. Си# это делается внутри. По-моему внутри логичнее это делать и более безопасно и совместимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 11:29 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
AriochА должна быть обязательной. Я за то, чтобы инициализация стала обязательной внутри вызываемой функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 11:33 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
ziv-2014AriochА должна быть обязательной. Я за то, чтобы инициализация стала обязательной внутри вызываемой функции. а может там вообще не будет ничего передаваться? по типу TryGetValue влупливать код который нафиг не нужен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 12:09 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), плохой пример TryGetValue ВСЕГДА пишет в out-параметр и это правильно, на то он и out, а не var ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 12:10 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
я имел в виду метод TDictionary<T,U>, есличё ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 12:11 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
Кстати, если функция написана так, что kealon(Ruslan)а может там вообще не будет ничего передаваться? ...то внешняя, вызывающая программа тем более этого знать не может. Т.е. внешняя инициализация параметров будет всегда выполняться, независимо от того, будет ли изменяться это значение внутри функции. То самое "нафиг не нужен" при внещней инициализации будет с гарантией ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 12:13 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
ziv-2014Си# это делается внутри. у C# нету "мусора в памяти" в контексте переменных и указателей на переменные например, у него GC вместо ARC ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 12:15 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
Arioch, Всегда пишут в out параметр. Это такой же var, только с инициализацией. С var переменной можно ничего не делать, а out минимум надо инициализировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 13:28 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)в плюсах и си вообще нет такого высокоуровнего понятия как "передача переменной по ссылке" в Си нету, в плюсах есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 13:38 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
ziv-2014С var переменной можно ничего не делать, а out минимум надо инициализировать.Где такое написано? Если мы вызвали функцию и функция вернула в качестве результата ошибку, то в out параметре допустим любой мусор. Вначале проверяем результат функции, а потом обращаемся к параметру. Никто же не жалуется, что при возникновении исключения в функции ее результат и значение var/out параметров не определены? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 14:09 |
|
||
|
строки на стеке
|
|||
|---|---|---|---|
|
#18+
Ariochпо логике, но она не всегда соблюдается В Delphi да не всегда соблюдается - но как это считать, багом или фичей вот вопрос? _Vasilisk_Где такое написано? В MSDN это написано. И в out параметре не должно быть мусора, там должно быть default значение - если следовать логике MSDN. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2019, 14:21 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39785805&tid=2039696]: |
0ms |
get settings: |
9ms |
get forum list: |
21ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
196ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
85ms |
get tp. blocked users: |
2ms |
| others: | 240ms |
| total: | 579ms |

| 0 / 0 |
