![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Тип PChar и пустая строка
AlexKniga © (2001-11-15 13:42:00)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-16 11:50:00) [1]>Dimka Maslov
>Anatoly Podgoretsky
Приношу извинения - {$H-} я упустил из виду при повторном прочтении.
Но тогда (при {$H-}) все эти разного рода потуги с преобразованиями String в PChar вообще не имеют смысла - компилятор попросту откажется делать сие, крикнув вам, мол, Invalid typecast, и - баста !! И правильно, кстати, сделает ) ..
И странно при сем факте, что Автор (да и не только он !!!), начав рассуждать об "эстетических соображениях", почему-то умалчивает о самой возможности данного явного преобразования. Странно ....)
Dimka Maslov (2001-11-16 10:40:00) [2]>Digitman
Переменная, конечно не может иметь адрес nil, но поскольку String - это указатель, он в свою очередь может указывать на nil. И если это так, что PChar(strArg)[0] приведёт к ошибке.
Anatoly Podgoretsky (2001-11-15 23:02:00) [3]Он наверно не обратил внимание на {$H-}
но в таком случае нельзя делать приведение PChar(strArg)) без последствий.
Digitman (2001-11-15 17:04:00) [4]>Dimka Maslov
Да ну ???? Неужели ??? И в каком же случае переменная типа String может иметь фактический адрес (в лин.памяти задачи) = nil ? Аргументируй ! Дело-то не в "красоте"...
Dimka Maslov (2001-11-15 16:39:00) [5]>Digitman
В таком случае если strArg действительно nil, то получится Access Violation. Так-что за красотой гоняться не стоит и писатьif Value="" then ...
AlexKniga (2001-11-15 15:55:00) [6]Спасибо всем!
Digitman (2001-11-15 15:55:00) [7]>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;
Sly (2001-11-15 15:49:00) [8]Дык, напиши одну функцию
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:28:00) [9]> Digitman
Я не правильно высказал свою просьбу.
Я понимаю(более или менее), что делает компилятор, но как это обойти?
Ну не нравится мне такой вариант:
Procedure MyProc (strArg: String);
Begin
If strArg=""
Then Proc(nil)
Else Proc(PChar(strArg));
End;
Mbo (2001-11-15 14:47:00) [10]Const TheNull=nil; эстетично?
Digitman (2001-11-15 14:39:00) [11]>AlexKniga
Да мало ли что тебе надо ! Компилятор вполне корректно и обоснованно преобразует строковую константу "" не в nil, а в адрес памяти, где лежит единственный символ-терминатор #0.
AlexKniga (2001-11-15 14:16:00) [12]А мне надо, что бы
PChar("")=nil
Digitman (2001-11-15 13:57:00) [13]из всего этого "нравится/не нравится" важно одно :
если PChar("")<>nil - это вопрос,
то PChar("")<>nil - это и есть ответ на него же