Несколько подпрограмм могут быть вызваны ошибка в pascal

@miks1965

У меня Ошибка: Несколько подпрограмм могут быть вызваны
воспроизводится всегда при любых разных типах у двух f1. И это правильное поведение — в Object Pascal перегруженные версии сливаются с одноимёнными в предках

SunSerega — приведите пожалуйста мотивировку необходимости исправления, иначе я закрою Issue

Некстати: В хвалёном Free Pascal вообще выбирается первая из двух перегруженных функций если они имеют разные типы значений.

@SunSerega



Copy link


Contributor


Author

приведите пожалуйста мотивировку необходимости исправления, иначе я закрою Issue

  1. А ссылки выше (на issue в POCGL) не достаточно? Эта issue вместе с парой похожих ломает половину методов интерфейса OpenCLABC.

  2. Нет, это не правильно. При 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.

@miks1965

Да, понял. Вот минимальный код:

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

@miks1965

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.

Результаты запуска:

То есть, если мы присваиваем переменной, то выбирается ближайшая версия правильно. А если вызываем как процедуру — то происходит ошибочное поведение. Судя по коду компилятора, во втором случае выбирается наиболее общий тип, что является неправильным поведением

@miks1965

is_Viktoryia

1 / 1 / 0

Регистрация: 01.12.2018

Сообщений: 33

1

Ошибка «Несколько подпрограмм могут быть вызваны»

11.10.2019, 23:39. Показов 2860. Ответов 1

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте! Помогите, пожалуйста, решить эту проблему..

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
program ррр;
const
    Max_M =  5;
    Max_N = 10;
var
    A : array [1..Max_M, 1..Max_N] of integer;
    Max_i : array [1..Max_M] of integer;
    Min_j : array [1..Max_N] of integer;
    Min_Max_i,Max_Min_j : integer;
 
procedure Random;
var
    i, j : byte;
begin
    randomize;
    for i := 1 to Max_M do
      for j := 1 to Max_N do A[i,j] := random(100);
end;
 
procedure Sorting;
var
    i, j : byte;
begin
 
    for i := 1 to Max_M do
    begin
      Max_i [i]:= A[i,1];
      for j := 2 to Max_N do
        if Max_i [i]< A[i,j] then Max_i [i]:= A[i,j];
    end;
 
    Min_Max_i := Max_i[1];
    for i := 2 to Max_M do
      if Min_Max_i > Max_i [i]then Min_Max_i := Max_i[i];
 
    for j := 1 to Max_N do
    begin
      Min_j [j]:= A[1,j];
      for i := 2 to Max_M do
        if Min_j [j]> A[i,j] then Min_j [j]:= A[i,j];
    end;
 
    Max_Min_j := Min_j[1];
    for j := 2 to Max_N do
      if Max_Min_j < Min_j [j]then Max_Min_j := Min_j[j];
 
end;
 
procedure WriteS;
var
    i, j : byte;
begin
    WriteLn('Исходная таблица');
    for i := 1 to Max_M do
    begin
      for j := 1 to Max_N do Write(A[i,j]:4);
      WriteLn;
    end;
    WriteLn;
    WriteLn('минимальный среди максимальных элементов каждой строки: ', Min_Max_i:4);
    WriteLn;
    WriteLn('максимальный среди минимальных элементов каждого столбца: ', Max_Min_j:4);
    WriteLn;
end;
 
begin
    Random;
    Sorting;
    WriteS;
    
end.

Добавлено через 13 минут
Пишет ошибку на строке 69 несколько подпрограмм могут быть вызваны



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

11.10.2019, 23:39

Ответы с готовыми решениями:

Создать последовательность цифр, перед какой может быть знак «+» или «-«, в конце пропуск.
Используя только ввод с клавы (процедуру Read(c), где с-БУКВЕНАЯ переменная) создать…

Ошибка «Тип параметра или возвращаемого значения не может быть описанием записи»
Есть программа, но в ней ошибка, помогите исправить.

Program zadacha8;
Uses Crt;

procedure…

Написать программу проверки правильности написания сочетаний «жи», «ши», «ча», «ща», «чу», «щу». Исправить ошибки
дан текст.написать программу проверки правильности написания сочетаний &quot;жи&quot;, &quot;ши&quot;, &quot;ча&quot;, &quot;ща&quot;,…

Решение заданий типа «Array»,»Matrix»,»String»,»File»,»Text»»»
большая просьба помочь решить где-то около 35-40 (из 100) задач (мне не понятных) типа массив и…

1

ValentinNemo

2373 / 775 / 561

Регистрация: 15.01.2019

Сообщений: 2,394

12.10.2019, 02:27

2

Лучший ответ Сообщение было отмечено is_Viktoryia как решение

Решение

Немного поправил код.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
program ppp;
const
  Max_M =  5;
  Max_N = 10;
var
  A: array [1..Max_M, 1..Max_N] of integer;
  Max_i: array [1..Max_M] of integer;
  Min_j: array [1..Max_N] of integer;
  Min_Max_i, Max_Min_j: integer;
 
procedure RandomElem;
var
  i,j: byte;
begin
  randomize;
  for i:= 1 to Max_M do
    for j:= 1 to Max_N do
      A[i,j]:= random(100);
end;
 
procedure SortingElem;
var
   i,j: byte;
begin
  for i:= 1 to Max_M do
    begin
      Max_i[i]:= A[i,1];
      for j:= 2 to Max_N do
        if Max_i[i] < A[i,j] then
          Max_i [i]:= A[i,j];
    end;
 
  Min_Max_i := Max_i[1];
  for i:= 2 to Max_M do
      if Min_Max_i > Max_i[i] then
         Min_Max_i := Max_i[i];
 
  for j:= 1 to Max_N do
    begin
      Min_j[j]:= A[1,j];
      for i := 2 to Max_M do
        if Min_j[j] > A[i,j] then
          Min_j[j]:= A[i,j];
    end;
 
  Max_Min_j:= Min_j[1];
  for j:= 2 to Max_N do
      if Max_Min_j < Min_j[j] then
        Max_Min_j:= Min_j[j];
 
end;
 
procedure WriteElem;
var
  i,j: byte;
begin
  WriteLn('Исходная таблица:');
  for i:= 1 to Max_M do
    begin
      for j:= 1 to Max_N do
         Write(A[i,j]:4);
      WriteLn;
    end;
  WriteLn;
  WriteLn('Минимальный среди максимальных элементов каждой строки: ', Min_Max_i:4);
  WriteLn;
  WriteLn('Максимальный среди минимальных элементов каждого столбца: ', Max_Min_j:4);
  WriteLn;
end;
 
begin
  RandomElem;
  SortingElem;
  WriteElem;
  readln;
end.

Ошибки:
1. Имя программы была написана кириллическим алфавитом.
2. Выбрали неудачное имя для своей процедуры random. Функция с таким именем уже есть в модуле System.



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

Форум мехмата ЮФУ

Загрузка…

Понравилась статья? Поделить с друзьями:
  • Несколько ошибок на одно правило
  • Несколько ошибок в трудовой книжке
  • Несколько одеялец верно есть ошибка
  • Несколько огурец ошибка образование слова
  • Несколько мгновений лексическая ошибка или нет