У меня Ошибка: Несколько подпрограмм могут быть вызваны
воспроизводится всегда при любых разных типах у двух f1. И это правильное поведение — в Object Pascal перегруженные версии сливаются с одноимёнными в предках
SunSerega — приведите пожалуйста мотивировку необходимости исправления, иначе я закрою Issue
Некстати: В хвалёном Free Pascal вообще выбирается первая из двух перегруженных функций если они имеют разные типы значений.
Copy link
Contributor
Author
приведите пожалуйста мотивировку необходимости исправления, иначе я закрою Issue
-
А ссылки выше (на issue в POCGL) не достаточно? Эта issue вместе с парой похожих ломает половину методов интерфейса
OpenCLABC
. -
Нет, это не правильно. При 2 функциях с одинаковыми параметрами — выбирается та, что находится в текущем классе или ближайшем наследнике:
type
t1 = class
function f1: byte;
begin
Writeln('t1');
end;
end;
t2 = class(t1)
function f1: word;
begin
Writeln('t2');
end;
end;
t3 = class(t2) end;
begin
var a2 := new t2;
var a3 := new t3;
a2.f1; // f1 из текущего класса
a3.f1; // f1 из ближайшего наследника
end.
Да, понял. Вот минимальный код:
type
tt1 = class end;
TBase = class
function f1: integer := 1;
end;
TErr = class(TBase)
function f1: tt1 := nil;
end;
begin
var a: TErr;
a.f1;
end.
2.pas(14) : Несколько подпрограмм могут быть вызваны
То есть, обязательно один класс возвращаемого значения определен в PascalABC.NET
type
TBase = class
function f1: real;
begin
Println('f1: real')
end;
end;
TErr = class(TBase)
function f1: integer;
begin
Println('f1: integer')
end;
end;
begin
var a := new TErr;
var i := a.f1;
a.f1;
end.
Результаты запуска:
То есть, если мы присваиваем переменной, то выбирается ближайшая версия правильно. А если вызываем как процедуру — то происходит ошибочное поведение. Судя по коду компилятора, во втором случае выбирается наиболее общий тип, что является неправильным поведением
is_Viktoryia 1 / 1 / 0 Регистрация: 01.12.2018 Сообщений: 33 |
||||
1 |
||||
Ошибка «Несколько подпрограмм могут быть вызваны»11.10.2019, 23:39. Показов 2860. Ответов 1 Метки нет (Все метки)
Здравствуйте! Помогите, пожалуйста, решить эту проблему..
Добавлено через 13 минут
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
11.10.2019, 23:39 |
Ответы с готовыми решениями: Создать последовательность цифр, перед какой может быть знак «+» или «-«, в конце пропуск. Ошибка «Тип параметра или возвращаемого значения не может быть описанием записи» Program zadacha8; procedure… Написать программу проверки правильности написания сочетаний «жи», «ши», «ча», «ща», «чу», «щу». Исправить ошибки Решение заданий типа «Array»,»Matrix»,»String»,»File»,»Text»»» 1 |
ValentinNemo 2373 / 775 / 561 Регистрация: 15.01.2019 Сообщений: 2,394 |
||||
12.10.2019, 02:27 |
2 |
|||
РешениеНемного поправил код.
Ошибки:
1 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
12.10.2019, 02:27 |
2 |
type TArray = Array[Byte, Byte] Of Real; procedure InputSize(const c: Char; var x: Byte); begin repeat Write(c, '='); ReadLn(x); until (x > 0); end; procedure GenerateArray(var x: TArray; var n, m: Byte); var i, j: Byte; begin WriteLn; Randomize; InputSize('n', n); InputSize('m', m); for i := 0 to n - 1 do begin for j := 0 to m - 1 do begin x[i, j] := Random() * 100 - 50; Write(' ', x[i, j]:6:2); end; WriteLn; end; end; procedure ProcessArray(var x: TArray; const n, m: Byte); var i, j: Byte; trace, temp: Real; begin WriteLn; trace := 0; for i := 0 to n - 1 do trace := trace + x[i, i]; if (trace < 1) then begin for i := 0 to n - 1 do begin temp := Ord(Not Odd(i)); for j := 0 to m - 1 do begin x[i, j] := temp; Write(x[i, j]:2:0); end; WriteLn; end; end else WriteLn('trace >= 1'); end; var a, b: TArray; nA, mA, nB, mB: Byte; begin GenerateArray(a, nA, mA); ProcessArray(a, nA, mA); GenerateArray(b, nB, mB); ProcessArray(b, nB, mB); end.
Ошибка «Несколько подпрограмм могут быть вызваны».
Pascal ABC.
Net. begin var d : = ReadlnString(‘Вас приветствует программа, которая может делить ‘ + ‘два числа с остатком.
Напишите, пожалуйста, свое имя’) ; Writeln(‘Здравствуйте, ‘, d, ‘!
‘) ; repeat Writeln(‘Как нужно написать ответ?
‘, #13#10, ‘1 вариант.
5 : 3 = 1(ост.
2)’, #13#10, ‘2 вариант.
5 = 3 * 1 + 2′, #13#10, ‘0 — завершить работу’) ; var c : char ; Repeat c : = ReadlnChar(‘Введите 0, 1 или 2 : ‘) ; case c of ‘0’ : exit ; ‘1’, ‘2’ : break ; end ; until False ; var a, b : BigInteger ; if not BigInteger.
TryParse(ReadlnString(‘Введите целочисленное делимое : ‘), a) then begin Writeln(‘Вы ввели неверное значение.
Работа завершена’) ; Exit end ; if not BigInteger.
TryParse(ReadlnString(‘Введите целочисленный делитель : ‘), b) then begin Writeln(‘Вы ввели неверное значение.
Работа завершена’) ; Exit end ; {if b = 0 then begin writeln(‘Вы ввели неверное значение.
‘) ; exit end ; } if c = ‘1’ then WritelnFormat(‘{0} : {1} = {2}(ост.
{3})’, a, b, a div b, a mod b) else WritelnFormat(‘{0} = {1} * {2} + {3}’, a, b, a div b, a mod b) ; var f : char ; Repeat f : = ReadlnChar(‘Если вы хотите завершить работу, введите «0», если продолжить — любую букву.
‘) ; case f of ‘0’ : exit ; else break ; end ; until False ; until False end.
На этой странице вы найдете ответ на вопрос Ошибка «Несколько подпрограмм могут быть вызваны»?. Вопрос
соответствует категории Информатика и уровню подготовки учащихся 5 — 9 классов классов. Если ответ полностью не удовлетворяет критериям поиска, ниже можно
ознакомиться с вариантами ответов других посетителей страницы или обсудить с
ними интересующую тему. Здесь также можно воспользоваться «умным поиском»,
который покажет аналогичные вопросы в этой категории. Если ни один из
предложенных ответов не подходит, попробуйте самостоятельно сформулировать
вопрос иначе, нажав кнопку вверху страницы.
Загрузка…