Как исправить: «Аргумент преобразования типов должен быть одним выражением» в Аде 95 - PullRequest
2 голосов
/ 30 марта 2019

Я пишу простую программу на Ada95, чтобы проверить, верен ли ввод макета шахматной доски.Я совсем новичок в Аде, и я понимаю, что мне есть чему поучиться.Я получаю следующие сообщения об ошибках:

35: 31: аргумент преобразования типа должен быть одним выражением

47: 07: аргумент преобразования типа должен быть одним выражением

47: 22: недопустимый операнд для преобразования массива

53: 10: аргумент типапреобразование должно быть одним выражением

58: 10: аргумент преобразования типа должен быть одним выражением

61: 13: аргумент преобразования типа долженбыть одним выражением

64: 13: аргумент преобразования типа должен быть одним выражением

66: 13: аргумент преобразования типа должен быть однимвыражение

68: 13: аргумент преобразования типа должен быть одним выражением

76: 15: недопустимое использование знака подтипа в выражении или вызове

Я включил свой полный код ниже, чтобы, если есть что-то, что может вызвать проблему в рекламеeclaration, это доступно для справки.

-- RULES:
-- Only black squares may have pieces on them
-- Black squares start at the bottom left hand corner
-- Total checker count for a color cannot exceed 12
-- A color may not have more than 7 kings

with Ada.Text_IO, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Integer_Text_IO;

procedure Checker_Checker is
  type Checkers_Piece is ("b", "BK", "RK", "BC", "RC");
  type Checkers_Board is array (1..8, 1..8) of Checkers_Piece;
  Checkers_String: String(1..64);
  invalid, 
    BK_Count, -- black king checker
    RK_Count, -- red king checker
    RC_Count, -- red checker
    BC_Count, -- black checker
    b_Count, -- blank space
    Char_Count      : Integer := 0;

  procedure Print_Board (Object: in Checkers_Board) is
    Print_Divider: String(1..17);
    Print_Squares: String(1..17);
  begin
    Print_Divider := "-----------------";
    Print_Squares := "| | | | | | | | |";
    for X in 1..8 loop
      Put_Line(Print_Divider);
      for Y in 1..8 loop
        Print_Squares(Y+1) := Checkers_Board(X, Y);
      end loop;
      Put_Line(Print_Squares);
    end loop;
    Put_Line(Print_Divider);
  end Print_Board;

begin
  Get(Checkers_String);
  for I in 1..8 loop
    for J in 1..8 loop
      Char_Count := Char_Count + 1;
      Checkers_Board(I, J) := Checkers_String(Char_Count);
    end loop;
  end loop;

  for Y in 1..8 loop
    for X in 1..8 loop
      if Checkers_Board(Y, X) = 'b' then
        Put_Line("There is a piece on a white space.");
        invalid := invalid + 1;
      end if;

      if Checkers_Board(Y, X) = "BK" then
        BK_Count := BK_Count + 1;
        BC_Count := BC_Count + 1;
      elsif Checkers_Board(Y, X) = "RK" then
        RK_Count := RK_Count + 1;
        RC_Count := RC_Count + 1;
      elsif Checkers_Board(Y, X) = "RC" then
        RC_Count := RC_Count + 1;
      elsif Checkers_Board(Y, X) = "BC" then
        BC_Count := BC_Count + 1;
      elsif Checkers_Board(Y, X) = "b" then
        b_Count := b_Count + 1;
      else
        Put_Line("There is an  unidentified character on the board.");
      end if;
    end loop;
  end loop;

  Print_Board;

  if RK_Count > 7 then
    Put_Line("There are more than 7 Red Kings on the board.");
  end if;

  if BK_Count > 7 then
    Put_Line("There are more than 7 Black Kings on the board.");
  end if;

  if RC_Count > 12 then
    Put_Line("There are more than 12 Red Checkers on the board.");
  end if;

  if BC_Count > 12 then
    Put_Line("There are more than 12 Black Checkers on the board.");
  end if;

  if b_Count < 32 then
    Put_Line("There are too many checkers on the board.");
  end if;

  if invalid = 0 then
    Put_Line("This is a valid checker board.");
  else
    Put_Line("This is an invalid checker board.");
  end if;
end Checker_Checker;

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

1 Ответ

5 голосов
/ 30 марта 2019

Для начала

type Checkers_Piece is ("b", "BK", "RK", "BC", "RC");

пытается объявить перечисление; но литералы перечисления являются идентификаторами, а не строками. Так что должно быть

   type Checkers_Piece is (b, BK, RK, BC, RC);

Тогда в

    Print_Squares := "| | | | | | | | |";
    for X in 1..8 loop
      Put_Line(Print_Divider);
      for Y in 1..8 loop
        Print_Squares(Y+1) := Checkers_Board(X, Y);
      end loop;
      Put_Line(Print_Squares);
    end loop;

Вы явно ожидали, что Checkers_Board(X, Y) будет единичным Character, но в своем заявлении вы намеревались сделать его разновидностью String, с числом * 2 Character с.

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

Причина ваших ошибок 'аргумента преобразования типа' заключается в том, что в таких строках, как

   Checkers_Board(I, J) := Checkers_String(Char_Count);

Checkers_Board - это тип ; вам нужен объект этого типа, а не сам тип. Синтаксис, который вы используете, предназначен для преобразования типов ( ARM 4.6 ).

...