2015-11-11 102 views
2

我試圖編譯這段代碼:建築,當我得到這個錯誤https://github.com/RanaExMachina/ada-fuse如何在Ada中顯式指定泛型類型的大小?

不幸的是:

fuse-system.ads:147:04: size clause not allowed for variable length type 

這似乎是因爲它的代碼試圖設置記錄的大小是一個問題,具有通用類型作爲條目。這似乎是一個新的錯誤,因爲開發人員在2.5年前撰寫這個問題時沒有遇到這個問題。不幸的是,他不能在短時間內幫助我,但我必須讓圖書館去。然而,在解決這個問題上我有點無奈。

基本上我覺得我不得不告訴gnat這個類型會有多大,與gnat相信的是相反的先驗知識:它是一種訪問類型。在record或泛型類型定義中。

相關的部分是:

fuse-main.ads: 
    package Fuse.Main is 
    package IO is 
     new Ada.Direct_IO (Element_Type); 
    type File_Access is access IO.File_Type; 

fuse-system.ads: 
    generic 
    type File_Access is private; 
    package Fuse.System is 
    ... 
    type File_Info_Type is record 
     Flags  : Flags_Type; 
     Fh_Old  : Interfaces.C.unsigned_long; 
     Writepage : Interfaces.C.int; 
     Direct_IO : Boolean := True; 
     Keep_Cache : Boolean := True; 
     Flush  : Boolean := True; 
     Nonseekable : Boolean := True; 
     Fh   : File_Access; 
     Lock_Owner : Interfaces.Unsigned_64; 
    end record; 
    type File_Info_Access is access File_Info_Type; 
    pragma Convention (C, File_Info_Type); 
    for File_Info_Type'Size use 32*8; 

我蚊蚋的版本是:4.9.2-1(Debian的傑西)

回答

7

知道File_Access是訪問類型,但內Fuse.System編譯沒有;所有它知道的是它是確定的並且支持分配和平等。實際可能是數百個字節。

告訴編譯器,它訪問類型,嘗試這樣的事情(我被壓縮成一個包,我的便利,在Mac OS X,因此,64位指針大小;它編譯OK):

with Ada.Text_IO; 
package Fuse_Tests is 

    generic 
     type File_Type is limited private; 
     type File_Access is access File_Type; 
    package Fuse_System is 
     type File_Info_Type is record 
     Fh : File_Access; 
     end record; 
     for File_Info_Type'Size use 64; 
    end Fuse_System; 

    type File_Access is access Ada.Text_IO.File_Type; 

    package My_Fuse_System is new Fuse_System 
    (File_Type => Ada.Text_IO.File_Type, 
     File_Access => File_Access); 

end Fuse_Tests; 

或者,替代在評論中建議:

with Ada.Text_IO; 
package Fuse_Tests is 

    generic 
     type File_Type; 
    package Fuse_System is 
     type File_Access is access File_Type; 
     type File_Info_Type is record 
     Fh : File_Access; 
     end record; 
     for File_Info_Type'Size use 64; 
    end Fuse_System; 

    package My_Fuse_System is new Fuse_System 
    (File_Type => Ada.Text_IO.File_Type); 

    -- if needed ... 
    subtype File_Access is My_Fuse_System.File_Access; 

end Fuse_Tests; 
+0

我不知道它是否有意義(或者是有幫助的話),使文件不完整類型在這裏。我想我會嘗試,並在通用本身中定義訪問類型,以便泛型可以在聲明實際文件的相同公共部分實例化。 – manuBriot

+0

@manuBriot,我已經包含了你的建議。 –