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

Вниз

Тип PChar и пустая строка   Найти похожие ветки 

 
AlexKniga   (2001-11-15 13:42) [0]

PChar("")<>nil ?!!!

Я использую тип String, при этом {$H-} ({$LONGSTRINGS OFF}).
У вызываемой процедуры параметр типа PChar.
Я делаю оболочку:
Procedure MyProc (strArg: String);
Begin
Proc(PChar(strArg));
End;

Иногда в качестве параметра для Proc требуется передать nil.
Вызов MyProc(""); не приводит к нужному результату.
Так же неудачен MyProc(String(PChar(nil)));

По эстетическим соображением прямой вызов Proc(nil); не желателен.
Не нравится и такой вариант:
Procedure MyProc (strArg: String);
Begin
If strArg=""
Then Proc(nil)
Else Proc(PChar(strArg));
End;


 
Digitman   (2001-11-15 13:57) [1]

из всего этого "нравится/не нравится" важно одно :
если PChar("")<>nil - это вопрос,
то PChar("")<>nil - это и есть ответ на него же


 
AlexKniga   (2001-11-15 14:16) [2]

А мне надо, что бы PChar("")=nil


 
Digitman   (2001-11-15 14:39) [3]

>AlexKniga
Да мало ли что тебе надо ! Компилятор вполне корректно и обоснованно преобразует строковую константу "" не в nil, а в адрес памяти, где лежит единственный символ-терминатор #0.


 
Mbo   (2001-11-15 14:47) [4]

Const TheNull=nil; эстетично?


 
AlexKniga   (2001-11-15 15:28) [5]

> Digitman
Я не правильно высказал свою просьбу.
Я понимаю(более или менее), что делает компилятор, но как это обойти?
Ну не нравится мне такой вариант:
Procedure MyProc (strArg: String);
Begin
If strArg=""
Then Proc(nil)
Else Proc(PChar(strArg));
End;



 
Sly   (2001-11-15 15:49) [6]

Дык, напиши одну функцию

function MyPChar(Value: String): PChar;
begin
if Value = "" then
Result := nil
else
Result := PChar(Value)
end;

И
Procedure MyProc (strArg: String);
begin
Proc(MyPChar(Value));
end;





 
AlexKniga   (2001-11-15 15:55) [7]

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


 
Digitman   (2001-11-15 15:55) [8]

>AlexKniga
А никак !

Ну, может, вот так примерно "покрасивше" для тебя выглядеть будет :

Const TheNull = nil; // (C) <Mbo>

Procedure MyProc (strArg: String);
Begin
case PChar(strArg)[0] of
#0: Proc(TheNull);
else
Proc(PChar(strArg));
end;
End;



 
Dimka Maslov   (2001-11-15 16:39) [9]

>Digitman
В таком случае если strArg действительно nil, то получится Access Violation. Так-что за красотой гоняться не стоит и писать if Value="" then ...


 
Digitman   (2001-11-15 17:04) [10]

>Dimka Maslov

Да ну ???? Неужели ??? И в каком же случае переменная типа String может иметь фактический адрес (в лин.памяти задачи) = nil ? Аргументируй ! Дело-то не в "красоте"...


 
Anatoly Podgoretsky   (2001-11-15 23:02) [11]

Он наверно не обратил внимание на {$H-}
но в таком случае нельзя делать приведение PChar(strArg)) без последствий.


 
Dimka Maslov   (2001-11-16 10:40) [12]

>Digitman
Переменная, конечно не может иметь адрес nil, но поскольку String - это указатель, он в свою очередь может указывать на nil. И если это так, что PChar(strArg)[0] приведёт к ошибке.


 
Digitman   (2001-11-16 11:50) [13]

>Dimka Maslov
>Anatoly Podgoretsky

Приношу извинения - {$H-} я упустил из виду при повторном прочтении.

Но тогда (при {$H-}) все эти разного рода потуги с преобразованиями String в PChar вообще не имеют смысла - компилятор попросту откажется делать сие, крикнув вам, мол, Invalid typecast, и - баста !! И правильно, кстати, сделает ) ..

И странно при сем факте, что Автор (да и не только он !!!), начав рассуждать об "эстетических соображениях", почему-то умалчивает о самой возможности данного явного преобразования. Странно ....)



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

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

Наверх





Память: 0.59 MB
Время: 0.027 c
1-42418
Wetnose
2001-12-27 07:09
2002.01.14
KeyDown для ScrollBar a


14-42554
Merlin
2001-11-02 10:10
2002.01.14
Новости VCL, что посоветуете?


1-42420
Sour
2001-12-23 20:32
2002.01.14
TStream


1-42432
wHammer
2001-12-22 10:04
2002.01.14
Как получить псевдографику в Win?


4-42635
Tasadar
2001-11-10 13:29
2002.01.14
Как узнать о том что переименовали файл





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский