Конфликт типов Ada в индексах массива

#arrays #types #ada

#массивы #типы #ada

Вопрос:

Это код, и алгоритм работает на Java, но в Ada он по-прежнему вызывает CONSTRAINT_ERROR . В Ada мы начинаем индексировать массив с 1, а не с 0, как в большинстве других языков. По какой-то причине я все еще индексирую из массива.

  procedure spiral is

   M : Matrix := ((11,22,33,44,55),(1,8,3,8,9),(10,10,20,30,1));

   lastcol, firstcol, lastrow : Integer := 1;
   rowsize, colsize : Integer := 0;

   procedure Print ( M: in Matrix ) is
   begin

  rowsize := M'Length(1);
  colsize := M'Length(2);

  while lastrow<=rowsize loop

        for I in Index range Index(firstcol)..Index(colsize) loop
           Put( Elem'Image(M(Index(lastrow),Index(I))));
           Put( Ascii.HT );
        end loop;

        lastrow := lastrow   1;

        if (lastrow>=rowsize) then 
           return;
        end if;

        for J in Index range Index(lastrow)..Index(rowsize) loop
           Put( Elem'Image(M(Index(J),Index(colsize))));
           Put( Ascii.HT );
        end loop;

        colsize := colsize - 1;


        for I in reverse Index range Index(colsize)..Index(lastcol) loop
           Put( Elem'Image(M(Index(rowsize), Index(I))));
           Put( Ascii.HT );
        end loop;

        rowsize := rowsize- 1;
        lastcol := lastcol  1;

        for I in reverse Index range Index(rowsize)..Index(lastrow) loop
           Put( Elem'Image(M(Index(I), Index(firstcol))));
           Put( Ascii.HT );
        end loop;

        firstcol := firstcol   1;

     end loop;
   end Print;

begin
   --Put(rowDown);
   Print(M);
end spiral;
 

пакет Matrix определяется как:

 package Matrix_pack is

    type Index is new Integer;
    type Elem is new Integer;
    type Matrix is array (Index range <>, Index range <>) of Elem;

end Matrix_pack;
 

Комментарии:

1. Почему бы не создать индексы colLeft etc? Более чистые, чем ненужные преобразования типов, такие как M(Index(rowUp),Index(I)) индексация массива.

2. Потому что тогда я не смогу выполнять над ними операции.

3. Также при выполнении M(Index(rowUp),Index(I)) я получаю CONSTRAINT_ERROR: проверка индекса не удалась

4. ??? Литералы и все обычные операторы должны работать с вашими новыми целочисленными типами. Чего вы не можете сделать, так это смешивать их с другими целочисленными типами без преобразования — в чем смысл придания им нового типа. (В противном случае вы бы использовали подтип). Итак, что на самом деле не работает? … Если вы получаете это CONSTRAINT_ERROR, вы пытались проиндексировать вне массива. Создайте MCVE, который показывает, что вы пытаетесь сделать.

5. Из вашего комментария выше кажется, что вы получили свою программу, по крайней мере, для компиляции, и теперь вы задаете другой вопрос. Не могли бы вы, возможно, обновить свой вопрос, чтобы отразить эту новую ситуацию?

Ответ №1:

Решение может быть выполнено в два этапа:

  • Первое: сделайте тип индексации, используемый в цикле, явным:
 for I in Index range colLeft .. colRight loop
   Put (Elem'Image (M (rowUp, I)));
end loop;
 
  • Второе: исправьте объявления colLeft и colRight :
 colLeft, colRight : Index;