![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глупый вопрос: Pchar ->string [D6, WinME]
pavel_ak © (2002-12-14 21:04:00)Была же простая функция для перевода PChar в string. Но я ее забыл. В helpe искал - не нашел. Может кто вспомнет навскидку?
Dok_3D (2002-12-25 06:26:00) [1]2 All
Честное слово, мне бы ваши заботы ...
Alex Konshin (2002-12-25 06:06:00) [2]String имеет заголовок размером в 12, реально адрес указывает на конец этого заголовка и на первый символ строки.
Это ссылка на мою старую, коротенькую, но полезную для начинающих статью про String:
http://akzhan.midi.ru/devcorner/akdeltnt-content/akdeltnt-0033.html
GrayWolf (2002-12-24 21:32:00) [3]Народ, а вам функция StrPas не пойдет? Она правда преобразует PChar в AnsiString, но в большинстве случаев другого на мой взгляд и не требуется... ))
ssg_ (2002-12-22 11:20:00) [4]А как преобразовать строку из TStringList в PWideChar, например для ExtractAssociatedIcon
ssg_ (2002-12-22 11:06:00) [5]А как преобразовать строку из TStringList в PWideChar, например для ExtractAssociatedIcon
Питьливый ум (2002-12-16 20:53:00) [6]2 Зорький глаз (16.12.02 20:34)
И часто этим пользуешься?
Зорький глаз (2002-12-16 20:34:00) [7]А еще разница между integer(2) и integer(4) в том, что применение операции and $02 с первым и вторым со втором даст нулевой результат, а с первым - ненулевой ....
Sha (2002-12-16 19:41:00) [8]Добавлю до кучи еще одно отличие между PChar и String:
Если внутри строки типа String есть символ #0 (не в конце строки, а именно внутри) и PСhar указывает на первый символ этой строки, то строковые функции для типа String продолжают работать на всю длину, а для типа PChar - до первого #0.
Sha (2002-12-16 17:24:00) [9]2 Ihor Osov"yak © (16.12.02 17:11)
Мне тоже надо было быть добрее.
Ihor Osov'yak (2002-12-16 17:11:00) [10]2 Danlicha © (16.12.02 12:42)
Зы, и я очень часто юзаю shortString; Для малых строк это самый оптимальный вариант, просто это было как-бы вне контекста разговора с Sha ©...
2 Sha - наш разговор начал походить на флейм. Посему есть предложение его закончить, во всяком случае я в будущем воздержусь от ответа в этой ветке . Но все-же возьму на себя смелость сделать три реплики:
- я не просил делится со мной вашими знаниями. Я припускаю, что ваши рассуждения могут быть много кому интересны, но не надо делать лично мне милость, адресуя их мне персонально (см Sha © (16.12.02 16:15)).
- у Вас в коде все же ошибка, ладно, можно сказать фрагмент, который при переходе на другую версию компилятора может вызвать проблемы (см. Sha © (16.12.02 09:19) и мой идущий следом постинг), а на это вы упорно закрываете глаза...
- единственное, что я, возможно, не совсем корректно воспринял - это то, что мне показалось, что по поводу операторов pc:=@s[1] и pc:=PChar(t) Вы ремствуете по причине того, что они рабоют по разному. Я не понял, что Вы делаете констатацию факта. В связи счем и приношу извинение (но только в этой части разговора)
С уважением,
Sha (2002-12-16 16:30:00) [11]2 2 Ihor Osov"yak © (16.12.02 15:47)
>Еще две цитаты:
>от Sha © (16.12.02 09:19)
>> Они будут одной строкой, использованной 3 раза, т.е. будут
>> располагаться по одному адресу.
>от Sha © (16.12.02 13:08)
>>Я даже не говорил, что он равен трем. Будьте внимательны, мил человек.
Это действительно так!!! Мы имеем три строки с одним и тем же значением. И ни слова не сказано про значение счетчика использований для этой константы.
> Это я к тому, что внимательно читаю постинги, на которые
> собираюсь дать критический ответ. Я, между прочим, не
> оспаривал тот факт, что строка заюзана три раза. Я обратил
> только внимание на то, что для строк-констант, счетчик
> использования блокирован - см Ihor Osov"yak © (16.12.02 10:38).
Это известный факт, я с этим согласен.
Sha (2002-12-16 16:15:00) [12]2 Ihor Osov"yak © (16.12.02 15:35)
> Ну и вы любитель разводить дисскусию на пустом месте + талант перекручивать слова собеседника ..
Зачем же вешать ярлыки? Будьте корректнее.
> Вы почемуто начали комментировать реализацию с промежуточной
> переменной t и с ручками по памяти... Не говоря уже о том, что
> нужно очень подумать, перед тем как такое делать....
Я начал комментировать возможную реализацию желаемого типа на
уровне компилятора. Жаль, что вы не поняли.
> D5, sp1... вы, возможно юзаете версию компилятора, которая
> размещает строки-константы в памяти с r/o, что, если быть очень
> дотошным, не совсем корректно...
Это в Борланд :)
> Да, и если у вас это действительно работает - можете запомнить
> на всю последующую жизнь, как пример плохого кода, который
> может вызывать проблемы под разными версиями комполяторов..
С чего вы взяли, что я этого не знаю. Более того, я делюсь своими знаниями с вами.
> Я обратил только внимание на то, что в коде, который привели
> вы, счетчик вообще не юзается, и это есть корректно, ибо не
> будем же удалять строку-константу, которая "живет" в образе PE,
> загруженном в память...
И это мне известно. Я тоже это подчеркивал.
>> pc:=@s[1] и pc:=PChar(t) работают по-разному
> И правильно делает...
Полностью согласен. И тоже знаю ПОЧЕМУ.
>Зы - если под отладчиком в контекте разговора вы понимаете
>отладку на уровне дизассемблера - то очень странно, что вы
>ожидаете, что pc:=@s[1] и pc:=PChar(t) сгенерят вам
>одинаковый код. Ибо это вещи совершенно разные.
Я и не ожидаю. И не хочу, чтобы другие ожидали. Как раз это
я и сказал в самом начале, приведя ответ на свою загадку.
>Если Вы работаете на уровне символьного отладчика - не
>поленитесь, углубтесь на уровень диссамилерного кода
>(предварительно несколько узучив ассемблер) -
>и на многое у вас будет точка зрения гораздо ближе к истинной ...
Почему вы решили, что я не знаю ассемблер. Вы телепат?
Мы оба понимаем, о чем речь. Не надо цепляться.
Уважайте чужие знания.
Ihor Osov'yak (2002-12-16 15:49:00) [13]2 Anatoly Podgoretsky © (16.12.02 15:46)
Маестро, Вы как всегда, правы.. :-)
Anatoly Podgoretsky (2002-12-16 15:48:00) [14]Надеюсь, что никто не будет оспаривать, что "" и nil для PChar строк это не одно и тоже, кстати на этом часто горят, при передаче в WinApi функцию как константы
Ihor Osov'yak (2002-12-16 15:47:00) [15]2 2 Sha © (16.12.02 12:50)
Еще две цитаты:
от Sha © (16.12.02 09:19)
> Они будут одной строкой, использованной 3 раза, т.е. будут
> располагаться по одному адресу.
от Sha © (16.12.02 13:08)
Я даже не говорил, что он равен трем. Будьте внимательны, мил человек.
Это я к тому, что внимательно читаю постинги, на которые собираюсь дать критический ответ. Я, между прочим, не оспаривал тот факт, что строка заюзана три раза. Я обратил только внимание на то, что для строк-констант, счетчик использования блокирован - см Ihor Osov"yak © (16.12.02 10:38).
Anatoly Podgoretsky (2002-12-16 15:46:00) [16]Второй вариант еще сложнее, пусть S := "", тогда функция вместо передачи nil, как это было бы для неициализированной PChar переменной выдаст из кодового сегмента адрес нулевой строки, защитив тем самым некоторые WinApi функции и в противоположном случае выдаст адрес s[1], ошибки не произойдет.
Ihor Osov'yak (2002-12-16 15:39:00) [17]Должно быть:
которая неразмещает строки-константы в памяти с r/o
что, если быть очень дотошным, не совсем корректно...
Ihor Osov'yak (2002-12-16 15:35:00) [18]2 Sha © (16.12.02 12:50)
Ну и вы любитель разводить дисскусию на пустом месте + талант перекручивать слова собеседника ..
у меня было:
s:=s+"qwerty" - то есть тривиальное соединение строк без декларации промежуточной переменной и ручной работы по освобождению памяти.
Вы почемуто начали комментировать реализацию с промежуточной переменной t и с ручками по памяти. Юзайте себе на здоровье PChar и занимайтесь мазохизмом с ручным выделением/освобождением памяти везде где это только возможно... Одно из главных преимуществ борландовской реализации string - то что код с операциями соединения строк очень прозрачен и компактен, без рутинной работы по управлению выделениею и освобождению памяти, что невозможно реализовать без счетчика использований.. А если уже вас понесло на "силовое" приведение типов - так вы должны соображать,что делаете... Не говоря уже о том, что нужно очень подумать, перед тем как такое делать....
> У меня не вызывает :)
D5, sp1... вы, возможно юзаете версию компилятора, которая размещает строки-константы в памяти с r/o, что, если быть очень дотошным, не совсем корректно... Да, и если у вас это действительно работает - можете запомнить на всю последующую жизнь, как пример плохого кода, который может вызывать проблемы под разными версиями комполяторов..
> Исправьте начало так:
Оригинально-с... Я не спрашивал вас, как написать, чтобЫ счетчик заработал. Я обратил только внимание на то, что в коде, который привели вы, счетчик вообще не юзается, и это есть корректно, ибо не будем же удалять строку-константу, которая "живет" в образе PE, загруженном в память...
> pc:=@s[1] и pc:=PChar(t) работают по-разному
И правильно делает. В первом случае, вы запрашиваете указатель на элемент строки(пускай и первый), то есть заявляате, что собираетесь потенциально измееять его. И целиком естественно, что компилятор для вас строит копию начальной строки, которая еще юзается какими-то другими обьектами программы, чтобы застраховатся от изменения оригинальной строки, которая не есть в монопольном использовании. То есть реализация кода в этом случае есть абсолютно корректной...
Во втором случае - pc:=PChar(t) - присваивание указателя с "силовым" приведением типа. Последствия за использование - полностью на кодере...
Зы - если под отладчиком в контекте разговора вы понимаете отладку на уровне дизассемблера - то очень странно, что вы ожидаете, что pc:=@s[1] и pc:=PChar(t) сгенерят вам одинаковый код. Ибо это вещи совершенно разные. Если Вы работаете на уровне символьного отладчика - не поленитесь, углубтесь на уровень диссамилерного кода (предварительно несколько узучив ассемблер) -
и на многое у вас будет точка зрения гораздо ближе к истинной ...
Sha (2002-12-16 13:08:00) [19]2 Ihor Osov"yak ©
Насчет счетчика юзанья.
Исправьте начало так:
---
s:="qwerty"; s[1]:="q";
t:=s;
r:=s;
---
Теперь счетчик меняется как положено?
Про счетчик я сказал просто так - для информации.
Я вовсе не утверждал, что такое поведение программы зависит от счетчика. Я даже не говорил, что он равен трем. Будьте внимательны, мил человек.
А утверждал я вот что: операторы pc:=@s[1] и pc:=PChar(t) работают по-разному - одному нужна уникальная строка, другому нет.
З.Ы. Я всегда все гоняю под отладчиком, иначе откуда мне это знать.
Sha (2002-12-16 12:50:00) [20]2 Ihor Osov"yak ©
>pc:=PChar(t); pc^:="-"; ShowMessage(r);
>Здесь оператор присваивания вызовет ошибку. Ибо pc будет
>указывать та "оригинальную строку", размещенную в "рид-онли"
>участке памяти...
У меня не вызывает :)
>А раскажите, пожалуйста, как себе Вы представляете реализацию
>s:=s+"qwerty" где s - длинная строка без механизма подсчета
>ссылок и с кооректным освобождением памяти от "старого
>екзампляра" тела строки...
Я думал, все знают это.
Выделяем память для t, выполняем t:=s+"qwerty", освобождаем s,
далее t называем s.