Ошибки PascalABC.NET

А что тут удивительного?

  1. F+F выдаёт Нет перегруженной подпрограммы с такими типами параметров.
  2. Println(F) выдаёт Возможны два преобразования типов

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

Например то, что вызовы 0+F+F и F+0+F корректны, а F+F+0 - нет.

Println(0+F+F);
Println(F+0+F);
Println(F+F+0); // Нет перегруженной подпрограммы с такими типами параметров

Перекликается со старым баяном

Дэти ! Запомните такие слова как вилька, тарелька, бутилька, пишются бэз мягкого знака, а такие слова как сол, фасол, кон - пишются с мягким знаком. Но самое сложное слово в русском языке, - это слово тоска, это не та тоска, что забор строят, а та тоска, который грусть, но не тот груст что в лэсу собирают и суп варят, а тот груст который тоска !

Это ещё можно объяснить… А вот это нет:

У @ibond не воспроизводится.
Если у кого то воспроизводится - отзовитесь :slight_smile:.

Обновился - пропало.

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

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

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

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

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

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

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

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

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

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

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

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

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

image

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

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

В 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 не знаю как посмотреть. Но, мне кажется, если бы не подходила - то программы с ней не запускались бы, а описания от этого не должны зависеть.

Код:

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

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

unit Data;

interface

procedure p1(b:byte);

implementation

procedure p1;
begin
  
end;

end.

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

Нет