Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Укразатели


Автор: Diesel Draft 10.7.2005, 13:22
Припустим у меня есть указатель P. Мне надо увидеть (string, integer...) што в ньом записано. И Потом перетворить обратно з "видемого" типа в укразель. ТОпто я хочу читать и вручную укразевать даные для укрателя.

Автор: vadims 10.7.2005, 13:54
Что значит 'увидеть' ???

Автор: Guest 10.7.2005, 14:00
ShowMessage(DWord(P))

Автор: TP@MB@Y 10.7.2005, 16:27
Diesel Draft

Если допустим у тебя есть указатель на произвольный тип (т.е. любой):
Код

var p: ^Type; 


То чтобы обратиться к информации на которую он указывает надо: p^
т.е. если info имеет тип Type, то чтобы присвоить значение на которое ссылается указатель p надо так:
Код

info:=p^

Автор: Chrisstoff 10.7.2005, 20:41
Мыж таки русские люди должны понимать друг друга ... но это ... ну вощем ладно ...
ну а чём проблема то ... я так понимаю что когда афтор говорит "указатель P"... то подрузамевается указатель на не определённый тип ... тобишь Pointer. Вот ну а прокастовать его уже к указателю на конкретный тип помом ничё сложного ....
Код

var
    p: Pointer;
    pint: ^Integer;
....
    pint := p;
    Writeln(pint^);

Автор: Romtek 10.7.2005, 22:34
Цитата(Diesel @ 10.7.2005, 13:22)
у меня есть указатель P. Мне надо увидеть (string, integer...) што в ньом записано.
Если указатель нетипизированный, узнать содержимое указателя нельзя, хотя можно с помощью кастинга привести к любому типу.
Код

var
  p: pointer;
...
  writeln (PChar(p)^);
  writeln (PInteger(p)^);


Для типизированных указателей же всё проще: никакого кастинга вообще не надо.
Код

var
  p: pinteger;
...
  writeln (p^);

Автор: Diesel Draft 11.7.2005, 11:02
припустим указател указевает на адрес 11223344
мне надо увидеть или вручную указать куда имено он указевает

Автор: TP@MB@Y 11.7.2005, 17:20
Diesel Draft
Т.е. тебя интересут сам адрес? Если так, то он содержится непосредственно в указателе (как это не парадоксально) - 4 байта. Присваивай какой хочешь адрес и выводи на экран если хочешь посматреть. В чем проблема? smile

Автор: Diesel Draft 12.7.2005, 13:28
Как мне увидеть какой имено там адрес?

Автор: TP@MB@Y 12.7.2005, 20:23
Diesel Draft
Походу просто так не вывести.

Попробуй поюзать функции определения сегмента и смещения. Seg() Ofs()

Автор: Chrisstoff 12.7.2005, 20:41
TP@MB@Y
Цитата
Т.е. тебя интересут сам адрес? Если так, то он содержится непосредственно в указателе (как это не парадоксально) - 4 байта. Присваивай какой хочешь адрес и выводи на экран если хочешь посматреть. В чем проблема? 


Если я ничего не путаю то присваивать указателю "какой хочешь адрес" нельзя!

Автор: TP@MB@Y 12.7.2005, 23:58
Chrisstoff
Проверил в паскале. Действительно нельзя.

Diesel Draft
Если не секрет, для чего вам надо знать конкретный адрес?
Если вы хотите работать с памятью на низком уровне - юзайте асемблер (встроенный в паскаль).

Автор: Diesel Draft 13.7.2005, 17:18
У меня меню создано на основе TWebBrozer
припусти я хочу удалить елемент з списка созданого на основе указалелей. Так как список постоянно загружаетса и сортуетса я не можу работать припустим з порядковыми нолмерамы. Я ести я передам з браузера даные припустим "Del FF7812" и приму их то вся проблема решена

Автор: TP@MB@Y 13.7.2005, 17:59
Diesel Draft
Насколько я понял, вы "копаете не там где надо" smile

Для работы с динамической цепочкой не нужно знать физический адрес, содержащийся в указателе какогото звена.
Все делается намного проще. Вот модуль, написанный мной, для работы с динамической цепочкой:
Код

unit dinamic;

interface

type pElem=^Elem;
     Elem=record
             st:string;
             next:pElem;
             flag:boolean
          end;

procedure del(var p:pElem;k:word);
procedure add(var p:pElem;s:string);
procedure addin(var p:pElem;k:word;s:string);
function info(p:pElem;k:word):string;
function adres(p:pElem;k:word):pElem;
function count(p:pElem):word;

implementation

{Функция возвращает количество элементов в цепочке}
function count(p:pElem):word;
var i:word;
begin
 if p=nil then count:=0
 else begin
       i:=0;
       while p<>nil do
        begin
         p:=p^.next;
         i:=i+1
        end;
       count:=i
      end
end;

{Функция возвращает указатель на К-ый элемент}
function adres(p:pElem;k:word):pElem;
var i:word;
begin
 i:=1;
 while (p<>nil)and(i<k) do
  begin
   i:=i+1;
   p:=p^.next
  end;
 adres:=p
end;

{Функция возвращает строку К-ого элемента}
function info(p:pElem;k:word):string;
var q:pElem;
begin
 q:=adres(p,k);
 if q<>nil then info:=q^.st
           else info:=''
end;

{Процедура вставки элемента в цепочку}
procedure addin(var p:pElem;k:word;s:string);
var n,p1:pElem;
    i:word;
begin
 if k=1 then begin
              new(n);
              n^.st:=s;
              n^.flag:=false;
              n^.next:=p;
              p:=n
             end
 else begin
       p1:=adres(p,k-1);
       if p1<>nil then begin
                        new(n);
                        n^.st:=s;
                        n^.flag:=false;
                        n^.next:=p1^.next;
                        p1^.next:=n
                       end
      end
end;

{Процедура добавления элемента в конец цепочки}
procedure add(var p:pElem;s:string);
var q:pElem;
begin
 new(q);
 q^.st:=s;
 q^.flag:=false;
 q^.next:=p;
 p:=q
end;

{Процедура удаления элемента из цепочки}
procedure del(var p:pElem;k:word);
var q:pElem;
    i:word;
begin
 if k=1 then begin
              q:=p;
              p:=p^.next;
              dispose(q)
             end
 else begin
       q:=adres(p,k);
       adres(p,k-1)^.next:=q^.next;
       dispose(q)
      end
end;

END.


Там он привязан к типу Elem, но ты можешь заменть на любой - принцип работы остается неизменным.

Автор: Diesel Draft 13.7.2005, 23:44
Ето простой стандартный список. Такой так и у меня. а мне надо
ПРистутим

Припустим у нас есть указатель Р и любая переменная М.
Р := @М;

как мне узнать какой имено адрес знаходетса в Р. Надо прочетать не значение М а только адрес. Надо перевести его в стринг или в интеджер

Автор: TP@MB@Y 14.7.2005, 00:00
Diesel Draft
Вы пробовали юзать ф-ии Seg() и Ofs()?

Адрес переменной M будет выглядеть так: "Seg(M):Ofs(M)"

Код

var m:integer;
begin
 writeln(seg(m),' : ',ofs(m));
end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)