tag:blogger.com,1999:blog-1702873441071265539.post5706488664247757126..comments2023-05-29T19:02:20.570+03:00Comments on Блог GunSmoker-а: Задачка №17GunSmokerhttp://www.blogger.com/profile/15611696588191431330noreply@blogger.comBlogger54125tag:blogger.com,1999:blog-1702873441071265539.post-74541758520626256482015-03-08T13:43:04.593+03:002015-03-08T13:43:04.593+03:00PChar(s) возвращает указатель на (null-terminated)...PChar(s) возвращает указатель на (null-terminated) строку, но не изменят счетчик ссылок исходной строки. Исходная строка будет жить, пока на неё есть ссылки, т.е. как минимум до момента, пока из списка не будет удален соответствующий элемент. А потом - как повезет. Если на строку была только одна ссылка, то область памяти, где размещалась строка, может быть использована повторно. В этом случае при обращении к строки из DLL можно получить просто мусор, а можно и ошибку доступа к памяти. <br />Подробнее здесь: http://www.transl-gunsmoker.ru/2009/09/pchars.html#mixing (Использования вместе String и PChar)Антон В. Ильинhttps://www.blogger.com/profile/13265688849437828046noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-46243104972326862372015-03-08T13:42:35.355+03:002015-03-08T13:42:35.355+03:00PChar(s) возвращает указатель на (null-terminated)...PChar(s) возвращает указатель на (null-terminated) строку, но не изменят счетчик ссылок исходной строки. Исходная строка будет жить, пока на неё есть ссылки, т.е. как минимум до момента, пока из списка не будет удален соответствующий элемент. А потом - как повезет. Если на строку была только одна ссылка, то область памяти, где размещалась строка, может быть использована повторно. В этом случае при обращении к строки из DLL можно получить просто мусор, а можно и ошибку доступа к памяти. <br />Подробнее здесь: http://www.transl-gunsmoker.ru/2009/09/pchars.html#mixing (Использования вместе String и PChar)Антон В. Ильинhttps://www.blogger.com/profile/13265688849437828046noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-31388195544316882172014-07-02T02:14:04.478+04:002014-07-02T02:14:04.478+04:00В чём подвох? Код-то работает...
for x:=0 to li...В чём подвох? Код-то работает...<br /><br /> for x:=0 to listbox1.Items.Count-1 do<br /> MessageBox(0,pchar(listbox1.Items[x]),nil,0);<br /><br />Кстати, кто может объяснить по какой причине listbox1.Items[x] на каждой итерации возвращает одну и ту же строку (указатель на один и тот же блок меняющихся данных)? И почему счётчик ссылок на этот блок равен единице и остаётся таким до самого выхода из процедуры, сколько бы ни было дальше кода?Сашаhttp://vk.com/noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-37763710524229409912014-07-01T23:40:33.495+04:002014-07-01T23:40:33.495+04:00Александр, не томи, por favore) Что там с памятью?...Александр, не томи, por favore) Что там с памятью?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-62090859004002729432014-04-07T16:27:24.052+04:002014-04-07T16:27:24.052+04:00Ответа уже не ждать?Ответа уже не ждать?akanoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-26319765507667683302013-12-23T17:01:05.959+04:002013-12-23T17:01:05.959+04:00var X: Integer; // по ГОСТу имена переменных с мел...var X: Integer; // по ГОСТу имена переменных с мелкой буквы нужно! :DAnonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-81932859522768878232013-12-23T15:15:49.286+04:002013-12-23T15:15:49.286+04:00Не знаю каков правильный ответ, но я создал из при...Не знаю каков правильный ответ, но я создал из примера Чудищще... И оно живое... Память как ни странно не ест, но Винда уходит просто в Астрал...<br /><br />library aSomeDll;<br />uses Windows;<br />var w: HWND;<br />procedure SetWND(h: HWND); stdcall;<br />begin<br />w:=h;<br />end;<br />procedure AddToList(Item: PChar); stdcall;<br />begin<br />SetWindowText(w,Item);<br />end;<br />exports SetWND, AddToList;<br />begin<br />end.<br /><br />. . .<br /><br />procedure AddToList(Item: PChar); stdcall; external 'aSomeDll.dll';<br />procedure SetWND(w: HWND); stdcall; external 'aSomeDll.dll';<br />procedure TForm1.FormCreate(Sender: TObject);<br />begin<br />SetWND(Handle);<br />ListBox1.Items.Add('0100');<br />ListBox1.Items.Add('1001');<br />ListBox1.Items.Add('011-');<br />end;<br />procedure TForm1.Button1Click(Sender: TObject);<br />var X: Integer;<br />begin<br />for X:=0 to ListBox1.Items.Count-1 do AddToList(PChar(ListBox1.Items[X]));<br />end;<br />procedure TForm1.Button2Click(Sender: TObject);<br />var X: Integer;<br />begin<br />for X:=0 to MaxInt do Button1.Click;<br />end;<br /><br />Ни в коем случае не запускайте! >:3Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-65040269803546422522013-12-20T01:16:55.362+04:002013-12-20T01:16:55.362+04:00В тонкостях я не мастер, но мне кажется что с PCha...В тонкостях я не мастер, но мне кажется что с PChar всё нормально, подразумеваться же PAnsiChar по умолчанию. Есть и в Windows.pas строки вида:<br />function MessageBox(hWnd: HWND; lpText, lpCaption: <b>PChar</b>; uType: UINT): Integer; stdcall;<br />Насчёт procedure вроде тоже сойдёт, тоже что и void функция. Остальное тоже вроде без помарок, только не понятно направление данных - не dll заполняет лист, а наоборот, странно.<br />Может с ним всё нормально? С:Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-57501960037333367472013-12-09T17:52:08.171+04:002013-12-09T17:52:08.171+04:00Исправте свой косяк var i: word; на то, как показа...Исправте свой косяк <b>var i: word;</b> на то, как показано в примере <b>var i: integer;</b> и уже в новом свете перечитайте лурк ;)Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-11835402680334189022013-12-08T15:05:48.359+04:002013-12-08T15:05:48.359+04:00var i: word;
begin
for i:=0 to List1.Count-1 do
...var i: word;<br />begin<br />for i:=0 to List1.Count-1 do<br /> ShowMessage(List1.Items[i]);<br />...<br /> Если в списке 0 элементов, появится исключение о недопустимом индексе<br />http://lurkmore.to/БыдлокодAnonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-85954611492248658322013-12-04T11:42:07.211+04:002013-12-04T11:42:07.211+04:00Анонимный комментирует...
>Что не так с эт...<i>Анонимный комментирует...<br /><br /> >Что не так с этим кодом?<br /> Всё не так: написан на мертвом языке, вызывается перерисовка ListBox на каждом добавлении из-за отсутствия BeginUpdate/EndUpdate, противоречащие сути ООП антипаттерны. </i><br />Вам и живой язык не поможет с такими понятиями интересными =)<br />Причем тут перерисовка ListBox и ООП ?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-58289745321133005762013-11-29T21:21:29.666+04:002013-11-29T21:21:29.666+04:00Да все тут вроде нормально. Само собой разумеется,...Да все тут вроде нормально. Само собой разумеется, что DLL-ка имеет тот же тип кодировки строк и при вызове AddToList выделит у себя память и скопирует туда текст, а не будет складировать указатели 'на потом' )Anonymoushttps://www.blogger.com/profile/10771504882110746822noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-31877798397737438102013-11-07T11:13:06.458+04:002013-11-07T11:13:06.458+04:00>Что не так с этим кодом?
Всё не так: написан н...>Что не так с этим кодом?<br />Всё не так: написан на мертвом языке, вызывается перерисовка ListBox на каждом добавлении из-за отсутствия BeginUpdate/EndUpdate, противоречащие сути ООП антипаттерны.<br /><br />>как его нужно исправить<br />Переписать на C#, избегая костыльных решенийAnonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-37876801068614917892013-10-31T16:57:02.423+04:002013-10-31T16:57:02.423+04:00Поспешный вывод, с последней публикации всего меся...Поспешный вывод, с последней публикации всего месяц прошел.mínichhttps://www.blogger.com/profile/12425753015806319255noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-1303581243302646142013-10-27T09:43:54.747+04:002013-10-27T09:43:54.747+04:00Судя по всему, блог заброшен, печально ;(Судя по всему, блог заброшен, печально ;(Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-29079318284554445462013-10-21T13:07:47.629+04:002013-10-21T13:07:47.629+04:00При переводе String в PChar может потеряться часть...При переводе String в PChar может потеряться часть строки из-за #0arturnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-25473272909615277982013-10-18T13:18:03.029+04:002013-10-18T13:18:03.029+04:00Хм.. предположу следующее:
PChar(ListBox1.Items[X]...Хм.. предположу следующее:<br />PChar(ListBox1.Items[X]) по-сути создает локальную переменную внутри функции, куда закидывает сей pchar, при выходе из функции эта память станет "неиспользуемой", т.к. в отличии от string, pchar не содержит ссылок использования (или как они там называются))). Соответственно эта память может быть перезаписана чем угодно и при обращении внутри dll, там может оказаться любой мусор)).<br />Я достаточно давно программировал на delphi, но, насколько помню, нужно выделить память отдельно, скопировать туда строку, а потом уже передавать указатель... Ну, а очистку памяти оставим на усмотрение разработчика ;)Anonymoushttps://www.blogger.com/profile/17217107466120905131noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-62785135336521596622013-10-17T19:15:42.512+04:002013-10-17T19:15:42.512+04:00Так что не так с этим кодом-то, две недели вроде б...Так что не так с этим кодом-то, две недели вроде бы как бы прошло уже :)Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-46194257884594752842013-10-08T17:56:43.990+04:002013-10-08T17:56:43.990+04:00> откуда вы это берёте?
жизнь подкидывает приме...> откуда вы это берёте?<br />жизнь подкидывает примеры: http://www.sql.ru/forum/1049047/kak-v-funkci-peredat-massiv-pchar :о)Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-41378896329553131732013-10-07T08:09:19.582+04:002013-10-07T08:09:19.582+04:00Если AddToList сразу обрабатывает строку, или дела...Если AddToList сразу обрабатывает строку, или делает из нее локальную копию и нет путаницы с ansi - widechar, то никаких проблем в коде нет. У меня прекрасно подобный код работает с библиотеками без всяких ошибок. <br /><br />Условие задачи явно неполное, непонятно что происходит внутри dll.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-14566926440644459722013-10-01T12:48:02.965+04:002013-10-01T12:48:02.965+04:00Александр, а можно сначала?
Мне так кажется, что ...Александр, а можно сначала?<br /><br />Мне так кажется, что идеологически dll-ка в плагино-подобном стиле должна выполнять действия по обработки "глобального" хранилища данных, который управляется из ядра?<br />Или как, dll-ка для выполнения своей операции вынуждена "откачивать" себе данных немного?<br />Руки-то чешутся не входить в эту ситуацию, заполнить контейнер в ядре, а dll-ке дать на обработку (блин) указатель на (под)множество хранимых данных?<br /><br />А если посмотреть дальше в сторону разбиения "ядро-dll-ки" на концепцию сервисов с "бесшовным" преодолением адресного пространства, то "транспортное" проталкивание элементов списка по указателю вообще не поедет. <br /><br />Короче :) Можно прикладной контекст дать?Всеволод Леоновhttp://blogs.embarcadero.com/vsevolodleonovnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-62368831425491796912013-10-01T12:34:00.413+04:002013-10-01T12:34:00.413+04:00AddToList предполагает передачу строки из приложен...AddToList предполагает передачу строки из приложения в dll. Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-20510549217679301212013-10-01T01:53:13.917+04:002013-10-01T01:53:13.917+04:00AddToList - предполагает что? ЧТЕНИЕ из переданног...AddToList - предполагает что? ЧТЕНИЕ из переданного указателя? Или ЗАПИСЬ в него?Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-31073855271126276492013-09-30T16:36:44.100+04:002013-09-30T16:36:44.100+04:00>В любом случае здравый смысл подсказывает, что...>В любом случае здравый смысл подсказывает, что я в контексте данной программы буду иметь доступ к элементам списка, и следовательно, смогу корректно освободить память.<br /><br />Не соглашусь. Во-первых это очень кривое API должно быть, а во-вторых, в этом случае в API должна быть оговорка большими красными буквами: мы не копируем строки и у нас нету спец. методов, которые будут дёргать ваш код, чтобы вы могли освободить память, поэтому пользуйтесь итератором по списку для освобождения памяти и не забудьте удалять элементы из списка, после освобождения памяти. А если там ещё и многопоточность будет завязана - вообще труба. Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-62420454641433153012013-09-30T16:10:38.463+04:002013-09-30T16:10:38.463+04:00>Нашу функцию? Зачем?
Как зачем? Если мы выдел...>Нашу функцию? Зачем?<br /><br />Как зачем? Если мы выделили память при помощи StrNew, то dll самостоятельно эту память никаким способом освободить не сможет, поскольку строкой заведует наш менеджер памяти.Anonymousnoreply@blogger.com