В сторону исправно работающего паскаля.
Почему он ругается, что Interpolators.pas(47) : _low не объявлен в типе TInterpolator?
Архив: Engine 5.2.4.
Кстати, ошибка с Sealed Abstract Class появилась и у меня, только после вчерашнего обновления(а так не обновлялся с февраля). В MnistNet(скачать архивом можно в теме про json) используется данная запись, и есть откомпилированная версия в подтверждение.
Ну правильно, комит запретивший это был сделан меньше месяца назад, + попадают в билд они далеко не сразу. А вообще надо было сначала обновится, а потом уже вступать в дисскусию))) Могу кстати подарить мою авто обновлялку (исходники). Держу на рабочем столе ярлык от .exe, удобно…
Вообще файлы можно и прямо на форум загружать… Перетащить файл в текст или нажать соответствующую кнопку.
Насчёт вашей программы:
procedure p1(a,b:byte) := writeln('byte');
procedure p1(a,b:integer) := writeln('integer');
begin
p1(byte(0),0);
end.
Выводит integer
. Это нормальное поведение? Ведь второе число это константа которая может быть любого числового типа… А писать byte(...)
для каждого параметра долго и выглядит не читабельно.
Нормальное. В Паскале, если тип константы в выражении явно не указан, то принимается по умолчанию. Для констант, имеющих целочисленное отображение, принимается 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 из этих случаев не компилируется (если раскомментировать):
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-подпрограммы должны быть глобальными процедурами.
- external подпрограмма ещё может быть статичной для класса:
type
t1 = class
class function GetKeyState(cc: byte): byte;
external 'user32.dll';
end;
begin end.
Это компилируется.
- Речь сейчас идёт про атрибут
DllImport
, а атрибуты не работают для глобальных подпрограмм.
[System.Runtime.InteropServices.DllImport('user32.dll')]
function GetKeyState(cc: byte): byte;//Встречено 'function', а ожидалось unit
begin end.
Ну всё таки, а для глобальных подпрограмм атрибуты должны работать?
Описывать и реализовывать классы в отдельных 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
Когда будет новая версия доступная для скачивания (когда Вы планируете ее выложить)?
Выложили последнюю версию