我在Ocaml中执行从int
转换为int32
的转换类型。我更改了String
Ocaml的库(下面的代码)
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;;
我想了解产生有关分段错误的错误的原因是什么?能不能给我任何提示或建议来调试我的代码?谢谢
答案 0 :(得分:7)
好“%string_length”是OCaml原语。您只能通过更改OCaml代码来更改其返回类型。您还必须更改OCaml运行时中的代码。如果OCaml尝试将int
值(这是从运行时获得的值)视为int32
值,则它将崩溃。 int32
值将由装箱值(指针)表示,但int
值是立即值。
要做你想做的事情要做很多工作。由于字符串的长度非常有限(至少在32位架构中),我不确定它会特别有用。