Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Аналог сишного sscanf? [D7, XP]


Alex_C ©   (2006-03-06 10:34:00) 

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


MBo   (2006-03-07 13:04:00) [1]

>стек 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.


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

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 12:40:00) [3]

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


Leonid Troyanovsky   (2006-03-07 12:40:00) [4]


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

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


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

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

--
Regards, LVT.


MBo   (2006-03-07 12:38:00) [5]

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

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 работает.


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

MBo ©   (06.03.06 12:54) [1]

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


Alex_C   (2006-03-07 11:46:00) [7]

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


API   (2006-03-07 10:20:00) [8]

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

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


Alex_C   (2006-03-07 10:17:00) [9]

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


MBo   (2006-03-06 12:54:00) [10]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо