Ошибки PascalABC.NET


#1575

Если F была бы обычной функцией, то все бы работало. А вы пользуетесь процедурными переменными или делегатами. Это надо понимать. Если кому-то так более более понятно, это - указатели на функцию.

Println(F) все равно не выведет ничего хорошего. Так что в некотором смысле хорошо, что он предупреждает, что возможно два преобразования. Если вы хотите указатель использовать в этом контексте как вызов функции, то F()

В случае f+f. Это сложение указателей. Оно у нас определено только для процедур без параметров и имеет совершенно другой смысл - последовательное выполнение процедур. Если хотите вызовы функций, то в этом (сложном!) контексте ставьте скобочки


#1576

Но это не объясняет. почему работает Println(0+F+F) и Println(F+0+F), но не работает Println(F+F+0). Только лишь потому, что (0+F)+F и (F+0)+F и нигде нет операции F+F ? Обычное присваивание значения процедурной переменной вот просто так, без всяких там @ и ^ создает указатель? Может, компилятор как-то должен в это дело вмешаться?


#1577

Это объясняет, Вы ошибаетесь. Операция + ассоциируется слева направо. При f + 0 компилятор видит, что один из операндов числовой, поэтому второй также стремится привести к числу за счет неявного преобразования делегата к вызову функции. Во втором случае f + f компилятор честно считает, что оба — делегаты и не стремится ничего привести. Поскольку вы не переопределили + для таких делегатов, ничего и не работает.

По поводу мутоботи с @. Это дельфийские штучки, тут они не работают. Напоминаю, что f нельзя считать указателем, это именно делегат.

Основная проблема по сравнению с c# состоит в том, что в паскале функции без параметров можно вызывать без скобок. Это кошмар для компилятора. Всякий раз в разных контекстах надо принимать решение, надо неявно делать преобразование делегата к вызову или нет


#1578

У кого воспроизводится?

В этот раз версия у меня последняя, у @ibond всё в порядке, а у меня описания нет.


#1580

Что, прям у меня одного?(

И после перезагрузки тоже не появляется… @Admin а в той версии с особо глубоким дебагом будет что то что такие проблемы поймать сможет?


#1581

Мы будем отлавливать зависания среды. А мистику трудно отловить вообще


#1582

Никакая это не мистика, вот смотрите:

image

У этой библиотеки (SharpDX) нету нормальной вики, поэтому узнавать как оно работает можно только по примерам и описаниям. И из за того что показывает только простейшие описания (их там почти нет, а сложные все не показывает) - тоже работать нереально.


#1583

Ну, я увидел, что показывает. А что не показывает? И какая битность dll и операционки?


#1584

В issue было:

  /// <summary>
  /// <p>Applications use the methods of the <see cref="T:SharpDX.Direct3D9.Device" /> interface to perform DrawPrimitive-based rendering, create resources, work with system-level variables, adjust gamma ramp levels, work with palettes, and create shaders.</p>
  /// </summary>
  /// <remarks>
  /// <p>The <strong><see cref="T:SharpDX.Direct3D9.Device" /></strong> interface is obtained by calling the <strong><see cref="M:SharpDX.Direct3D9.Direct3D.CreateDevice(System.Int32,SharpDX.Direct3D9.DeviceType,System.IntPtr,SharpDX.Direct3D9.CreateFlags,SharpDX.Direct3D9.PresentParameters[],SharpDX.Direct3D9.Device)" /></strong> method.</p><p>This interface, like all COM interfaces, inherits the <strong><see cref="T:SharpDX.ComObject" /></strong> interface methods.</p><p>The LPDIRECT3DDEVICE9 and PDIRECT3DDEVICE9 types are defined as references to the <strong><see cref="T:SharpDX.Direct3D9.Device" /></strong> interface.</p><pre> typedef struct <see cref="T:SharpDX.Direct3D9.Device" /> *LPDIRECT3DDEVICE9, *PDIRECT3DDEVICE9;
  /// </pre>
  /// </remarks>
  /// <include file=".\..\Documentation\CodeComments.xml" path="/comments/comment[@id='IDirect3DDevice9']/*" />
  /// <msdn-id>bb174336</msdn-id>
  /// <unmanaged>IDirect3DDevice9</unmanaged>
  /// <unmanaged-short>IDirect3DDevice9</unmanaged-short>
  [Guid("D0223B96-BF7A-43fd-92BD-A43B0D82B9EB")]
  public class Device : ComObject

Операционка win7x64, а у .dll не знаю как посмотреть. Но, мне кажется, если бы не подходила - то программы с ней не запускались бы, а описания от этого не должны зависеть.


#1585

В Паскале почему-то Private ни чем не отличается от Internal. Например такой код

Type A = Class
  Private P1: Int32;
  Public Constructor Create();
  Begin
    P1 := 1;
  End;
End;

Begin
  var Dat := new A();
  Console.WriteLine(A.P1);
End.

Не вызывает ошибку, хотя доступ к Private-члену класса может осуществляться только из этого класса, в то время как Internal-член доступен везде, но только внутри сборки.


#1586

Вы уже писали об этом. И вам ответили - в паскале private разрешает доступ со всего модуля, в котором он описан. Если вы разнесёте на разные модули - работать не будет.


#1587

Про это слышу впервые, но всё равно, спасибо!


#1588

Почаще читайте документацию

Кроме того, private и protected члены видны отовсюду в пределах модуля, в котором определен класс.


#1589

Просто подмывает перефразировать популярное: “Это Паскаль, детка!” :grinning:


#1590

Код:

begin
  var a := Arr(1,2,3,4,5);
  var b:=1;
  a := a?[b+1:];
end.

после нажатия кнопки “Форматировать код” (или по хоткею Ctrl+Shift+F) получается такое:

begin
  var a := Arr(1, 2, 3, 4, 5);
  var b := 1;
  a := a?[b + 1b+1:]; // <---здесь
end.

#1591

#1592

Не подключаются сборки System.IO.Compression.FileSystem и System.IO.Compression.ZipFile. Пробовал добавлять в проект и через {$reference.


#1593

Перечисленных Вами сборок не существует. Это классы, находящиеся в сборке System.IO.Compression.dll. Попробуйте написать

{$Reference 'System.IO.Compression.dll'}

#1594

Спасибо, нашёл.


#1595
unit Data;

interface

procedure p1(b:byte);

implementation

procedure p1;
begin
  
end;

end.

Это компилируется нормально. Это ошибка?