помогите разобраться - convert_to_string_ex()

dekoo

Новичок
помогите разобраться - convert_to_string_ex()

выполняю следующий пример:

Код:
PHP_FUNCTION(dekoo_tests_with_params)
{
    zval **params_array[3];

    int params_count = ZEND_NUM_ARGS();

    if(params_count < 1 || params_count > 4)
            WRONG_PARAM_COUNT;

    if(zend_get_parameters_array_ex(params_count, params_array) != SUCCESS)
            WRONG_PARAM_COUNT;

    switch(params_count) {
        case 4:
            convert_to_string_ex(params_array[3]);
            printf("Name: %s \n",params_array[3]);
        case 3:
            convert_to_string_ex(params_array[2]);
            printf("SecondName: %s \n",params_array[2]);
        case 2:
            convert_to_string_ex(params_array[1]);
            printf("Patronimic %s \n",params_array[1]);

            break;
    }

    convert_to_string_ex(params_array[0]);
    printf("Whats a %s ? \n",params_array[0]);

    return;
}
собираю экстеншн, выполняю следующий пхп код:


PHP:
dl('dekoo.so');

dekoo_tests_with_params('fuck');
при выполнении пхп-скрипта, получаю следующее:
Код:
[root@localhost dekoo]# php -f test_params.php
Whats a D&#65533;&#65533;&#65533; ?
[root@localhost dekoo]# php -f test_params.php
Whats a D&#573;&#65533; ?
[root@localhost dekoo]# php -f test_params.php
Whats a D&#65533;&#65533;&#65533; ?
[root@localhost dekoo]# php -f test_params.php
Whats a DX&#65533;&#65533; ?
[root@localhost dekoo]# php -f test_params.php
Whats a DH&#65533;&#65533; ?
[root@localhost dekoo]# php -f test_params.php
Whats a Dh&#65533; ?
т.е. как я понимаю, params_array[0] указывает на какой то участок памяти, в котором каждый раз оказывается любая фигня, кроме собственно входного парамметра :( что я делаю не так? (пример по-сути из книжки, немного модифицированный)
 

Alexandre

PHPПенсионер
параметров нет, код и не выполняется :)
я использую
Код:
char * host;
  if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, stor_class_entry, &host, &host_len) == FAILURE) {
        php_std_error_handling();
        return;
    }

printf("Whats a %s ? \n",  host);
и проблем не знаю :)
 

tony2001

TeaM PHPClub
во-первых, zend_parse_parameters() значительно удобнее.
во-вторых, с каких это пор, %s работает для zval * ?
zval * - это структура и строка только одно из её полей.
для доступа к звалу есть масса макросов вида Z_*(zval), Z_*_P(zval *) и Z_*_PP(zval **).

в данном конкретном случае, надо было выводить Z_STRVAL_P(params_array[...]).

Alexandre
большая просьба к тебе: перестань пороть чушь.
лучше исправь наконец свой xmlsec.
 

dekoo

Новичок
я просто пытаюсь найти способ, работать с заранее не известным кол-вом и типом аргументов (именно поэтому приведенный вами пример не совсем подходит), нашел примерчик вот тут - http://php4.altnet.ru/zend/zend.arguments.variable.html (правда пхп4, но не думаю что в данном конкретном коде это имеет значение, хотя... )

и позвольте, как это нет параметров, я ниже привел пхп код, в котором видно, что я передаю строку - 'fuck' в функцию? код выполняется, ибо с передачей одного параметра мы разумеется не заходим в switch, работают лишь последние две функции + return, строка переданна и если я правильно понял пример, она должна вывестись мне на консоль функцией printf()

наверняка я что-то упускаю...
 

tony2001

TeaM PHPClub
см. call_user_method() в ext/standard/basic_functions.c в 5_3, там принимаются 2 обязательных параметра и любое кол-во дополнительных.
 

dekoo

Новичок
пост выше относиться к ответу Александра... долго писал просто...
Тони спасибо, буду смотреть в этом направлении...
 
Сверху