Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Вниз

Аналог сишного sscanf?   Найти похожие ветки 

 
Alex_C ©   (2006-03-06 10:34) [0]

Есть ли в дельфи аналог sscanf?


 
MBo ©   (2006-03-06 12:54) [1]

Нет. Можно так:
function Sscanf(Buf, Fmt:PChar):Integer; cdecl varargs;  external "msvcrt.dll" name "sscanf";


 
Alex_C ©   (2006-03-07 10:17) [2]

Ок! Спасибо!
Еще вопрос - нашел в инете реализацию данной ф-ции. Но она не работает. Стал разбираться - какая то мистика! Проблема здесь:
for i := 0 to High(Pointers) do
- запускаю  - смотрю при первом проходе переменную i , а она вместо нуля становится равной 1234048 !!!!
Не погу понять - из-за чего такое может произойти?


 
API ©   (2006-03-07 10:20) [3]

Не погу понять - из-за чего такое может произойти?

Из-за оптимизации. Скорее всего, эта переменная является просто счетчиком, и больше нигде не используется.


 
Alex_C ©   (2006-03-07 11:46) [4]

Ну дык нифига себе оптимизация!!! )))
С оптимизировал называется!
А переменная используется дальше
Move(s1, Pointers[i]^, Length(s1) + 1);
И из-за этого ф-ция не работает!


 
Игорь Шевченко ©   (2006-03-07 12:10) [5]

MBo ©   (06.03.06 12:54) [1]

а синтаксис вызова какой ?
(и для какой версии delphi это применимо?)


 
MBo ©   (2006-03-07 12:38) [6]

>а синтаксис вызова какой?
Вещественное число ввести навскидку не получилось - не знаю, какой формат использовать

var
 i: Integer;
 d: Double;
 pc: PChar;
 s: string;
 Readed: Integer;
begin
 s := "asdfg 5";
 GetMem(pc, 100);
 Readed := Sscanf(PChar(s), PChar("%s %d"), pc, @i);
 Caption := Format("%s %d", [pc, i]);
 FreeMem(pc);


>и для какой версии delphi это применимо?)
В 6 работает.


 
MBo ©   (2006-03-07 12:40) [7]

еще здесь есть дельфийские варианты:
http://rsdn.ru/Forum/Message.aspx?mid=804528#804528


 
Leonid Troyanovsky ©   (2006-03-07 12:40) [8]


> Alex_C ©   (07.03.06 11:46) [4]

> Move(s1, Pointers[i]^, Length(s1) + 1);
> И из-за этого ф-ция не работает!


Это не работает исключительно из-за кривости.
Видимо, имелось ввиду что-то вроде: PString(Pointers[i])^ := s1;

И, вообще,  sscanf  - место на свалке истории.

--
Regards, LVT.


 
Игорь Шевченко ©   (2006-03-07 12:44) [9]

MBo ©   (07.03.06 12:38) [6]

Спасибо. Не думал, что в 6-ке работает. То есть, количество аргументов в вызове может быть сколь угодно длинным, я правильно понимаю ?
И никто не мешает, при соотвествующих объявлениях, написать такой вызов

   DbgPrintEx (1, 3,
     "NtCreateFile (%wZ, %I64X, %I64X) failed with %X \n",
     FileName, MinimumSize.QuadPart, MaximumSize.QuadPart, Result);

где, соответственно, первый параметр имеет тип PUNICODE_STRING, а два следующих Int64, стек Delphi корректно сформирует

?

(6-ки нету под рукой проверить)


 
MBo ©   (2006-03-07 13:04) [10]

>стек Delphi корректно сформирует
Ну наверно, да (только указатели на переменные нужны)
Для моего примера в стек толкается 4 аргумента, и после sscanf делается восстановление стека add esp,$10

В хелпе только это:
When importing a C function that takes a variable number of parameters, use the varargs directive. For example,
function printf(Format: PChar): Integer; cdecl; varargs;
The varargs directive works only with external routines and only with the cdecl calling convention.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.039 c
2-1141988262
Der Nechk@ssoff
2006-03-10 13:57
2006.03.26
Реакция на открытие папки


3-1138809212
-Вася-
2006-02-01 18:53
2006.03.26
Установка SQL Server 2000


2-1141993956
fedpavel
2006-03-10 15:32
2006.03.26
DLL


5-1127236041
rds
2005-09-20 21:07
2006.03.26
Как вызвать событие


10-1115220240
Evloev Oleg
2005-05-04 19:24
2006.03.26
Многопоточность и COM





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский