Пакет не виден, ошибка

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

viterbi.adb:12:14: "Integer_Text_IO" is not visible (more references follow)
viterbi.adb:12:14: non-visible declaration at a-inteio.ads:18
gnatmake: "viterbi.adb" compilation error

Спецификация пакета выглядит следующим образом:

package Viterbi is

  procedure Load_N_File(
    Filename : in String;
    N : in out Integer;
    M : in out Integer);

end Viterbi;

Тело пакета выглядит следующим образом:

with Ada.Integer_Text_IO; use with Ada.Integer_Text_IO;
with Ada.Strings; use Ada.Strings;

package body Viterbi is

  procedure Load_N_File(
    Filename : in String;
    N : in out Integer;
    M : in out Integer
  ) is
    N_File : File_Type;
  begin
    Open( N_File, Mode=>In_File, Name=>Filename );
    Get( N_File, N ); 
    Get( N_File, M );
    Close( N_File ); 
  end Load_N_File;

end Viterbi;

Что в моем теле пакета заставляет пакет оставаться скрытым? Разве предложение использования не должно отображать Integer_Text_IO?


person Dr. Watson    schedule 04.02.2011    source источник
comment
Многие со мной не согласны, но обычно я советую людям сначала писать свой код без каких-либо предложений use. Когда все будет готово и вы перейдете к фазе очистки, вы можете вернуть их обратно, если это сделает код более понятным. Проблема с ними заключается в том, что они позволяют вам быть ленивыми до такой степени, что у вас возникают проблемы, подобные приведенным выше, когда вы рвете на себе волосы, потому что думаете, что вещи находятся в упаковках, в которых их на самом деле нет.   -  person T.E.D.    schedule 07.02.2011
comment
Это на самом деле кажется очень разумным. Когда я пишу на C++, я всегда использую полную область видимости (т. е. boost::smarter_ptr, std::string), кроме самого верхнего модуля. Я думаю, имеет смысл принять такую ​​политику и в Аде.   -  person Dr. Watson    schedule 07.02.2011
comment
Какой компилятор вы используете? Я получаю viterbi.adb:1:31: зарезервированное слово с нельзя использовать в качестве идентификатора!   -  person Simon Wright    schedule 17.02.2011
comment
Я использую GNAT для Linux x86_64. Я сейчас не на работе, поэтому номер версии не знаю. Но прошлой осенью я скачал его с сайта Libre.   -  person Dr. Watson    schedule 18.02.2011


Ответы (2)


Предоставленный код тела пакета имеет синтаксическую ошибку: ложное "with" в "use with Ada.Integer_Text_IO;" пункт.

После исправления я получаю ошибки компиляции, связанные с невозможностью разрешить File_Type, Open и Close. Добавление «с» и «использование» Ada.Text_IO дает мне чистую компиляцию.

Итак, начало тела пакета выглядит так:

with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
with Ada.Strings; use Ada.Strings;
with Ada.Text_IO; use Ada.Text_IO;

package body Viterbi is
   ...

Если после исправления этих ошибок вы по-прежнему получаете сообщение об ошибке «не удается найти Integer_Text_IO», то у меня возникли бы подозрения в отношении вашей среды разработки, т.е. все ли установлено правильно?

person Marc C    schedule 05.02.2011
comment
Спасибо, я не могу поверить, что пропустил дополнительный с. Его удаление не привело к исчезновению ошибки, но добавление пакета Ada.Text_IO и вывод его на экран устранили ошибку. Спасибо еще раз. - person Dr. Watson; 07.02.2011

Вы можете избежать стиля ошибки "use with", как уже указывалось, используя стиль с разделителями-запятыми: With -- Testing, Ada.Integer_Text_IO, Ada.Strings;

Use
-- Testing,
Ada.Strings,
Ada.Integer_Text_IO;

это также позволяет вам комментировать определенные пакеты «withs» или «usues», как показано.

person Shark8    schedule 08.02.2011
comment
Хорошо, я не знал, что вы можете разделять имена пакетов запятой. Мне действительно нужно найти время, чтобы прочитать спецификацию языка в эти дни... - person Dr. Watson; 18.02.2011