tag:blogger.com,1999:blog-1702873441071265539.post7652629349964879636..comments2023-05-29T19:02:20.570+03:00Comments on Блог GunSmoker-а: Задачка №26GunSmokerhttp://www.blogger.com/profile/15611696588191431330noreply@blogger.comBlogger9125tag:blogger.com,1999:blog-1702873441071265539.post-47584585700824399852022-01-14T19:47:12.645+03:002022-01-14T19:47:12.645+03:00О, мы как раз с этим столкнулись 2 года назад, и к...О, мы как раз с этим столкнулись 2 года назад, и как раз в EurekaLog (модуль EPNG.pas)!<br />Но только в 64-битном Delphi. 32-битный компилятор нормально работал, не выделял дополнительную память, а Result трактовал как var-параметр.<br />Почему-то 64-битный компилятор делал именно так, как Вы пишете, создавал временную переменную. Почему так — я не помню уже, 2 года прошло. Видимо, из-за каких-то особенностей вложенных функций в Win64.Денисhttps://www.blogger.com/profile/09629860852735514784noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-45189765937178953662020-11-12T09:50:23.694+03:002020-11-12T09:50:23.694+03:00deflateInit - это макрос, а реальная функция там к...deflateInit - это макрос, а реальная функция там как раз deflateInit_: https://refspecs.linuxbase.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/zlib-deflateinit.htmlGunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-80891536087343843452020-11-12T09:46:50.035+03:002020-11-12T09:46:50.035+03:00Ага, спасибо, подправил. Опечатка.Ага, спасибо, подправил. Опечатка.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-21328623045490837432020-11-12T08:32:38.285+03:002020-11-12T08:32:38.285+03:00в описании этой функци указано всего 2 параметра, ...в описании этой функци указано всего 2 параметра, см https://zlib.net/manual.htmlVladimir Srednikhhttps://www.blogger.com/profile/09924860106042516289noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-16181171656591405292020-11-12T08:28:15.301+03:002020-11-12T08:28:15.301+03:00че-то в конце многовато скобок.
Одна лишняя?че-то в конце многовато скобок.<br />Одна лишняя?Vladimir Srednikhhttps://www.blogger.com/profile/09924860106042516289noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-65042066971201664542020-08-29T13:55:35.861+03:002020-08-29T13:55:35.861+03:00Горячо.Горячо.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-87628295492659718932020-08-29T13:51:50.408+03:002020-08-29T13:51:50.408+03:00Может, оригинальная библиотека полагает TZStreamRe...Может, оригинальная библиотека полагает TZStreamRec неперемещаемым (некопируемым)? Тогда result может указывать на временную переменную вместо настоящей цели присваивания, и если ZLib зачем-нибудь сохраняет указатель на z_streamp (TZStreamRec), он сломается. Пример: если есть функция f(var a: SomeType), то код a := f(a) будет выполнен как temp := f(a); a := temp, чтобы когда функция начнёт писать что-то в результат, это не вызвало неожиданных изменений ссылочного параметра <b>a</b>.Рика Ичиносеhttps://www.blogger.com/profile/08974961840717162086noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-55710534377030934982020-08-17T13:05:42.800+03:002020-08-17T13:05:42.800+03:00ZLib - это C библиотека, она в проект подключается...ZLib - это C библиотека, она в проект подключается через уже скомпилированные .obj. Соответственно, C понятия не имеет про автофинализируемые типы Delphi. Следовательно, автофинализируемых типов в TZStreamRec нет.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-63496644701629996572020-08-17T09:53:48.208+03:002020-08-17T09:53:48.208+03:00Может быть, не финализируется Result перед выполне...Может быть, не финализируется Result перед выполнением FillChar?Dmitro25https://www.blogger.com/profile/12046945578640649999noreply@blogger.com