0

文字列のリストを C 関数から TCL 呼び出し関数に送信するためのガイダンスが必要です。関数の戻り値と一緒にswigを使用して、C関数からTCLプロシージャに整数、浮動小数点値のリストを送信できます。しかし、「test1」、「test2」などの文字列のリストを、swig から戻り値とともに TCL プロシージャに送り返すことができません。これに対するガイダンス/ポインタは素晴らしいでしょう。

THATが機能しているコードは次のようなものです

int addsub (int a, int b, int *result1, int *result2) {
  *result1 = a + b;
  *result2 = a - b;
  printf("\n The value is: %i, %i  \n",*result1, *result2);
  return 8;
}

Swigインターフェースは次のようになります

%apply int *OUTPUT {int *result1, int *result2};

TCL通話はこんな感じ

tclsh
% Addsub 10 5

8 15 5.

結果出力をリストとして提供します

しかし、文字列で同様のことをしようとすると、TCL の戻りリストは文字列の最初の文字のみを返します

コードが機能しない

int test_str (char *out1, char *out2) {
  char *str1, *str2;
  str1 = "Test1";
  str2 = "Test2";
  strcpy (out1,str1);
  strcpy (out2,str2);
  printf ("Out 1 is %s\n", out1);
  printf ("Out 2 is %s\n", out2);
  return 100;
}

Swigインターフェースファイルは次のようになります

%apply int *OUTPUT {char *out1, char *out2};

TCL通話はこんな感じ

Tclsh

% Teststr

Out 1 is est2
Out 2 is Test2
100 101 84

文字列全体が得られるわけではありません。文字列の最初の文字の ASCII 値を返します。

または、私のC関数がこのようなものである場合

int test_str (char *out1, char *out2) {
  char *str1,*str2;
  str1 ="Test1";
  str2 = "Test2";
  out1=str1;
  out2=str2;
  //strcpy (out1,str1);
  //strcpy (out2,str2);
  printf ("String 1 is %s\n", str1);
  printf ("String 2 is %s\n", str2);
  printf ("Out 1 is %s\n", out1);
  printf ("Out 2 is %s\n", out2);
  return 100;
}

Swigインターフェースファイルは次のようになります

%apply int *OUTPUT {char *out1, char *out2};

tclsh

% test_str

String 1 is Test1
String 2 is Test2
Out 1 is Test1
Out 2 is Test2
100 0 -127

誰かがここに欠けているものを指摘できますか?

4

1 に答える 1

2

これは非常に厄介なケースです。char *出力に使用される変数を扱う場合、SWIG には特定の問題があります。不足している情報が多すぎて、自動的に実行する必要があることをすべて把握することができません。(デフォルトでは長さ 1 の文字配列として扱われることになると思いますが、これはあまり役に立ちません。)

argoutこれを修正するには、 typemap (およびヘルパーintypemap)を指定する必要があります。

// Allocate a (short) working buffer for the string; this is the part that
// SWIG *cannot* guess for you.
%typemap(in, numinputs=0) char *OUTPUT (char temp[50]) {
    $1 = &temp;
}
// Actually how to do the mapping of strings from a local buffer into Tcl values
%typemap(tcl,argout) char * {
    $result = Tcl_NewStringObj($1, -1);
}

次に%apply、実際に正しい値でバッファ割り当てを取得する必要があります。(この種のバッファ管理を正しく行うのは非常に難しいことに注意してください。また、使用している関数シグネチャは、適切な処理を行うための適切な候補ではないことに注意してください。)


最後の例はまったく機能しません。どのメカニズムによっても値を返すわけではありません (C 文字列が機能する方法のためです。呼び出し元に通知せずに、関数の内部で設定しているだけです)。そうしない限り、文字列は実際にはコピーされませんstrcpy…</p>

于 2013-03-14T05:50:19.433 に答える