Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1553
Marser
2003-08-12 01:18
2003.09.01
Тупо.


1-1483
race1
2003-08-18 13:14
2003.09.01
tlistbox.getdata :)


3-1281
Lamer_of_Delphi
2003-08-11 10:29
2003.09.01
Как получить значение ключевого поля последней записи?


14-1556
Marser
2003-08-12 00:45
2003.09.01
Именинники 12 августа


14-1649
Serginio666
2003-08-12 16:51
2003.09.01
А работает ли Поиск на данном форуме????





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский