-1

Raspberry Pi 用の SPI 拡張機能を作成していますが、追加しようとしているクラス関数で奇妙な問題が発生しました。(私が見逃している明らかなものを確認したい場合は、レポがここにあります: Github の php_spi )

私の php_spi.h では、次のように定義しました。

PHP_METHOD(Spi, blockTransfer);
#if (PHP_MAJOR_VERSION >= 5)
ZEND_BEGIN_ARG_INFO_EX(Spi__blockTransfer_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
#if (PHP_MINOR_VERSION > 0)
  ZEND_ARG_ARRAY_INFO(0, data, 1)
#else
  ZEND_ARG_INFO(0, data)
#endif
  ZEND_ARG_INFO(0, colDelay)
  ZEND_ARG_INFO(0, discard)
ZEND_END_ARG_INFO()
#else /* PHP 4.x */
#define Spi__blockTransfer_args NULL
#endif

これは、現在機能する同様に定義された他のいくつかのメソッドと一緒です。私の spi.c ファイルには、次のように定義された関数があります。

    /* {{{ proto array blockTransfer(array data[, int colDelay[, bool discard]])
   */
PHP_METHOD(Spi, blockTransfer)
{
    zend_class_entry * _this_ce;

    zval * _this_zval = NULL;
    zval * data = NULL;
    HashTable * data_hash = NULL;
    long colDelay = 1;
    zend_bool discard = 0;

    if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "a|lb", &_this_zval, Spi_ce_ptr, &data, &colDelay, &discard) == FAILURE) {
        return;
    }

    _this_ce = Z_OBJCE_P(_this_zval);

    // some code
}
/* }}} blockTransfer */

そして、関数リストに関数のエントリがあることを確認しました。

static zend_function_entry Spi_methods[] = {
    PHP_ME(Spi, __construct, Spi____construct_args, /**/ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME(Spi, __destruct, Spi____destruct_args, /**/ZEND_ACC_PUBLIC | ZEND_ACC_DTOR)
    PHP_ME(Spi, transfer, Spi__transfer_args, /**/ZEND_ACC_PUBLIC)
    PHP_ME(Spi, blockTransfer, Spi__blockTransfer_args, /**/ZEND_ACC_PUBLIC)
    PHP_ME(Spi, getInfo, Spi__getInfo_args, /**/ZEND_ACC_PUBLIC)
    PHP_ME(Spi, setupTimer, Spi__setupTimer_args, /**/ZEND_ACC_PUBLIC)
    PHP_ME(Spi, usecDelay, Spi__usecDelay_args, /**/ZEND_ACC_PUBLIC)
    { NULL, NULL, NULL }
};

コードはエラーや警告なしで正常にコンパイルされますが、関数をテストしようとすると、関数が定義されていないという PHP エラーが表示されます。何が欠けている可能性がありますか?

(明確にするために、これはこの1つの機能を除いて機能する拡張機能です)

編集: 1 年以上前の質問に反対票を投じていただきありがとうございます。

4

3 に答える 3

0

arraySpi_methodsを定義しましたが、参照していません。モジュール構造で参照する必要があります。たとえば、この例を参照してください。

関数も arginfo プロトタイプも、メインの拡張ヘッダー (または、他のコンパイル単位でシンボルを参照する必要がない限り、他のヘッダー) に配置する必要はありません。たとえば、1 つのファイルで関数を定義したものの、別の関数エントリ配列)。実際、静的ビルドには自動的に含まれていると思うので、名前の衝突を避けるためにはすべきではありません。

于 2012-08-30T20:08:34.743 に答える
0

まあ、それは私のテストファイルのタイプミスで驚くほどの時間を無駄にしました:o(

メソッドではなく、関数 blockTransfer() が未定義であるため、エラーをもっと注意深く読む必要がありました。

私が持っていたテストファイルで:

$read = $spi-blockTransfer();

どっ!

お時間を無駄にして申し訳ありません。

于 2012-09-03T22:09:56.353 に答える
0

最初に確認することは、PHP がモジュールを見つけているかどうかです。php -mコマンド ラインで実行するかphpinfo()、Web ページで呼び出してみてください。モジュールがリストされているかどうかを確認してください。

そうでない場合は、 `phpize` を使用して php 拡張機能を有効にする方法を確認してください。 また、あなたの環境は?

于 2012-08-30T01:32:15.817 に答える