This is per definition: In C local variables are not initialized with anything! 
The weird characters you see are content from prior memory usage leftover from 
calls to other functions. Its just garbage. In C, local variables must always 
be initialized.

-----
Uwe Schindler
[EMAIL PROTECTED] - http://www.php.net
NSAPI SAPI developer
Bremen, Germany

> -----Original Message-----
> From: Chris Jiang [mailto:[EMAIL PROTECTED]
> Sent: Sunday, November 16, 2008 2:36 PM
> To: internals@lists.php.net; "M. Karpelès"
> Cc: internals@lists.php.net
> Subject: Re: [PHP-DEV] Can someone explain me why this happens please?
> 
> 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



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

Reply via email to