2017-01-15 16 views
1

php5를 php7로 이식하고 있지만 컴파일 할 때 오류가 발생하므로 zend_string을 올바르게 사용하는 방법을 알지 못합니다. 나는 phpng guide을 따라 php7의 변화를 추적했다. 대부분의 기능을 쉽게 포팅 할 수 있지만이 기능은 나에게 두통을주고 있습니다.컴파일시 php5 모듈을 PHP 7로 포팅하고 zend_string 이슈

모듈의 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); 
} 

그래서 가이드 내가 "zend_string * hsys = 널 (null)"에 "문자 * hsys"를 교체해야했다. 그리고 "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); 
} 

을하지만 compilling에 다음과 같은 오류가 날 수 있습니다 :

/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') 

답변

1

것부터 먼저 zend_string이 전혀 마음에 들지입니다 char* 또는 char[]이므로 색인을 참조하여 요소에 액세스 할 수 없습니다. 배열이 아닌 struct입니다.

이것은 zend_string이 무엇인지입니다 : 내가 뭘 할 것은 그래서 당신은 일반 문자열 함수를 사용하여 배열과 같은 요소를 참조 할 수 있습니다 다시 char*-hsys을 변경

struct _zend_string { 
    zend_refcounted_h gc; 
    zend_ulong  h;    /* hash value */ 
    size_t   len; 
    char    val[1]; 
}; 

입니다.

다음은 내가 작동 할 것이라고 생각하는 것의 예입니다. 변경된 내용을 설명해 드리겠습니다.

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

    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); 

    /* ZVAL_NEW_ARR(cusps_arr); unneeded */ 
    array_init(&cusps_arr); /* added & */ 

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

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

    /* ZVAL_NEW_ARR(ascmc_arr); unneeded */ 
    array_init(&ascmc_arr); /* added & */ 


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

    /* this may cause issues, not sure though */ 
    add_assoc_zval(return_value, "cusps", &cusps_arr); /* added & */ 
    add_assoc_zval(return_value, "ascmc", &ascmc_arr); /* added & */ 
    add_assoc_long(return_value, "rc", rc); 
} 
+0

와우 정말 대단히 감사합니다. 그것이해야하는 정확하게 일한다! 너 내가 얼마나 감사하고 있는지 알고 싶지 않아. 나는 며칠 동안 노력했고, 몇 주 전부터 내 질문에 대한 대답을 얻지 못할 것으로 예상했습니다. 따라서이 솔루션을 사용하면 모듈 작업을 다시해야합니다! 고맙습니다 고맙습니다! – HermesTrismegistus

+0

나는 거기에 있었고, 나를 믿어. 다행히 도울 수있어. – markzz