Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.04.22;
Скачать: [xml.tar.bz2];

Вниз

Pointer   Найти похожие ветки 

 
Gu   (2011-12-29 18:28) [0]

Есть Procedure My(p:Pointer); в нее приходят значения pchar и pansichar. в процедуре можно как то узнать, какой тип указателя пришел? что то типа if (p is pchar) then;


 
~AQUARIUS~   (2011-12-29 18:48) [1]

Нет, нельзя. Предусмотрите либо две версии функции (MyA(PAnsiChar) и MyW(PWideChar)), либо дополнительный параметр для идентификации типа строки. ИМХО первый вариант лучше


 
Gu   (2011-12-29 18:49) [2]

спасибо


 
Юрий Зотов ©   (2011-12-29 20:06) [3]

Прямого способа нет, но, может быть, вот этот косвенный натолкнет на какие-то мысли. Идея в том, что по смещению -SizeOf(PInteger) от первого символа строки хранится ее размер в байтах. Если он равен длине строки, то это AnsiString, а если вдвое больше - то WideString.

const
 AStr: AnsiString = "AnsiString";
 WStr: WideString = "WideString";

var
 PAStr: PAnsiChar;
 PWStr: PWideChar;
 PSize: PInteger;

procedure TForm1.Button1Click(Sender: TObject);
begin
 PAStr := @AStr[1];
 PSize := PInteger(Cardinal(PAStr) - SizeOf(PInteger));
 ShowMessage(Format("%d %d", [Length(AStr), PSize^]))
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 PWStr := @WStr[1];
 PSize := PInteger(Cardinal(PWStr) - SizeOf(PInteger));
 ShowMessage(Format("%d %d", [Length(WStr), PSize^]))
end;


 
Dimka Maslov ©   (2011-12-29 20:25) [4]


> Юрий Зотов ©   (29.12.11 20:06) [3]


Речь идёт о PChar и PAnsiChar. А они принципиально неразличимы, как и любые указатели.


 
Юрий Зотов ©   (2011-12-29 20:33) [5]


> Dimka Maslov ©   (29.12.11 20:25) [4]

Указатели на однобайтовые строки и различать не надо, поскольку это одно и то же. Поэтому я склонен думать, что речь идет о различении указателей на однобайтовую и двубайтовую строки, а автор просто неточно сформулировал вопрос.


 
Gu   (2011-12-29 20:56) [6]


> на однобайтовую и двубайтовую строки


угу


 
Dimka Maslov ©   (2011-12-29 21:26) [7]

Проще и надёжнее сделать две функции, чем строить какие-то догадки по составу данных.


 
Anatoly Podgoretsky ©   (2011-12-29 22:08) [8]

> Dimka Maslov  (29.12.2011 21:26:07)  [7]

А нам не страшно голову сломать.


 
Юрий Зотов ©   (2011-12-29 22:40) [9]


> Dimka Maslov ©   (29.12.11 21:26) [7]

Безусловно, и проще, и надежнее, и правильнее. Просто сама задачка показалась довольно интересной.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2012.04.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.003 c
2-1325062111
OW
2011-12-28 12:48
2012.04.22
IdTCPServer1Execute(AThread: TIdPeerThread); Какой тут AThread?


2-1325099067
ghjtyu21
2011-12-28 23:04
2012.04.22
змейка


15-1324204018
oldman
2011-12-18 14:26
2012.04.22
Не хватает снега?


15-1324302501
aka
2011-12-19 17:48
2012.04.22
поиск по списку слов.


15-1324033056
И. Павел
2011-12-16 14:57
2012.04.22
Восстановление бекапа для SQL SERVER 2005





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский