Pointer1. Дан адрес $$P_1$$ записи типа TNode, содержащей поле Data (целого типа) и поле Next (типа PNode — указателя на TNode). Эта запись связана полем Next со следующей записью того же типа. Вывести значения полей Data обеих записей, а также адрес $$P_2$$ следующей записи.
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
program Pointer1; type PNode=^TNode; TNode=record Data: Integer; Next: PNode; // Prev: PNode; end; var P1:PNode; a:^Word; begin // подготовка к выполнению задания, в задании этой части нет, стек появляется из неоткуда. New(P1); Write('P1.data: '); Readln(P1^.Data); New(P1^.Next); Write('P2.data: '); Readln(P1^.Next^.Data); // непосредственно решение Writeln('P1.data:',P1^.Data); a:=Addr(P1^.Next); Writeln('P1.next:',a^); Writeln('P2.data:',P1^.Next^.Data); readln; end. |
Другие задачи из раздела Pointer можно посмотреть здесь.
Можно ли обойтись без функции addr или ей есть какой-нибудь аналог? В моем компиляторе ее нет, и поэтому указывается как «неизвестное имя»
addr — альтернатива @
то есть можно записать:
После замены addr на @ в том же месте возникла новая ошибка: «Нельзя преобразовать тип ^^TNode к ^word». Гуглил насчет этой проблемы и нашел только это —
серофим:
всё ,разобрался , в ABC нет ADDR , и присваивать вот так нельзя :
PascalВыделить код
STRUKAZ:=@(a[i]);
но можно так:
PascalВыделить код
var ch:char;
………..
ch := (a[i]);
STRUKAZ := @ch;
Видимо при моем PascalABC нужно данный момент — a := @(P1^.Next); — реализовать как — то по другому?
немного поправил комментарий. заменил ссылку на инфу…
но насколько я вижу в данном примере мы получаем адрес не a[i], а ch
а можете по точнее назвать версию PascalABS на котором вы компилируете проект?
PascalABC.NET
Версия 3.0. сборка 1039 (15.09.2015)
Тогда можно попробовать так: