Форум: "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.47 MB
Время: 0.006 c