Форум: "Начинающим";
Текущий архив: 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.045 c