Ошибки PascalABC.NET

Почему?

В паскале можно (но нами не рекомендуется) сокращать реализацию подпрограммы.

1 лайк
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 !!!

1 лайк

Да, загадка…

Ну, integer^ я добавил только ради порядка (для всего остального в этом тесте есть 2 варианта в том же стиле). А основной вопрос - почему ^p и p^ работают одинаково на чтение, но по разному на запись (и, оказывается, ещё и на форматирование)?

Думается, не фича это, но бага ))

Надеюсь, исправят. Хотя… Не понятно, как такое вообще возможно.

А для чего, кстати, вы использовали для первого вывода Writeln с пробелами, хотя Println как и для второго вывода имеет больше смысла (всм он сам пробелы добавляет) ?))

Не забываем про это :smile:

Вряд ли RAlex забыл. Print не умеет печатать адреса (почему-то). А Write умеет. Попробуйте.

А они в каком виде нужны? Можно так написать:

var adr := Int32(p).ToString();

И передать его в виде строки куда угодно.

Можно просто вывести с новой строки:

Console.WriteLine(adr);

Именно так.

Нет, ну это точно не правильно…

вы ошибаетесь. object и указатели несовместимы.

Тогда почему это работает:

begin
  var i := 5;
  writeln(0,'',@i);
end.

И надо тогда хотя бы сделать чтоб это тоже работало:

begin
  var i := 5;
  Println(0,'',@i);
end.

Потому что write магическая функция