Действительно странно, такое поведение только с типом byte. если в методе использовать integer, то отрабатывает как положено. Видимо есть какие-то особенности реализации типа byte.
Слегка сокращенный код с локализованной ошибкой.
function F(b1: byte ; var b2: byte):boolean;
begin
F := b1 = b2;
end;
begin
var b:byte;
b:= 127; //Старший разряд = 0
writeln(F(b, b)); //True - правильно
b:= 128; //Старший разряд = 1
writeln(F(b, b)); //False - ошибка
end.
//По версии DotPeek функция выглядит как-то так:
(*
public static bool F(byte b1, ref byte b2)
{
return (int) (sbyte) b1 == (int) b2;
}
*)
И вот это преобразование в sbyte портит результат если в старшем разряде единица, то есть для чисел [128-255]
Исправили
Скачал консольный компилятор с сайта, на пустом файле падает с исключением:
Unhandled Exception:
System.IO.FileNotFoundException: Could not load file or assembly 'SyntaxTreeConverters, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies.
Линукс, Моно.
Качал потому, что в какой-то из последних версий в assert
'ах перестал отображаться номер строки, где упал ассёрт — может, это проверите заодно. Аналогичная проблема в WDE.
Так консольный компилятор не будете чинить? А то поработать хочется, а не на чем…
Кстати, в WDE наблюдаются странности. С одним и тем же текстом программы после копипаста можно нормально отработать, а можно получить ошибку. Более того, бывает, что можно нормально отработать, но не с первого запуска. Я бы привел картинки, но если ошибка самоустраняется, то смысл какой в этом?
Залили правильную версию. Попробуйте
Спасибо, попробую, как доберусь.
Вот ещё одна проблема: замыкания для self
работают только если явно его указывать. Например.
type A = class
procedure f(x:integer);
begin
print(x);
end;
procedure g();
begin
Arr(1, 2, 3).ForEach(x -> self.f(x));
end;
end;
begin
end.
Не работает, если убрать self
, причём по тексту ошибки непонятно, чего он хочет. Студенты путаются и бросают использовать лямбды, что прискорбно. Нельзя ли сделать, чтобы работало без self
или хотя бы сообщение об ошибке с указанием его добавить?
function sqrtN(P,e,x0:double); Не указан возвращаемый тип функции ,но всё успешно компилируется . Подсказка ,кстати, говорит ,что это процедура. Так и должно быть ?
Полный код приведите пожалуйста
Исправили. Версия на сайте.
program fun;
var P:real;
// Вычисление квадратного корня из P с погрешностью е при начальном приближении x0.
function sqrtN(P,e,x0:double);
var x,dx,f:double;
begin
x:=x0;
while(true) do
begin
f:=x*x-P;
if(abs(f)<e) then break;
dx :=-f/(2.0*x);
x:=x+dx;
end;
sqrtN:=x;
end;
begin
writeln('Введите P');
readln(P);
writeln('Корень из P:',sqrtN(P,0.00001,1):5:3);
end.
У Вас какая-то старая версия. В последней версии - ошибка компиляции, что правильно.
По поводу procedure - да, в Intellisense - неточность. Постараемся исправить
Спасибо. Успехов в развитии проекта.
begin
var t := new System.Dynamic.ExpandoObject();
t.name = 'name';
end.
Так же не работает.
У нас не падает - правда, сообщение об ошибке дурацкое - исправим. А у Вас последняя версия?