Ошибки PascalABC.NET

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.

i - это целое. Я к тому - Вы не ожидаете, что a будет иметь тип указателя на функцию? Ну или - давайте лучше так:

function q: integer;
begin
  Result := 1;
end;

begin
  var a := q;
  Println(a.GetType);
  var b: ()->integer := q;
  Println(b.GetType);
end.

У нас всё работает. Нужна более подробная информация. Лучше сохранить перед этим программу.

И - опубликовать несколько первых строчек сообщения об ошибке полностью

Файл загрузить не могу (новый пользователь). Вот ссылка на файлообменник: TestProgram.pas Скриншот ошибки:

Сведения:

Подробная информация об использовании оперативной 
(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
----------------------------------------

По-моему, обнаружилась ошибка.

// PascalABC.NET 3.2, сборка 1399 от 08.03.2017
type
  pair=record
  x,y:integer
  end;

begin
  var n:=10;
  var a:=new pair[n];
  for var i:=1 to n-1 do begin a[i].x:=i; a[i].y:=10*i end;
  Writeln(a);
  Writeln(a.Select(e->e.x+e.y).Sum)
end.

Эта программа нормально работает.

А вот так при компиляции возникает ошибка.

type
  pair=record
  x,y:integer
  end;

begin
  var n:=10;
  var a:=new pair[n];
  for var i:=1 to n-1 do
    with a[i] do begin x:=i; y:=10*i end;
  Writeln(a);
  Writeln(a.Select(e->e.x+e.y).Sum)
end.

Казалось бы, надо грешить на внешне вполне корректный оператор with. Но, если удалить оператор Writeln(a.Select(e->e.x+e.y).Sum), программа компилируется и работает нормально.

Да, ошибка. Лямбда пытается классифицировать все переменные для захвата. В with она не может справиться.

Мы наверное запретим использовать лямбды вместе с with в одной процедуре. With - пережиток прошлого