Ошибки PascalABC.NET

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

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

…для 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 лайк

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

при подключении модуля System.Drawing перестают авто вводится всего имена кроме зарезервированых, вообще подключение системных, виндовских и т.п. модулей полно ошибок, как к примеру wmp.dll при подключении к проекту System.Windows.Forms выдаёт ошибку чтения этого самого wmp.dll

Не работает код

[code]unit Program1;

interface

uses System.IO;

function GetElementFromMatrix(fname: string; i, j: integer): integer;

implementation

function GetElementFromMatrix(fname: string; i, j: integer): integer; begin assert((fname <> ‘’) and (i > 0) and (j > 0)); try var f := OpenBinary&(fname); try var arr := f.Elements.ToArray; var size := round(sqrt(f.FileSize)); finally f.Close; end; except writeln(‘File Error’); end; end;

end.[/code] Ругается на sqrt: Program1.pas(18) : Несколько подпрограмм могут быть вызваны

Набираю sqrt и открываю скобку - появляется 4 перегруженных функции, при этом 2 раза в списке присутствует Sqrt(x:real):real и 2 раза Sqrt(c:Complex):Complex. Т.е. версии всего 2, а Паскаль дублирует их, из-за этого происходит ошибка. Как исправить?

P.S. Заметил, что абсолютно все функции и процедуры (round, Copy etc) внутри моей функции также дублируются и их невозможно вызвать P.P.S. Если убрать использование System.IO, проблема остается

Да, ошибка возникла недавно - мы попытались неаккуратно добавить перегруженный Sqrt для комплексных чисел. Исправили ошибку, выложили. Проверьте.

ошибка не воспроизводится.

как к примеру wmp.dll при подключении к проекту System.Windows.Forms выдаёт ошибку чтения этого самого wmp.dll

это нативная dll? как вы ее подключаете?

Т.е. теперь мы обречены так писать?

begin
  var a:=cplx(3,-2);
  var b:=cplx(-4,5);
  Writeln(Complex.sqrt(a+b));
end.

Пока да. Надо перестраивать алгоритм выбора перегруженной функции. А пока да.

Вот вам, батенька, и весь полиморизЬм …

там мелочи. как обычно из-за вызова функции без скобок. исправляется.

Извиняюсь за излишний педантизм, но PascalABCVersion показывает не совсем последнюю версию в последней цифре.

А можно уточнить, что кто всё-таки хочет?

Вот, в коде

var a := i.ToString

переменная a будет какого типа?

Здравствуйте. Когда программа доходит до оператора read после ввода данных вылезает вот такая ошибка:

СведенияПодробная информация об использовании оперативной (JIT) отладки вместо данного диалогового окна содержится в конце этого сообщения.

************** Текст исключения ************** System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в VisualPascalABC.RunManager.WritelnStringToProcess(String id, String data) в VisualPascalABC.WorkbenchRunService.SendInputTextToProcess() в System.Windows.Forms.Control.OnClick(EventArgs e) в System.Windows.Forms.Button.OnClick(EventArgs e) в System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) в System.Windows.Forms.Control.WndProc(Message& m) в System.Windows.Forms.ButtonBase.WndProc(Message& m) в System.Windows.Forms.Button.WndProc(Message& m) в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

************** Загруженные сборки ************** mscorlib Версия сборки: 4.0.0.0 Версия Win32: 4.6.1590.0 built by: NETFXREL2 CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll

PascalABCNET Версия сборки: 3.2.0.1399 Версия Win32: 3.2.0.1399 CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/PascalABCNET.exe

System Версия сборки: 4.0.0.0 Версия Win32: 4.6.1590.0 built by: NETFXREL2 CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll

System.Core Версия сборки: 4.0.0.0 Версия Win32: 4.6.1590.0 built by: NETFXREL2 CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll ----------------------------------------

В обычном паскале при работе с этой же программой ошибок не возникает. FrameWork 4.2.6 PascalABC.NET 3.2 сборка 1399 (08.03.2017) Подскажите, что делать, пожалуйста.

Я хочу, чтобы вопросы, подобные данному, не возникали. Ведь был же снят вопрос о том, имеет место рекурсия или присваивание в теле описываемой функции за счет возможности в подобных случаях использовать переменную Result в правой части оператора присваивания и тем самым однозначно указать, что тут не рекурсия. Либо, напротив, использовать имя функции, чтобы вызвать рекурсию.

Наверно можно и в других случаях при возникновении коллизий выдать подобные рекомендации.

По поводу Вашего вопроса

var a := i.ToString

Я думаю, что тут сложно сказать что-то о типе a, пока неизвестно, что такое i. Если i - простая переменная, за которой спрятано некоторое значение, то я ожидаю, что a будет строкой, которая изобразит это значение в символьном виде. А вот если i - некий объект, представляющий собой структуру из нескольких более простых компонентов (например, последовательность или даже просто кортеж из пары полей), то тут все зависит от задумок разработчика. Но уж наверно все же это не будет символьной строкой, содержащий весь набор значений из упомянутой структуры, как это было бы при использовании JoinIntoString. Возможно, стоит просто выдать сообщение об ошибке на стадии компиляции и запретить использовать .ToString для объектов сложной структуры. Это лучше, чем получать выдачи типа System.Linq.Enumerable+d__b8

Текст программы - в студию! С указанием того, что Вы вводите в качестве данных.

Пожалуйста:
    var n:integer;
    Begin
      read(n);
      write(n);
    End.

Ввожу любое число, например, 5.