4

ファイルを暗号化するAdaプログラムを作成しました。ターゲットマシンのメモリを節約するために、ブロックごとにそれらを読み取ります。残念ながら、AdaのディレクトリライブラリはLong_Integerでファイルサイズを読み取り、読み取りをほぼ2GBのファイルに制限します。2GBを超えるファイルを読み込もうとすると、プログラムは実行時に失敗し、スタックオーバーフローエラーが発生します。

ここでのドキュメントは、上記の私の理解の原点です。ファイルサイズを自分で定義したタイプに読み込むにはどうすればよいですか?1つは、上限を100GBに増やすために25バイトのようなものを要求するようにすることができます。

4

1 に答える 1

5

これにGCCバグ55119を投稿しました。

待っている間(!)、以下のコードはMac OS XMountainLionで動作します。Windowsでは、より複雑です。を参照してくださいadainclude/adaint.{c,h}

エイダスペック:

with Ada.Directories;
package Large_Files is

   function Size (Name : String) return Ada.Directories.File_Size;

end Large_Files;

および本体(一部はからコピーAda.Directories):

with GNAT.OS_Lib;
with System;
package body Large_Files is

   function Size (Name : String) return Ada.Directories.File_Size
   is
      C_Name : String (1 .. Name'Length + 1);
      function C_Size (Name : System.Address) return Long_Long_Integer;
      pragma Import (C, C_Size, "large_file_length");
   begin
      if not GNAT.OS_Lib.Is_Regular_File (Name) then
         raise Ada.Directories.Name_Error
           with "file """ & Name & """ does not exist";
      else
         C_Name (1 .. Name'Length) := Name;
         C_Name (C_Name'Last) := ASCII.NUL;
         return Ada.Directories.File_Size (C_Size (C_Name'Address));
      end if;
   end Size;

end Large_Files;

およびCインターフェース:

/* large_files_interface.c */

#include <sys/stat.h>

long long large_file_length (const char *name)
{
  struct stat statbuf;
  if (stat(name, &statbuf) != 0) {
    return 0;
  } else {
    return (long long) statbuf.st_size;
  }
}

他のUnixシステムでstruct stat64使用する必要があるかもしれません。stat64()

通常どおりCインターフェイスをコンパイルして-largs large_files_interface.oから、gnatmakeコマンドラインに追加します。

編集:x86_64マシンであるMac OS X(およびDebian)ではsizeof(long)8バイトです。したがって、のコメントadaint.cは誤解を招くAda.Directories.Size可能性があり、最大2**63-1を返す可能性があります。

于 2012-10-29T16:06:03.450 に答える