Изменение 2D указателя в паскале

Как я могу написать эквивалент этого на паскале?

void push(struct node **head, struct node **member)
{
  (*head)->next = *member;
  (*member)->prev = *head;
  (*member)->next = NULL;
  *head = *member;
}

Я пробовал что-то вроде этого:

procedure Push(head : nodeptr; prev : nodeptr; sym : nodeptr);
begin
    prev^.prev := sym;
    sym^.prev := prev;
    sym^.next := nil;
    prev := sym;
end;

На самом деле, я хочу знать, как сделать эквивалент этого на паскале: *head = *member;, где оба имеют тип struct node**, 2D-указатель.

EDIT: я добавил свой компилятор pascal. Это может быть актуально.


person The Mask    schedule 20.12.2013    source источник


Ответы (2)


Из этого руководства по паскалю указатель на указатель вы можете сделать что-то вроде этого

program exPointertoPointers;
type
  iptr = ^integer;
  pointerptr = ^ iptr;
var
  num: integer;
  ptr: iptr;
  pptr: pointerptr;
  x, y : ^word;
begin
  num := 3000;
  (* take the address of var *)
  ptr := @num;
  (* take the address of ptr using address of operator @ *)
  pptr := @ptr;
  (* let us see the value and the adresses *)
  x:= addr(ptr);
  y := addr(pptr);
  writeln('Value of num = ', num );
  writeln('Value available at ptr^ = ', ptr^ );
  writeln('Value available at pptr^^ = ', pptr^^);
  writeln('Address at ptr = ', x^); 
  writeln('Address at pptr = ', y^);
end.
person Elliott Frisch    schedule 20.12.2013
comment
Как назначить x указателя на тип записи y указателя на указатель на записываемый тип? Я попробовал x^.m := y^; в C, это x->m = *y, где он объявлен как struct node *x, **y; - person The Mask; 20.12.2013
comment
Я думаю, вы ищете x^.m := @y; - person Elliott Frisch; 20.12.2013
comment
Я забыл упомянуть, что я тоже пробовал это. Я получил ожидаемый узел nodeptr - person The Mask; 20.12.2013
comment
где m определить? Убедитесь, что он имеет тип ^ptr. - person Elliott Frisch; 20.12.2013
comment
m является членом записи типа ^ptr1, которая является указателем на себя: type ptr1 = ^foo; ptr2 = ^ptr1; foo = record m : ptr1;. В этом случае: x^.m := y^; x равно ptr1 и y из ptr2. - person The Mask; 20.12.2013
comment
Не сделает ли это m и 2D указатель? это не то, что я ищу, но установите значение из 2D-указателя в apointer. - person The Mask; 20.12.2013
comment
Ошибка: несовместимые типы: ожидаемый ptr1 foo - person The Mask; 20.12.2013
comment
ptr1 является точным типом m. Это дело Паскаля или ошибка компилятора? - person The Mask; 20.12.2013
comment
Откуда взялась фу? Вероятно, это не ошибка компилятора. - person Elliott Frisch; 20.12.2013

Я думаю, вы можете сделать указатель на указатель следующим образом:

type
   ptr = ^integer;
   ptr_ptr = ^ ptr;

И затем уважайте это так:

ptr_ptr ^^

Поэтому *head = *member;, вероятно, должен выглядеть как head^^ := member^^.

person Community    schedule 20.12.2013