Компилятор (то что делает .exe файл из текстового) и анализатор кода (фича IDE, то есть текстового редактора) - существуют отдельно. Поэтому они могут быть не согласны. В данном случае это баг анализатора кода.
Попробуйте включить в настройках использование компилятора для помощи анализатору кода - может помочь.
В общем случае, то что вам выводит при выполнении - то и правда. Но .GetType не всё рассказывает. К примеру:
##
procedure WriteTypes<T>(o: T);
begin
$'Compilation-time: {typeof(T)}'.Println;
$' Execution-time: {_ObjectToString(o?.GetType)}'.Println;
Println('='*30);
end;
// Тип при компиляции: базовый класс исключений Exception
// А при выполнении тип InvalidOperationException - потому что его на самом деле сохранили в переменную
var e: Exception := new System.InvalidOperationException;
WriteTypes(e);
// Во время компиляции тип Nullable<integer> - допускающий значение типа integer или nil
var x: integer?;
WriteTypes(x); // Тип при выполнении nil, потому что ещё ничего не присвоили
x := 5;
WriteTypes(x); // Тип при выполнении integer, потому что уже заполнили
Включил “Использовать компилятор для Inellisense” - теперь при наведении на любую из переменных m, m1, m2 выдается подсказка, содержащая то, что я и ожидал: m: array[,] of integer.
Спасибо! Вы мне очень помогли ))
Будьте добры, поясните ещё, пожалуйста, про ленивые последовательности и select:
##
// когда на входе массив,
// то select, поскольку возвращает последовательность,
// не рекомендуется использовать:
var a1 := ReadAllLines('Table2.txt'); // a: array of string
var m1 := Matr(a1.Select(x -> x.ToIntegers).ToArray);
// а если на входе последовательность?
var a2 := ReadLines('Table2.txt'); // a: sequence of string
var m2 := Matr(a2.Select(x -> x.ToIntegers).ToArray);
// - допустимо ли здесь использовать select?
Слишком общий вопрос.
Попробуйте сначала почитать эту презентацию и подумать, как бы вы создавали массив из ленивой последовательности.
А затем уже задавайте вопросы.
А она у вас как то странно закрывается? Я видел кучу багов, IDE или создаёт окно внутренней ошибки, или становится неюзабельно (ничего не тыкается). Ну или и то и то. Но чтобы беззвучно вылетало я не видел.
var max,rez:integer;
[cache]
function F(n:integer):integer;
begin
if n=0 then
begin
result:=0;
exit
end;
if n mod 3 = 0
then result:=F(n div 3)
else result:=F(n-1)+1;
end;
begin
for var i:=1700000000 to 2100000000 do
begin
rez:=F(i);
if max<rez then max:=rez
end;
write(max);
end.
А ведь если использовать ValueTuple вместо Tuple - в данном случае, вместимость станет в 2 раза больше…
Но для этой задачи не важно - потому что перед тем как писать код надо подумать головой.
F(n) = F(n/3) значит что для всех n.Divs(3) результат будет 0.
А все следующие результаты будут на 1 больше предыдущего.
То есть F(n) это просто n mod 3.
Это реакция на переполнение словаря - в нём оказывается огромное количество различных элементов. Реализация [cache] всего лишь заполняет словарь, и лишь неправомерное использование [cache] приводит к его переполнению