5

次のようなコードがあります。

    PyObject *callback;
    PyObject *paths;

    // Process and convert arguments
    if (!PyArg_ParseTuple(args, "OO:schedule", &paths, &callback))
            return NULL;

PyArg_ParseTuple 内で正確に何が起こるのでしょうか? 私の推測では、コールバックは、args (PyObject* も) に渡した関数ポインターを取得します。PyArg_ParseTuple はどのように関数ポインタを PyObject* に変換しますか?

私が知りたいのは、同じコールバック関数ポインターを 2 回渡すとどうなるかということです。コールバックは PyArg_ParseTuple 内で新しい PyObject を割り当てられると思うので、毎回異なるメモリ アドレスを取得しますが、同じコールバック関数ポインタが含まれます。

しかし、PyObject_Hash コールバックを実行すると、毎回異なる値が生成されますよね? (アドレスが毎回違うので…)

4

2 に答える 2

1

PyArg_ParseTuple「O」引数のタイプは気にしません。変換は行われません。新しいオブジェクトは作成されません。オブジェクトのアドレスは、指定した C 変数にドロップされPyObject *ます。2 つの引数のそれぞれに対してまったく同じことを行います。

の関連性を想像できませんPyObject_Hash。コールバック引数の 2 つの具体化を比較したい場合は==、アドレスで使用してください。

于 2010-08-22T12:00:56.310 に答える
0

ポイントは、同じコールバックを 2 回渡すと、2 つのオブジェクトを受け取ることになりますが、最後に書き込まれたオブジェクトだけを読み取ることは決して許可されないということです。2 つのポインターのいずれかが参照されないため、一種のメモリ リークが発生します。もちろん、すべての混乱をきれいにするために、ガベージコレクターは最終的に通過します。でもとにかく...

コールバックとパスで PyObject_Hash を呼び出す必要があることを読み間違えました。それは同じです。しかし、おそらくコールバックとパスを比較したいでしょう: if(callback==paths) {printf("it's the same callabck");}

于 2010-08-20T17:14:05.027 に答える