Спасибо, нашёл.
unit Data;
interface
procedure p1(b:byte);
implementation
procedure p1;
begin
end;
end.
Это компилируется нормально. Это ошибка?
Нет
Почему?
В паскале можно (но нами не рекомендуется) сокращать реализацию подпрограммы.
begin
var p:^integer; //работает
//var p2:integer^; //ошибка
new(p);
var i1 := ^p; //работает
var i2 := p^; //работает
p^ := i1; //работает
//^p := i2; //ошибка
end.
Так и задумано? В чём вообще разница между p^
и ^p
?
Я тоже заметил. Только один из этих вариантов неправильно форматируется.
^p
– это указатель на p
. p^
– аналог имени динамической переменной, расположенной по адресу, на который ссылается p
. У Вас получается p
– указатель на целое. p2
– непонятно что. По смыслу разыменовывать можно только указатель, но не имя типа.
Но оно почему-то у меня работало одинаково. А вообще, почему этого нет в справке? Про p^ - особенно интересно.
Тут вообще все несколько интереснее.
begin
var a := 3;
var b := @a;
var c := b^;
var d := ^b;
Writeln(a, ' ', b, ' ', c, ' ', d); // 3 $2AED04 3 3
Println(c.GetType, d.GetType); // System.Int32 System.Int32
end.
Если использовать автоформатирование, ему не понравится ^b
и оно превратится в b
!!!
Да, загадка…
Ну, integer^
я добавил только ради порядка (для всего остального в этом тесте есть 2 варианта в том же стиле). А основной вопрос - почему ^p
и p^
работают одинаково на чтение, но по разному на запись (и, оказывается, ещё и на форматирование)?
Думается, не фича это, но бага ))
Надеюсь, исправят. Хотя… Не понятно, как такое вообще возможно.
А для чего, кстати, вы использовали для первого вывода Writeln
с пробелами, хотя Println
как и для второго вывода имеет больше смысла (всм он сам пробелы добавляет) ?))
Не забываем про это
Вряд ли RAlex забыл. Print
не умеет печатать адреса (почему-то). А Write
умеет. Попробуйте.
А они в каком виде нужны? Можно так написать:
var adr := Int32(p).ToString();
И передать его в виде строки куда угодно.
Можно просто вывести с новой строки:
Console.WriteLine(adr);
Именно так.
Нет, ну это точно не правильно…