Newsgroups: php.internals,php.internals Path: news.php.net Xref: news.php.net php.internals:41948 php.internals:41949 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 27231 invoked from network); 16 Nov 2008 13:35:55 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 16 Nov 2008 13:35:55 -0000 X-Host-Fingerprint: 61.50.134.238 unknown Received: from [61.50.134.238] ([61.50.134.238:14707] helo=localhost.localdomain) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id A2/A2-13764-AB120294 for ; Sun, 16 Nov 2008 08:35:55 -0500 To: internals@lists.php.net,=?UTF-8?B?Ik0uIEthcnBlbMOocyI=?= Message-ID: <492021AB.9040106@gmail.com> Date: Sun, 16 Nov 2008 21:35:39 +0800 User-Agent: Thunderbird 2.0.0.17 (X11/20080914) MIME-Version: 1.0 CC: internals@lists.php.net References: <56.41.13764.40D10294@pb1.pair.com> <1226841630.14940.26.camel@localhost> In-Reply-To: <1226841630.14940.26.camel@localhost> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Posted-By: 61.50.134.238 Subject: Re: [PHP-DEV] Can someone explain me why this happens please? From: jiangcat@gmail.com (Chris Jiang) 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); >> } >> >