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

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

Совместимость PAnsiChar и String [D7, WinXP]


eowl ©   (2006-11-05 07:24:00) 

Как обеспечить совместимость этих двух типов? Если быть точнее то я всего лишь хочу вывести число, целое или с правающей точкой, через функцию

MessageBox(hwnd, text:PansiChar, caption:PAnsiChar, type:cardinal);
Но я не нашел фунции для перевода числа в этот тип.


Anatoly Podgoretsky   (2006-11-05 15:57:00) [1]

> guav  (05.11.2006 15:45:18)  [18]

Я кстати тоже в свое время страдал от этого @S[1] пока не получил по зубам
от системы, теперь или всегда пишу PChar или в случае гарантированого
массива of char не пишу, но там и индекс не требуется указывать.


Anatoly Podgoretsky   (2006-11-05 15:55:00) [2]

> guav  (05.11.2006 15:45:18)  [18]

> А пустой массив располагается по адресу 0, а фактическое разыменование не
> делается.

Уверен, а если включить проверку диапазонов?
Еще раз говорю подобная конструкция вызывала АВ в ранних версиях, после они
пошли на поводу у некоторых программистов и переделали немного компилятор.
Но это смешно обращение по индексу к несуществующему массиву. И кроме того,
как писалось ранее поведение некоторых функций АПИ не допускает передачу
пустого параметра, а обязательно требует передачу строки/массива пускай
пустого. Функция PChar решает эту проблему и даже более, она запрещает
писать в пустой массив, чего не скажешь про программы на других языка, потом
удивляются неожиданному поведению программы. При том трудно уловимому,
поскольку касается особых условий и касается некоторых функций.


guav   (2006-11-05 15:45:00) [3]

> [16] Ketmar ©   (05.11.06 15:43)

специально никто думаю не делал, просто так получилось:

> Адрес элемента = адрес массива + смещение элемента, для
> первого смещение равно 0.

А пустой массив располагается по адресу 0, а фактическое разыменование не делается.


guav   (2006-11-05 15:43:00) [4]

> [15] Anatoly Podgoretsky ©   (05.11.06 15:39)

Ну это что-то вроде передачи PInteger(nil)^ в качестве var параметра.
В есте передачи к памяти не обращаются, потому AV нет, но разыменованние вроде как есть. Может в D2-D3 и этот приём не прошел бы.
Разумеется, лучше приведения PChar и string, причём у себя никаких PChar.


Ketmar   (2006-11-05 15:43:00) [5]

>[14] guav(c) 5-Nov-2006, 15:28
>Катит и в D7.
да. работает. странно. узнаю, кто это сделал -- пристрелю. %-) какой может быть адрес элемента в несуществующем массиве? это даже круче идеального сферического коня в вакууме.


Anatoly Podgoretsky   (2006-11-05 15:39:00) [6]

> guav  (05.11.2006 15:28:14)  [14]

В Д7 может быть и катит, но в Д2/Д3 это выдавала AV, индекс мог быть любой,
было обращение к памяти, а чего ожидать от обращения к адресу 0


guav   (2006-11-05 15:28:00) [7]

> [13] Ketmar ©   (05.11.06 15:07)

Катит и в D7.
Адрес элемента = адрес массива + смещение элемента, для первого смещение равно 0.


Ketmar   (2006-11-05 15:07:00) [8]

>[9] Anatoly Podgoretsky(c) 5-Nov-2006, 11:34
>Для @S[1] будет передан nil
не знаю, приобрела ли данная конструкция смысл в D10 (если да -- то авторов компилятора сжечь на медленном огне), но ещё в D7 спокойно давала AV. что логично: откуда в пустой строке возьмётся первый элемент???


Anatoly Podgoretsky   (2006-11-05 15:00:00) [9]

> eowl  (05.11.2006 12:50:10)  [10]

Это сложнее - это и функция, если есть что то в скобках и это и тип, если
используется в объявление. Описана вроде в модуле System, но в модуле System
многое имеет другие имена, а что именно вызывать знает компилятор.


sniknik   (2006-11-05 13:23:00) [10]

> функция Pchar - где ее объявление?? Это вообще функция?
нет, это тип, а для приведения к этому типу вызывается функция см [4].
понять что и как можно включив галочку в проекте в опциях "use debug dcus", и пройти трассировкой по F7 в интересующее тебя действие. (а не искать неизвестно чего)


eowl   (2006-11-05 12:50:00) [11]

Раз, уж вы все здесь и тема оказалась в разделе для начинающих :), я не буду бояться задавать глупые вопросы :D.

Объясните мне за одним...,
функция Pchar - где ее объявление?? Это вообще функция? В модуле system, вроде все пересмотрел, нету. Ну не все конечно :). Я многое не понимаю в синтаксисе, стандартных модулей, там и вправду много удивительного и странного, чего вообщем то я и не видел больше нигде, кроме как там :) :).

>
> направление, куда пытливый ум вопрошающего может взглянуть
> со всевозрастающим изумлением... 8-)

Оно правда!


Anatoly Podgoretsky   (2006-11-05 11:34:00) [12]


> Джо ©   (05.11.06 07:37) [2]

Вообще то конструция опасная, для пустой строки вызывала AV в некоторых версиях Дельфи. Сейчас вроде устранили. PChar функция безопасная, но чуть дольше.
Кстати и работа будет различаться,
Для @S[1] будет передан nil, для PChar(S) будет передан указатель на пустую строку. А функции Виндоус различаются многообразием, некоторые съедят и то и то, некоторые будут вести себя по разному, а некоторые могут и свихнуться, что им передали не строку.


Ketmar   (2006-11-05 08:44:00) [13]

>[5] eowl 5-Nov-2006, 07:57
>@S[1] - никогда бы наверно сам не додумался :)
и не надо. дяденька шутит.


Loginov Dmitry   (2006-11-05 08:40:00) [14]

eowl   (05.11.06 7:57) [5]
@S[1] - никогда бы наверно сам не додумался


И не нужно оно. Вовсе.


Джо   (2006-11-05 07:59:00) [15]

> Спасиба вообщем!

Да воооообщем, поооожалуйста. :D


eowl   (2006-11-05 07:57:00) [16]

Никак не могу привыкнуть, как шустро здесь отвечают.. :) :) Только от монитора отвернулся.

Я как раз собирался попробовать PСhar() :).
@S[1] - никогда бы наверно сам не додумался :)

Спасиба вообщем!


Джо   (2006-11-05 07:48:00) [17]

Да, если посмотреть, что это "Основная" (как странно), то можно еще и приоткрыть страшную тайну, что я наглым образом ввожу в заблуждение, утверждая, что приведение типа PChar не приведет к вызову функции. Приведет и даже по памяти скажу, что это будет LStrToPChar. Впрочем, и мой вариант также чреват UniqueStr, опять же, по памяти. Не думаю, впрочем, что это все сколь-нибудь существенно для данного вопроса, хотя и указывает направление, куда пытливый ум вопрошающего может взглянуть со всевозрастающим изумлением... 8-)


Ketmar   (2006-11-05 07:38:00) [18]

индекс опаснее. хотя и шустрее. %-)


Джо   (2006-11-05 07:37:00) [19]

Не нужно никаких функций ("в данном случае", как сказал коллега). Предлагаю конструкцию:
S: string;
...
@S[1].

Это если возжелать, чтобы врагам было неприятно читать исходники. А если не желать такого, то [1]. Да и там нету функции. И слава богу.


Ketmar   (2006-11-05 07:33:00) [20]

в "надмозги".
PChar(string_literal_or_variable). в данном случае.


Наверх

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