3

ctypes ライブラリを使用して Python から char* に配列を C ライブラリに渡す方法が必要です。

私が試したいくつかの方法は、セグメンテーション違反につながり、他の方法はゴミ情報につながりました。

4

1 に答える 1

3

私はこの問題にしばらく悩まされてきたので、他の人が恩恵を受けることができるように、小さなハウツーを書くことにしました。

このCコードを持っている:

void passPointerArray(int size, char **stringArray) {
  for (int counter=0; counter < size; counter++) {
    printf("String number %d is : %s\n", counter, stringArray[counter]);
  }
}

ctypes を使用して Python から呼び出したいので (ctypes についての詳細は以前の投稿を参照してください)、次のコードを書き留めます。

def pass_pointer_array():
  string_set = [
    "Hello",
    "Bye Bye",
    "How do you do"
  ]

  string_length = len(string_set)

  select_type = (c_char_p * string_length)
  select = select_type()

  for key, item in enumerate(string_set):
    select[key] = item

  library.passPointerArray.argtypes = [c_int, select_type]
  library.passPointerArray(string_length, select)

今読んだところ、非常に単純に見えますが、セグメンテーション違反を回避するために ctypes に渡す適切な型を見つけるのはとても楽しかったです...

于 2013-10-02T11:57:51.753 に答える