Ошибки PascalABC.NET


#1596

Нет


#1597

Почему?


#1598

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


#1599
begin
  var p:^integer;     //работает
  //var p2:integer^;  //ошибка
  new(p);
  
  var i1 := ^p;       //работает
  var i2 := p^;       //работает
  
  p^ := i1;           //работает
  //^p := i2;         //ошибка
end.

Так и задумано? В чём вообще разница между p^ и ^p?


#1600

Я тоже заметил. Только один из этих вариантов неправильно форматируется.


#1601

^p – это указатель на p. p^ – аналог имени динамической переменной, расположенной по адресу, на который ссылается p. У Вас получается p – указатель на целое. p2 – непонятно что. По смыслу разыменовывать можно только указатель, но не имя типа.


#1602

Но оно почему-то у меня работало одинаково. А вообще, почему этого нет в справке? Про p^ - особенно интересно.


#1603

Тут вообще все несколько интереснее.

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 !!!


#1604

Да, загадка…


#1605

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


#1606

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


#1607

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


#1608

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


#1609

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


#1610

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


#1611

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

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

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

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

Console.WriteLine(adr);

#1612

Именно так.


#1613

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


#1614

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


#1615

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

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

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

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