Форум: "Основная";
Текущий архив: 2003.09.01;
Скачать: [xml.tar.bz2];
ВнизНеясное поведение Delphi при работе с указателями типа PChar. Найти похожие ветки
← →
Maks Realov (2003-08-14 15:14) [0]Ситуация такова - C-ная dll-ка дёргает в моей программе call-back функцию, передавая ей след. параметры:
unsigned (__stdcall *Dialog)(char*, int, char *, int);
- описание в коде С-ой dll.
У меня ф-ия выглядит след. образом:
function AuthenticationFormShow(Name: PChar;
SizeOfName: integer; Password: PChar; SizeOfPass: integer): integer; stdcall;
begin
Result:= 0;
if StrPas(Name) = "" then // m1
StrPas(Password) = "" then // m2
// if String(Name) = "" then //m3
// if String(Password) = "" then //m4
//...
end;
Так вот, когда мне пресылают пустой буфер, то Name и Password, естественно, ничего не содержат, т.е. "", а в памяти нули.
Но почему проверка (StrPas(Name) <> "") возвращает True, т.е. "m1" и "m2" выполняются, если приходят пустые буфера, а проверки (String(Name) = "") дают False и m3, m4 не выполняются??? As far as I remember, StrPas оставили для обратной совместимости и в Help-е велят пользоваться прямым приведением типов (сиреч String(expression)).
В чём прикол? Где я не заметил зарытую собаку? 8)
← →
panov (2003-08-14 15:18) [1]приведи код вызова функции и определения параметров
← →
Maks Realov (2003-08-14 15:28) [2]panov © (14.08.03 15:18):
С-ый код? Зачем? Разве не достаточно того, что память под буфер распределяется правильно и даже указатель не Pointer, а типизированный - PChar?
← →
Anatoly Podgoretsky (2003-08-14 15:34) [3]Это не сишный код, при том с ошибками.
← →
имя (2003-08-14 15:37) [4]Удалено модератором
← →
имя (2003-08-14 15:37) [5]Удалено модератором
← →
имя (2003-08-14 15:37) [6]Удалено модератором
← →
имя (2003-08-14 15:37) [7]Удалено модератором
← →
имя (2003-08-14 15:38) [8]Удалено модератором
← →
имя (2003-08-14 15:38) [9]Удалено модератором
← →
Maks Realov (2003-08-14 15:39) [10]Удалено модератором
Примечание: OffTopic
← →
имя (2003-08-14 15:39) [11]Удалено модератором
← →
имя (2003-08-14 15:39) [12]Удалено модератором
← →
имя (2003-08-14 15:40) [13]Удалено модератором
← →
имя (2003-08-14 15:40) [14]Удалено модератором
← →
имя (2003-08-14 15:40) [15]Удалено модератором
← →
Maks Realov (2003-08-14 17:02) [16]Удалено модератором
← →
Maks Realov (2003-08-15 10:14) [17]Удалено модератором
← →
Digitman (2003-08-15 10:23) [18]воспользоваться средствами интегрированной отладки не приходило в голову ?
ставишь брейкпойнт на строчке
if StrPas(Name) = "" then ..
и смотришь, что в реальности ты получил факт.параметром
← →
Maks Realov (2003-08-15 17:10) [19]Digitman © (15.08.03 10:23):
приходило, знаешь ли...
Name - ничего не содержит, нули...
function StrPas(const Str: PChar): string;
begin
Result := Str;
end;
Это из SysUtils. Я вообще не понимаю почему String(Name) и StrPas(Name) различаются при одном и том же пустом Name???
← →
Maks Realov (2003-08-15 19:40) [20]Удалено модератором
Примечание: В следующий раз, будет удалена вся ветка
← →
Maks Realov (2003-08-18 12:36) [21]Ну так что, никто не может это объяснить?
← →
Digitman (2003-08-18 12:45) [22]
> Name - ничего не содержит, нули
значит, передается "пустая" строка
т.о., условие StrPas(Name) = "" будет истинным
что же ты хочешь еще ?
← →
Maks Realov (2003-08-18 12:50) [23]Боже...
Digitman © (18.08.03 12:45):
Я не хочу быть навязчивым, но ты вопрос вообще читал? 8)
StrPas(Name) = "" - истина
String(Name) = "" - ложь
ПОЧЕМУ???
← →
Digitman (2003-08-18 13:15) [24]
> ты вопрос вообще читал?
а как же !)
вот эти конструкции будут эквивалентны :
StrPas(Name) = ""
String(Name ^) = ""
чистой воды Паскаль !)
← →
Digitman (2003-08-18 13:23) [25]
> Maks Realov (15.08.03 17:10) [19]
> приходило, знаешь ли...
да вот, чувствуется, не приходило !
иначе при трассировке кода, сгенерированного строчкой
if String(Name) = "" then ...
ты увидел бы следующее
mov ebx, адрес_константы_""
test ebx,ebx
jnz ... // сама константа указывает на #0, а адрес ее <> 0, поэтому и сравнение дает False
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.09.01;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.011 c