Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.04.2012, 16:03
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию получение строки, на которую показывает указатель

доброго времени суток

задача странная, но надеюсь решаемая, есть указатель типа Pointer, нужно получить строку, на которую показывает он, Но не используя ^ @ Pointer() string() и т д, а только теми функциями, которые можно получить из стандартных dll виндоуса, только без посылок в гугл плиз, сё уже облазил( мозг кипит
Ответить с цитированием
  #2  
Старый 16.04.2012, 16:08
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

а что значит строка в понимании стандартных dll Windows?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 16.04.2012, 16:19
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

окей, перефразирую, как получить значение на которое ссылается указатель. в строку сам преобразую,
п.с. по прежнему используя лишь код без ^ @ Pointer() string() и функции dll виндоуса
Ответить с цитированием
  #4  
Старый 16.04.2012, 16:23
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

а указатель это и есть значение, которое определяет место в памяти. в этом месте может быть и строка.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 16.04.2012, 16:28
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

указатель, если на него смотреть, просто выглядит как восемь цифр, а строка предположим длиной в цифр =3000, какой либо случайный текст, так как вот мне от первого ко второму перейти?
Ответить с цитированием
  #6  
Старый 16.04.2012, 16:31
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

строка это всего лишь последовательность байт, которые расположены с определенного адреса в памяти. так вот указатель и задает этот самый адрес.

Код:
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  
Старый 16.04.2012, 16:37
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

повторюсь, Pchar() нельзя мне использовать, если я не беру её напрямую из длл с вызовом длл и т д, и если компилятором смотреть даже p хранит строку как строку, а у меня на входе число например 59375 и разрешено только dll пользоваться
Ответить с цитированием
  #8  
Старый 16.04.2012, 16:49
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

а PChar это не функция, это тип - указатель на символ. к тому же он используется не в решении этой чудо-задачки, а для формирования указателя, т.е. исх. данных - не решения!
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 16.04.2012, 17:09
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

ну и как же она преобрзовывает тогда? попытаюсь пояснить изначально задача ставилась так что можно использовать только интеджер, стринг, логику и функции из длл, да, я понимаю что может я сдохну и не решу, но ведь решение есть, помогите найти его, плииииз
Ответить с цитированием
  #10  
Старый 16.04.2012, 17:53
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Мдя.
Цитата:
^ @ Pointer() string()
Первые две - это не функции, а указания компилятору, использовать значение по адресу и адрес соответственно. Если прям такая ненависть к ним - вперёд:
Код:
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;
Pointer и String так вообще указания компилятору, что работать с переменной как с таким типом. После компиляции ни строк, ни интов не существует.
Цитата:
ну и как же она преобрзовывает тогда?
Да очень просто: никак. Если смотреть вглубь, в подавляющем большинстве случаев преобразование типов просто отключает ошибки, выдаваемые компилятором. Всё сведётся к
Код:
p:=PChar(s);
// получим:
asm
 mov eax, s   // s - строка
 mov p, eax   // p - указатель
end;
Только при использовании ООП с перегрузкой преобразований будет вызываться функция преобразования (например, в Delphi 2009 и выше при преобразовании String в AnsiString и наоборот).
Причём тут функции 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  
Старый 16.04.2012, 19:22
Аватар для AND_REY
AND_REY AND_REY вне форума
Активный
 
Регистрация: 31.03.2009
Адрес: Украина, г.Днепропетровск
Сообщения: 324
Версия Delphi: Delphi7
Репутация: 3877
По умолчанию

Аж самому смешно :

Код:
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  
Старый 16.04.2012, 20:25
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Строка вродь на 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;
З.Ы. не знал, что для делфи [P] и P - синонимы. Приятно удивлён. Прям можно писать в стиле ФАСМа.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 17.04.2012 в 00:57.
Ответить с цитированием
  #13  
Старый 17.04.2012, 06:18
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

всем спасибо) помогло)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:55.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter