Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.01.14;
Скачать: CL | DM;

Вниз

Тип 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 вся ветка

Текущий архив: 2002.01.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
6-42539
Landgraph
2001-10-16 12:38
2002.01.14
CGI Execute


1-42461
User
2001-12-25 08:49
2002.01.14
Как же мне отрисовать самому строки в TListView?


4-42590
Jaya!
2001-11-10 07:33
2002.01.14
Смена раскладки клавиатуры


3-42393
Sharm
2001-12-10 17:38
2002.01.14
Поиск по русским символам


1-42407
Dmitry_O
2001-12-23 19:49
2002.01.14
изменение языка