Ошибки PascalABC.NET

В сторону исправно работающего паскаля. :slight_smile:

Почему он ругается, что Interpolators.pas(47) : _low не объявлен в типе TInterpolator?

Архив: Engine 5.2.4.

Кстати, ошибка с Sealed Abstract Class появилась и у меня, только после вчерашнего обновления(а так не обновлялся с февраля). В MnistNet(скачать архивом можно в теме про json) используется данная запись, и есть откомпилированная версия в подтверждение.

Ну правильно, комит запретивший это был сделан меньше месяца назад, + попадают в билд они далеко не сразу. А вообще надо было сначала обновится, а потом уже вступать в дисскусию))) Могу кстати подарить мою авто обновлялку (исходники). Держу на рабочем столе ярлык от .exe, удобно…

Вообще файлы можно и прямо на форум загружать… Перетащить файл в текст или нажать соответствующую кнопку.

image

Насчёт вашей программы:

1 лайк

18 сообщений перенесены в новую тему: Болталка PascalABC.NET

procedure p1(a,b:byte) := writeln('byte');

procedure p1(a,b:integer) := writeln('integer');

begin
  p1(byte(0),0);
end.

Выводит integer. Это нормальное поведение? Ведь второе число это константа которая может быть любого числового типа… А писать byte(...) для каждого параметра долго и выглядит не читабельно.

1 лайк

Нормальное. В Паскале, если тип константы в выражении явно не указан, то принимается по умолчанию. Для констант, имеющих целочисленное отображение, принимается integer. Вот пример:

begin
  var a:=12345678;
  var x:int64:=a*a;
  Writeln(x);
  x:=a;
  x:=x*x;
  Writeln(x)
end.

Будет выведено

260846532
152415765279684

То есть надо явно указывать типы для всех параметров, как я понял.

Нет, Вы поняли неправильно. Тип параметра уже известен из описания функции (процедуры или что там у Вас), поэтому константа, если это возможно, будет приведена к этому типу. Но если возможны варианты, как это было у @Sun_Serega, надо указать явно, а не пытаться заставлять компилятор побыть буридановым ослом.

1 лайк

Я имел ввиду в случаях таких как у @Sun_Serega.:slightly_smiling_face:

Не 1 из этих случаев не компилируется (если раскомментировать):

type
  t1 = class
    
    //[System.Runtime.InteropServices.DllImport('user32.dll')]
    //function GetKeyState(cc: byte): byte;//Атрибут DllImport неприменим к методам (только к external-подпрограммам)
  
    //[System.Runtime.InteropServices.DllImport('user32.dll')]
    //class function GetKeyState(cc: byte): byte;//Атрибут DllImport неприменим к методам (только к external-подпрограммам)
  
    //[System.Runtime.InteropServices.DllImport('user32.dll')]
    //class function GetKeyState(cc: byte): byte; external;//Подпрограмма должна иметь атрибут DllImport
  
  end;

begin end.

Я не правильно понимаю синтаксис или какой то из этих вариантов правильный, но компилятор всё равно не принимает?

Мне такой синтаксис неизвестен. external-подпрограммы должны быть глобальными процедурами.

  1. external подпрограмма ещё может быть статичной для класса:
type
  t1 = class
    class function GetKeyState(cc: byte): byte;
    external 'user32.dll';
  end;

begin end.

Это компилируется.

  1. Речь сейчас идёт про атрибут DllImport, а атрибуты не работают для глобальных подпрограмм.
[System.Runtime.InteropServices.DllImport('user32.dll')]
function GetKeyState(cc: byte): byte;//Встречено 'function', а ожидалось unit

begin end.

ясно, https://github.com/pascalabcnet/pascalabcnet/issues/777

2 лайка

Ну всё таки, а для глобальных подпрограмм атрибуты должны работать?

Описывать и реализовывать классы в отдельных type не даёт:

type
  t1 = class;//Ошибка: Отсутствует описание типа t1

type
  t1 = class end;

begin end.

Что мешает энкапсуляции:

unit UnitName;

interface

type
  t1 = class;//Ошибка: Отсутствует описание типа t1

implementation

type
  t2 = class end;
  
  t1 = class
  private 
    a: t2;
  end;

end.

В C++ это реализовано вложенными классами, а в паскале, как я понимаю, нету никакого способа.

Предописание - как в Delphi - возможно только в той же директиве type

Когда будет новая версия доступная для скачивания (когда Вы планируете ее выложить)?

Выложили последнюю версию

2 лайка