Ah, greet appreciation! The memset() way works perfectly, but the res[0] way didn't work.

Beside, I think you are right. Although I'm just a beginner in C language, but from the experience of JS and PHP, also according to the document I've been searching all the time, there should be something related to time.h functions which might be more suitable for what I'm doing. However, at the mean time, I'm just trying to get 'strings' to work in C and Zend, hehe!

Still, this is a really strange experience. Where are those characters come from? Shouldn't it be a clean array when I first created them? Anything related to the zval structure?

Thank you again!


M. Karpelès wrote:
Hi,

Try initializing your "res" variable first.

either:

memset(&res, 0, sizeof(res));

Or:

res[0] = 0;

Both will work, it all depends if you want to write "clean" code, of
"fast" code (and your definition of both).

I believe there are cleaner way to do what you are doing, but I'll let
that to your curiosity.


Mark

Le dimanche 16 novembre 2008 à 21:15 +0800, Chris Jiang a écrit :
Hi all, since I started playing around with Zend API, I thought it would be better to start writing some small functions as practice. Then my entire weekend became nightmare.

I've tried to add a function activated in dynamic module, and it gives a very strange result. This function is really simple: taking an integer as argument, returns a 'hhhh:mm:ss' format string. If additional argument (BOOL) is set to true, then the 'hhhh' will turn to 'DD hh'.

Now, it works fine while compiled with GCC alone in standard C style, but while working as a PHP function, the result is like this:

(!靠备h2339:44:05
(!靠备窵▒97D 11:44:05

What are the characters in front of them? Where did they come? It's really confusing......

The original Zend style code is as follow:

--------------------------------------------------------------------

ZEND_FUNCTION(cj_format_clock)
{
        char res[50], myb[10];
        long mys = 0;
        double myd, myh, mym;
        zend_bool useDay = 0;

if ( zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "l|b", &mys, &useDay) == FAILURE )
        {
php_error(E_ERROR, "Expecting cj_format_clock([(INT)seconds])", get_active_function_name(TSRMLS_C));
                return;
        }

        if ( mys < 0 )
        {
php_error(E_ERROR, "Number of second must be a possitive integer", get_active_function_name(TSRMLS_C));
                return;
        }

        if ( useDay )
        {
                myd = mys / 86400;
                mys %= 86400;
                sprintf(myb, "%.0f", myd);
                strcat(res, myb);
                strcat(res, "D ");
        }

        myh = mys / 3600;
        mys %= 3600;
        if ( myh < 10 )
                strcat(res, "0");
        sprintf(myb, "%.0f", myh);
        strcat(res, myb);

        strcat(res, ":");

        mym = mys / 60;
        mys %= 60;
        if ( mym < 10 )
                strcat(res, "0");
        sprintf(myb, "%.0f", mym);
        strcat(res, myb);

        strcat(res, ":");

        if ( mys < 10 )
                strcat(res, "0");
        sprintf(myb, "%d", mys);
        strcat(res, myb);

        RETURN_STRING(res, 1);
}



Hi,

Try initializing your "res" variable first.

either:

memset(&res, 0, sizeof(res));

Or:

res[0] = 0;

Both will work, it all depends if you want to write "clean" code, of
"fast" code (and your definition of both).

I believe there are cleaner way to do what you are doing, but I'll let
that to your curiosity.


Mark

Le dimanche 16 novembre 2008 à 21:15 +0800, Chris Jiang a écrit :
Hi all, since I started playing around with Zend API, I thought it would be better to start writing some small functions as practice. Then my entire weekend became nightmare.

I've tried to add a function activated in dynamic module, and it gives a very strange result. This function is really simple: taking an integer as argument, returns a 'hhhh:mm:ss' format string. If additional argument (BOOL) is set to true, then the 'hhhh' will turn to 'DD hh'.

Now, it works fine while compiled with GCC alone in standard C style, but while working as a PHP function, the result is like this:

(!靠备h2339:44:05
(!靠备窵▒97D 11:44:05

What are the characters in front of them? Where did they come? It's really confusing......

The original Zend style code is as follow:

--------------------------------------------------------------------

ZEND_FUNCTION(cj_format_clock)
{
        char res[50], myb[10];
        long mys = 0;
        double myd, myh, mym;
        zend_bool useDay = 0;

if ( zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "l|b", &mys, &useDay) == FAILURE )
        {
php_error(E_ERROR, "Expecting cj_format_clock([(INT)seconds])", get_active_function_name(TSRMLS_C));
                return;
        }

        if ( mys < 0 )
        {
php_error(E_ERROR, "Number of second must be a possitive integer", get_active_function_name(TSRMLS_C));
                return;
        }

        if ( useDay )
        {
                myd = mys / 86400;
                mys %= 86400;
                sprintf(myb, "%.0f", myd);
                strcat(res, myb);
                strcat(res, "D ");
        }

        myh = mys / 3600;
        mys %= 3600;
        if ( myh < 10 )
                strcat(res, "0");
        sprintf(myb, "%.0f", myh);
        strcat(res, myb);

        strcat(res, ":");

        mym = mys / 60;
        mys %= 60;
        if ( mym < 10 )
                strcat(res, "0");
        sprintf(myb, "%.0f", mym);
        strcat(res, myb);

        strcat(res, ":");

        if ( mys < 10 )
                strcat(res, "0");
        sprintf(myb, "%d", mys);
        strcat(res, myb);

        RETURN_STRING(res, 1);
}



--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to