0

私は Ocaml で型を from に変換しintていint32ます。StringOcamlのライブラリのいくつかの機能を変更しました(以下のコード)

external length : string -> int32 = "%string_length"
external create: int32 -> string = "caml_create_string"
external unsafe_blit : string -> int32 -> string -> int32 -> int32 -> unit
  = "caml_blit_string" "noalloc"

let sub s ofs len =
  if ofs < 0l or len < 0l or add ofs len > length s
  then invalid_arg "String.sub"
  else begin
    let r = create len in
    unsafe_blit s ofs r 0l len;
    r
  end

int -> int32コードを実行したときからコード内の多くの場所を変更したことに注意してください。エラーが発生しました。

./xsd2coq < grammar/cpf.xsd > coq/cpf.v
Segmentation fault (core dumped)

xsd2coq.ml私がバッファを持っているファイルには次のものがあります:

let main () =

  let xml = parse_xml stdin in
  let xsds = Xsd_of_xml.xsd_of_xml xml in

  let b = Buffer.create 10000 in

  Coq_of_xsd.genr_ml b xsds;
  Buffer.output_buffer stdout b;;

let _ = run main;;

セグメンテーション違反に関するエラーが発生する理由は何ですか? 私のコードをデバッグできるようにするためのヒントや提案を教えてください。ありがとうございました

4

1 に答える 1

7

「%string_length」はOCamlプリミティブです。OCamlコードを変更するだけではリターンタイプを変更することはできません。また、OCamlランタイムでコードを変更する必要があります。intOCamlが値(ランタイムから取得したもの)を値として処理しようとすると、int32クラッシュします。値はボックス化されたint32値(ポインター)で表されますが、int値は即値です。

あなたがやろうとしていることをするのは大変な仕事になるでしょう。文字列の長さは非常に限られているため(少なくとも32ビットアーキテクチャでは)、特に役立つかどうかはわかりません。

于 2012-05-04T03:17:28.837 に答える