Ошибки PascalABC.NET

на лекции разбирали этот пример,дома он почему то не заработал… версия последняя от 6.02.17 Подскажите,в чем ошибка.

1 лайк

поставьте после ToInteger и ToString круглые скобки. ошибку исправим

У меня вот так работает:

  s:=s.Replace('(\d+)\+(\d+)',m->(m.Groups[1].Value.ToInteger+m.Groups[2].Value.ToInteger).ToString);

Ошибка уже исправлена

Может, я тупой, но когда скобки ставил, все равно ошибка была, только другая. Groups[i] - это разве не объект? А если он объект, то странновато, что его ToInteger может превратить в значение (ну разве только она втихаря свойство Value выбирает)…

А она ГДЕ исправлена и как? PascalABC.NET 3.2, сборка 1383 от 09.02.2017 считает, что на текущую минуту обновлений нет…

Вот так в настоящий момент работает.

begin
   var s := 'dfh';
   s:=s.Replace('(\d+)\+(\d+)',m->(m.Groups[1].Value.ToInteger+m.Groups[2].Value.ToInteger).ToString);
end.

У кого не работает - в лекции ошибка. Без скобок можно обойтись, но Value писать обязательно

Понял. Собственно, это то же самое, что я написал выше. Я подумал, что вдруг сделали, как в Excel VBA: там если мы к объекту целиком обращаемся в выражении, по умолчанию возвращается его свойство Value.

не работает функция f:=OpenBinary&(‘имя файла’) (пишет “неизвестная функция”) и f.ReadElement (пишет,что ReadElement не объявлен в типе file of integer/(real) версия от 10.02.2017.

1 лайк

и CreateBinary аналогично

Скачайте сейчас

Сборка 1385 от 14.02, пишет, что версия актуальна.

В этой сборке этот код работает:

begin
  var f := OpenBinary&<integer>('a.dat');
end.

Результат вдохновления “Лекцией №5”

function MatrMainDiag<T>(a:array[,]of T):sequence of T;
begin
  var n:=Min(a.RowCount,a.ColCount);
  for var i:=0 to n-1 do 
    yield a[i,i]
end;

Это какой-то синтаксический “затык”, потому что вот так все компилируется без проблем. И, что тоже немаловажно, верно выполняется.

function MatrMainDiag<T>(a:array[,]of T):sequence of T;
begin
  var n:=Min(a.RowCount,a.ColCount);
  for var i:=0 to n-1 do begin
    var j:=i;
    yield a[i,j]
    end
end;

Исправили. Версия на сайте

1 лайк

Не знаю, ошибка это или нет, но даже если не ошибка, то недостаток большой.

Читаем в Справке “Целые типы”:

…для T определена экземплярная функция ToString, возвращающая строковое представление переменной данного типа.

Почему-то мне приятно думать, что Range(10,12) вернет последовательность безусловно целых чисел 10, 11, 12 и проекция Select(i->i.ToString) преобразует её в последовательность соответствующих строковых представлений. Но не тут-то было!

С гораздо меньшим энтузиазмом попробовал применить к последовательности доступный “по точке” метод ToString, потому что он уже не раз подкладывал мне известное хрюкающее парнокопытное (это не претензия, а констатация моей криворукости в данном вопросе). Результат был ожидаем:

И вот вопрос: можно без танцев с бубном получить из числовой последовательности последовательность строковых представлений членов этой последовательности? Не строку, которую дает JoinIntoString, а именно последовательность?

И да, у меня .NET 4.0, возможно в 4.5 это все работает, но проверить не могу.

Компилятор думает, что i.ToString в i->i.ToString это делегат. Так работает

begin
    writeln(2);
    Range(1,100).Select(i->i.ToString()).Println;
end.

Т.е. нужно писать не i.ToString, а i.ToString() как в C# Но это же синтаксически не очевидно.

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

type
  sometype = record
    name: string;
  end;

const
  obj: sometype = (name: 'test');

var
  k := Arr(obj);

begin
end.

UPD спасибо за оперативную работу, вижу в issues на gitHub уже есть.

Исправили. Версия на сайте

1 лайк