Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

Аналог сишного 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.056 c
1-1140370850
Matrex
2006-02-19 20:40
2006.03.26
«Мягкие» границы для Битмапа…


2-1141896299
Der Nechk@ssoff
2006-03-09 12:24
2006.03.26
рисование кнопки


6-1134327682
ZeFiR
2005-12-11 22:01
2006.03.26
Собственные страницы ошибок в TWebBrowser


2-1142263597
VitV
2006-03-13 18:26
2006.03.26
Interbase. Пусто поле....


2-1142085774
хочу все знать
2006-03-11 17:02
2006.03.26
изменение диапазона цикла FOR внутри цикла