Felmeddelanden från Ada-kompilatorn

De felmeddelanden som Ada-kompilatorn GNAT producerar brukar oftast vara mycket informativa. Det finns dock vissa fel vars orsak brukar vara svår att lista ut och sådana fel finns samlade i detta dokument. Detta är alltså en sammanställning över ovanliga och obegripliga fel som du kan konsultera om du inte riktigt förstår vad GNAT menar.

1. Ada compiler not installed on this system

Experimentera inte med student-modulen eller andra fönstersystem än CDE om du inte är väldigt säker på vad du gör.

Om man laddar in någon av modulerna misc/student-before eller misc/student-after kommer gnatmake att använda fel version av gcc vilket resulterar i nedanstående obegripliga fel. Felet kan också uppstå om man installerar andra fönstersystem än CDE.

su08-4 <35> gnatmake foo.adb
gcc -c foo.adb
gcc: foo.adb: Ada compiler not installed on this system
gnatmake: "foo.ali" WARNING: ALI or object file not found after compile
gnatmake: "foo.adb" compilation error
su08-4 <36> 

GNAT använder sig av C-kompilatorn gcc, men det finns flera olika installationer av gcc i systemet. För att GNAT ska fungera måste den gcc användas som följer med GNAT. Man kan lätt kontrollera vilken gcc man använder genom att skriva which gcc. Om svaret blir /sw/gnat-3.13/bin/gcc bör du inte få några problem. Om svaret däremot blir /student/bin/gcc uppstår ovanstående problem. Du kan också kontrollera sökvägarna genom att t.ex. skriva echo &PATH. I sökvägarna måste GNAT-katalogen ovan komma före student-katalogen.

För att lösa problemet ser man till att alltid använda misc/student-after och se till att den laddas sist av modulerna. Det senare kräver ibland manuell editering av filen .login. Om felet beror på att du installerat ett annat fönstersystem än CDE får du själv försöka lösa problemet. Om du inte förstår varför ovanstående fel uppstår bör du definitivt inte använda något annat fönstersystem än CDE.

2. (style) bad indentation

Identifierare (däribland namnet på huvudproceduren) får inte börja med en siffra.

I normala fall är GNAT inte så petig med hur källkoden ser ut. Oftast kan man ju utgå från att Ada-läget i Emacs ser till att koden snyggas till. Nedanstående hysteriskt fula program är dock inga problem att kompilera.

sjutton.adb
WITH Ada.text_io;
  usE ada.TEXT_IO;
    procedure Sjutton is
   BeGiN
  puT_Line("Hello world!");
 eND Sjutton;

Om vi däremot byter namn på filer (och huvudproceduren) till något som börjar med en siffra uppstår mystiska problem.

17.adb
WITH Ada.text_io;
  usE ada.TEXT_IO;
    procedure 17 is
   BeGiN
  puT_Line("Hello world!");
 eND 17;

I körexemplet nedan ser vi hur GNAT i det senare fallet klagar högljutt på style. Tydligen har namnet med siffran i början orsakat att flaggan -gnatpg skickas till gcc. I och för sig är det ogiltigt att kalla ett program för något som börjar med en siffra, eftersom en identifierare enligt specifikationen ska börja med en bokstav. Dock kan man tycka att GNAT kunde meddela detta istället för att gå in i något slags pedantic mode.

su08-4 <16> gnatmake sjutton.adb
gcc -c sjutton.adb
gnatbind -x sjutton.ali
gnatlink sjutton.ali
su08-4 <17> gnatmake 17.adb
gcc -c -gnatpg 17.adb
17.adb:1:01: (style) reserved words must be all lower case
17.adb:2:03: (style) bad indentation
17.adb:3:05: (style) bad indentation
17.adb:4:04: (style) reserved words must be all lower case
17.adb:5:02: (style) incorrect layout
17.adb:5:03: (style) bad indentation
17.adb:6:02: (style) bad indentation
17.adb:6:02: "end <error>;" expected in column 5
compilation abandoned
gnatmake: "17.adb" compilation error
su8-4 <18> 

3. file "underprogram.ads" not found

Filnamn måste bestå av enbart små bokstäver, även underprogram.

Vi antar att vi vill dela upp vårt program i flera filer. I vårt huvudprogram (se exempel nedan) inkluderar vi ett underprogram som finns i en separat fil.

huvudprogram.adb
with Underprogram;

procedure Huvudprogram is

begin
   Underprogram;
end Huvudprogram;

Vårt underprogram ligger i filen Underprogram.adb som vi felaktigt och mot alla konventioner har namngivit med en versal i början.

Underprogram.adb
with Ada.Text_IO;
use Ada.Text_IO;

procedure Underprogram is

begin
   Put_Line("Hello world!");
end Underprogram;

Man skulle kunna tro att GNAT skulle klara av att hitta underprogrammet ändå, eftersom stora/små bokstäver egentligen inte spelar någon roll. Istället kastar GNAT ur sig följande obegripliga meddelande, vilket brukar få folk att skapa konstiga .ads-filer helt i onödan.

su08-4 <10> gnatmake huvudprogram.adb
gcc -c huvudprogram.adb
huvudprogram.adb:1:06: file "underprogram.ads" not found
compilation abandoned
gnatmake: "huvudprogram.adb" compilation error
su08-4 <11> 

© 2001 Peter Johansson