|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
получение строки, на которую показывает указатель
доброго времени суток
задача странная, но надеюсь решаемая, есть указатель типа Pointer, нужно получить строку, на которую показывает он, Но не используя ^ @ Pointer() string() и т д, а только теми функциями, которые можно получить из стандартных dll виндоуса, только без посылок в гугл плиз, сё уже облазил( мозг кипит |
#2
|
||||
|
||||
а что значит строка в понимании стандартных dll Windows?
Пишу программы за еду. __________________ |
#3
|
|||
|
|||
окей, перефразирую, как получить значение на которое ссылается указатель. в строку сам преобразую,
п.с. по прежнему используя лишь код без ^ @ Pointer() string() и функции dll виндоуса |
#4
|
||||
|
||||
а указатель это и есть значение, которое определяет место в памяти. в этом месте может быть и строка.
Пишу программы за еду. __________________ |
#5
|
|||
|
|||
указатель, если на него смотреть, просто выглядит как восемь цифр, а строка предположим длиной в цифр =3000, какой либо случайный текст, так как вот мне от первого ко второму перейти?
|
#6
|
||||
|
||||
строка это всего лишь последовательность байт, которые расположены с определенного адреса в памяти. так вот указатель и задает этот самый адрес.
Код:
var s: String; p: PChar; s2: String; begin s:='hello'; p:=PChar(s); s2:=p; // s2:=StrPas(p); ShowMessage(s2); // s2 = s end; Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 16.04.2012 в 16:33. |
#7
|
|||
|
|||
повторюсь, Pchar() нельзя мне использовать, если я не беру её напрямую из длл с вызовом длл и т д, и если компилятором смотреть даже p хранит строку как строку, а у меня на входе число например 59375 и разрешено только dll пользоваться
|
#8
|
||||
|
||||
а PChar это не функция, это тип - указатель на символ. к тому же он используется не в решении этой чудо-задачки, а для формирования указателя, т.е. исх. данных - не решения!
Пишу программы за еду. __________________ |
#9
|
|||
|
|||
ну и как же она преобрзовывает тогда? попытаюсь пояснить изначально задача ставилась так что можно использовать только интеджер, стринг, логику и функции из длл, да, я понимаю что может я сдохну и не решу, но ведь решение есть, помогите найти его, плииииз
|
#10
|
||||
|
||||
Мдя.
Цитата:
Код:
asm ; a^:=b ; скомпилируется в mov eax, a ; eax := a mov ebx, b ; ebx :=b mov [eax], ebx ; eax^ := ebx ;--------------- ; a:=@b ; скомпилируется в mov eax, offset b mov a, eax end; Цитата:
Код:
p:=PChar(s); // получим: asm mov eax, s // s - строка mov p, eax // p - указатель end; Причём тут функции DLL Windows вообще не понял: это функции для реализации элементов работы с операционной системой. Так что задача полностью лишена смысла. Работать оно будет на любом компьютере архитектуры х86, вообще без операционной системы. Неиспользование ^ и @ - это просто исключение из рассмотрения части машинных команд, которые реализованы везде и всегда. Кстати, даже простой доступ к переменной фактически реализуется через ту же ^, только перед ней стоит константа (адрес, который скрывается за именем переменной), и эту ^ делфи писать не требует, ставит сама. З.Ы. если можно использовать интежер и стринг - то вообще без проблем: Код:
var p: pointer; s: string; begin // p уже указывает на строку integer(s):=integer(p); // поскольку строка и есть указатель на строку end; З.З.Ы. Интересно, откуда взялась такая бредовая задача. Если какой-то препод поставил - то передайте ему, чтоб не учил людей всякой дури и быдлокоду. Она только развивает неверное представление о спецсимволах и приведении типов в делфи. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 16.04.2012 в 18:25. |
#11
|
||||
|
||||
Аж самому смешно :
Код:
Function PointerToStr(P: Pointer): String; Var B: Byte; i: Integer; begin i:= 0; Result:= ''; While B <> $20 Do begin Asm mov edx, [P] add edx, i mov eax, [edx] mov B, al end; Inc(i); if B <> $20 Then Result:= Result + Chr(B); end; end; Точно не помню String $20 заканчуется. Но ф-нц работает. If end Then begin; Последний раз редактировалось AND_REY, 16.04.2012 в 19:25. |
#12
|
||||
|
||||
Строка вродь на 0 заканчивается. $20 - пробел.
Модификация для Delphi 2009+, чуть меньше переменных и чуть логичнее: Код:
program Project7; {$APPTYPE CONSOLE} uses Dialogs; Function PointerToStr(P: Pointer): String; Var B: Char; begin B:=#1; Result:= ''; While B <> #0 Do begin Asm mov eax, [P] add [P], 2 mov ax, [eax] mov [b], ax end; if B <> #0 Then Result:= Result + B; end; end; var s: String; begin s := 'Hello, world!'; ShowMessage(PointerToStr(Pointer(s))); end. Код:
s:=string(p); Код:
asm mov eax, [p] mov [s], eax end; jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 17.04.2012 в 00:57. |
#13
|
|||
|
|||
всем спасибо) помогло)
|