Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Глупый вопрос: Pchar ->string [D6, WinME]


Страницы:   1 2 3

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.





Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо