Python

プログラマの考えが・・身につく本より(Python):ポインタ

More than 3 years have passed since last update.

今回はポインタの操作ということで、

pythonでポインタを使うには、、、Pythonでは特に考えずにコードが書けてしまったので

あまり勉強になってないのですが、調べたことを記載させて頂きます。

いろいろ調べてみると ctypes — Pythonのための外部関数ライブラリなるものがありました。

これをチュートリアルが日本語だったのでありがたく見ていたのですが、Windowsでの利用方法だったので、Macで使うにはといろいろ探していたらstacoverflowですでにあがっていました。

自分の環境でも使ってみたので記載しておこうと思います。

>>> from ctypes import *

>>> cdll.LoadLibrary("libc.dylib")
<CDLL 'libc.dylib', handle 7fff6903da98 at 0x1052f6fd0>
>>> libc = CDLL("libc.dylib")
>>> printf = libc.printf
>>> printf(b"Hello, %s\n", b"World!")
Hello, World!
14
>>> strchr = libc.strchr
>>> strchr(b"abcdef", ord("d"))
87110915
>>>

肝心の課題として

append()関数を作成する

というものでしたが、

配列の操作で以下解答C++コード

void append(arrayString& s, char c){

int oldLength = 0;
while(s[oldLength] != 0) {
oldLength++;
}
arrayString newS = new char[oldLength + 2];
for(int i = 0; i < oldLength; i++) {
newS[i] = s[i];
}
newS[oldLength] = c;
newS[oldLength + 1] = 0;
delete[] s;
s = newS;
}

自分のPythonコード

#!/usr/bin/env python

#coding:utf-8

#ctypesモジュール(mac用)
from ctypes import *
#cdll.LoadLibrary("libc.dylib")
#libc = CDLL("libc.dylib")

def add(s,c):
print('前の文字列:',list(s))
print('前のポインタ:', c_wchar_p(s))
newlength = len(s)+2
newS = []
for i in s:
newS += i
for j in c:
newS += j
print('後の文字列:',newS)
print('後のポインタ:', c_wchar_p(str(newS)))

>>>(実行ターミナル)
>>> from test38 import add
>>> add("test","! ")
前の文字列: ['t', 'e', 's', 't']
前のポインタ: c_wchar_p(140481723952464)
後の文字列: ['t', 'e', 's', 't', '!', ' ']
後のポインタ: c_wchar_p(140481723970864)
>>>

あんまりctypesモジュール必要になかったけど、PythonでもC言語使えることを知りました。