при подключении модуля 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 ----------------------------------------
Я хочу, чтобы вопросы, подобные данному, не возникали. Ведь был же снят вопрос о том, имеет место рекурсия или присваивание в теле описываемой функции за счет возможности в подобных случаях использовать переменную 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 - пережиток прошлого
И это будет вполне разумно. Вот как раз подобный набор запретов или рецептов, как поступать при различных накладках, я имел в виду, если ответить на Ваш вопрос