2

SICStus Prolog 4 FFI から C へのロープをまだ学習中ですが、https://sicstus.sics.se/sicstus/docs/latest4/html/sicstus.html/ の例の述語 c1/2 について具体的な質問があります。 Foreign-Code-Examples.html#Foreign-Code-Examples .

ex.pl には次の行が含まれます。

 foreign(c1,  c, c1(+integer, [-integer])).

ex.c には次のスニペットが含まれます。

 /* c1(+integer, [-integer]) */
 SP_integer c1(a)
 SP_integer a;
 {
    return(a+9);
 }

これは小さい整数に対して機能します。

 | ?- c1(100,X).
 X = 109 ?
 yes
 | ?- c1(100000000000000,X).
 X = 100000000000009 ?
 yes

大きな整数では機能しません。

 | ?- c1(10000000000000000000000000,X).
 X = 1590897978359414793 ? 
 yes

小さい整数と大きい整数の両方を正しく (そして効率的に) 処理するにはどうすればよいですか? IIRC の大きな整数は "SP_integers" として渡すことができないため、これらの値を項 ("SP_term_ref") として渡し、適切な動的型チェックを行う必要があります (データ抽出が続く可能性があります)。助けてください!

4

2 に答える 2

3

そうです、外部型integerは C 型に対応し、SP_integer小さな整数にのみ使用できます。任意のサイズの整数の場合term、C の type に対応する外部の typeSP_term_refを使用し、SP_get_integer_bytes()関数を使用してバイトを取得する必要があります。詳細については、Prolog から C への任意サイズの整数の受け渡しを参照してください。

SP_get_integer_bytes()すべてのサイズの整数に対して機能し、引数が整数でない場合はエラー コードで正常に失敗するため、明示的な動的型チェックは必要ありません。

于 2015-03-19T00:03:11.480 に答える
1

よくわかりませんが、整数には特定のサイズがあるためかもしれません。基本整数の範囲は [−32767,+32767]、長整数 [−2147483647,+2147483647] ...

于 2015-03-18T23:33:18.653 に答える