2

php5 を php7 に移植していますが、コンパイル時にエラーが発生するため、zend_string を正しく使用する方法がわかりません。php7 の変更点については、phppng ガイドに従いました。ほとんどの関数は簡単に移植できましたが、この関数は頭痛の種です。

モジュールの php5 バージョンは次のようになります。

PHP_FUNCTION(swe_houses)
{
char *arg = NULL;
int hsys_len, rc;
char *hsys = NULL;
double tjd_ut, geolat, geolon;
double cusps[37], ascmc[10]; 
int i, houses;
zval *cusps_arr, *ascmc_arr;

if(ZEND_NUM_ARGS() != 4) WRONG_PARAM_COUNT;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ddds",
        &tjd_ut, &geolat, &geolon, &hsys, &hsys_len) == FAILURE) {
    return;
}
if (hsys_len < 1)
    return;

rc = swe_houses(tjd_ut, geolat, geolon, hsys[0], cusps, ascmc);

/* create 2 index array, and 1 assoc array */
array_init(return_value);

MAKE_STD_ZVAL(cusps_arr);
array_init(cusps_arr);

if (hsys[0] == 'G')
    houses = 37;
else
    houses = 13;

for(i = 0; i < houses; i++)
    add_index_double(cusps_arr, i, cusps[i]);

MAKE_STD_ZVAL(ascmc_arr);
array_init(ascmc_arr);
for(i = 0; i < 10; i++)
    add_index_double(ascmc_arr, i, ascmc[i]);

add_assoc_zval(return_value, "cusps", cusps_arr);
add_assoc_zval(return_value, "ascmc", ascmc_arr);
add_assoc_long(return_value, "rc", rc);
}

したがって、ガイドには、「char *hsys」を「zend_string *hsys = null」に置き換える必要があると書かれています。そして、「MAKE_STD_ZVAL」関数を「ZVAL_NEW_ARR」に置き換えました。zend_parse_parameters 関数で、「s」パラメータを「S」に変更しました。

そのため、最終的にコードを次のように変更しました。

PHP_FUNCTION(swe_houses)
{
zend_string *arg = NULL;
size_t hsys_len, rc;
zend_string *hsys = NULL;
double tjd_ut, geolat, geolon;
double cusps[37], ascmc[10]; 
size_t i, houses;
zval *cusps_arr, *ascmc_arr;

if(ZEND_NUM_ARGS() != 4) WRONG_PARAM_COUNT;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "dddS",
        &tjd_ut, &geolat, &geolon, &hsys, &hsys_len) == FAILURE) {
    return;
}
if (hsys_len < 1)
    return;

rc = swe_houses(tjd_ut, geolat, geolon, hsys[0], cusps, ascmc);

/* create 2 index array, and 1 assoc array */
array_init(return_value);

/*******************************/
/*      removed for php 7      */
/*   MAKE_STD_ZVAL(cusps_arr); */
/*******************************/

ZVAL_NEW_ARR(cusps_arr);
array_init(cusps_arr);

if (hsys[0] == 'G')
    houses = 37;
else
    houses = 13;

for(i = 0; i < houses; i++)
    add_index_double(cusps_arr, i, cusps[i]);

/*******************************/
/*      removed for php 7      */   
/*    MAKE_STD_ZVAL(ascmc_arr); */
/*******************************/

ZVAL_NEW_ARR(ascmc_arr);
array_init(ascmc_arr);


for(i = 0; i < 10; i++)
    add_index_double(ascmc_arr, i, ascmc[i]);

add_assoc_zval(return_value, "cusps", cusps_arr);
add_assoc_zval(return_value, "ascmc", ascmc_arr);
add_assoc_long(return_value, "rc", rc);
}

しかし、コンパイルすると、次のエラーが表示されます。

/home/hermes/php-sweph/latest/php-sweph/sweph.c:926:42: error:   
incompatible type for argument 4 of ‘swe_houses’
rc = swe_houses(tjd_ut, geolat, geolon, hsys[0], cusps, ascmc);
                                      ^
In file included from /home/hermes/php-sweph/latest/php- 
sweph/sweph.c:23:0:

/usr/local/include/swephexp.h:742:16: note: expected ‘int’ but argument is       

of type ‘zend_string {aka struct _zend_string}’
ext_def( int ) swe_houses(
            ^
/home/hermes/php-sweph/latest/php-sweph/sweph.c:939:14: error: invalid    
operands to binary == (have ‘zend_string {aka struct _zend_string}’ and        
‘int’)
if (hsys[0] == 'G')
4

1 に答える 1