トップ 一覧 検索 ヘルプ RSS ログイン

BugTrack-その他のメモ/12の変更点

-
+!19.9.1 Pythonリストからchar **への変換
+*example.iに以下を追加
+ // SWIGにchar **を特別扱いするように知らせる
+ %typemap(in) char ** {
+   /* リストかどうかチェック */
+   if (PyList_Check($input)) {
+     int size = PyList_Size($input);
+     int i = 0;
+     $1 = (char **) malloc((size+1)*sizeof(char *));
+     for (i = 0; i < size; i++) {
+       PyObject *o = PyList_GetItem($input,i);
+       if (PyString_Check(o))
+ 	$1[i] = PyString_AsString(PyList_GetItem($input,i));
+       else {
+ 	PyErr_SetString(PyExc_TypeError,"list must contain strings");
+ 	free($1);
+ 	return NULL;
+       }
+     }
+     $1[i] = 0;
+   } else {
+     PyErr_SetString(PyExc_TypeError,"not a list");
+     return NULL;
+   }
+ }
+ 
+ // 関数呼びだしの前にmallocしてあったchar **配列を片付ける
+ %typemap(freearg) char ** {
+   free((char *) $1);
+ }
+ 
+ // そしてテスト関数
+ %inline %{
+ int print_args(char **argv) {
+     int i = 0;
+     while (argv[i]) {
+          printf("argv[%d] = %s\n", i,argv[i]);
+          i++;
+     }
+     return i;
+ }
+ %}
+*動作
+ >>> import example
+ >>> print_args(["Dave","Mike","Mary","Jane","John"])
+ Traceback (most recent call last):
+   File "<stdin>", line 1, in <module>
+ NameError: name 'print_args' is not defined
+ >>> example.print_args(["Dave","Mike","Mary","Jane","John"])
+ argv[0] = Dave
+ argv[1] = Mike
+ argv[2] = Mary
+ argv[3] = Jane
+ argv[4] = John
+ 5