Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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, и - баста !! И правильно, кстати, сделает ) ..

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




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




Наверх





Память: 0.74 MB
Время: 0.02 c
3-42365           csf                   2001-12-10 16:28  2002.01.14  
В Oracle есть dual, а что есть в InterBase e?


1-42467           Чайничек              2001-12-24 19:55  2002.01.14  
Можно ли, пограммируя на Delphi работать с rtf, и doc файлами?


1-42402           Phisio                2001-12-26 16:11  2002.01.14  
Как нарисовать выбирающий прямоугольник у мышки как в стратежках


1-42475           Snake2000             2001-12-24 17:11  2002.01.14  
Производная


1-42459           Dim                   2001-12-24 14:23  2002.01.14  
Контроль за перемещениями мышки.