-
+!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