2011-11-17 12 views
5

PHP ve şu anki zamanı kullanan bir C betiği ile garip bir sorun yaşıyorum. Benim program biraz karmaşık olmakla birlikte, sorunun bu kendini daraltır:PHP'nin exec içinde mktime ile C kodu çalıştıran

Şu andan itibaren tarih 1 dakika önce yazdırır bu C kodu, geçerli tarih ve tarih 1 dakika var:

#include <time.h> 
#include <stdio.h> 

int main(int argc, char **argv){ 
    char date[9]; 
    time_t rawtime; 
    struct tm * ptm; 
    int i; 

    time(&rawtime); 
    ptm = gmtime(&rawtime); 
    ptm->tm_min--; 

    for(i = 0; i < 3; i++){ 
    rawtime = mktime(ptm); 
    ptm = gmtime(&rawtime); 
    snprintf(date, 9, "%d %d %d", ptm->tm_mday, ptm->tm_hour, ptm->tm_min); 
    printf("%s\n", date); 

    ptm->tm_min++; 
    } 
    return 0; 
} 
Ben PHP aracılığıyla yürütüldüğünde
$ ./test 
17 20 7 
17 20 8 
17 20 9 

Ancak, ben garip sonuçlar elde

: Ben kabuğunda bu çalıştırdığınızda

, ben doğru sonuçları (baskı biçimi ay, saat, dakika günüdür) olsun. Bu PHP kodu:

<?php 
exec("path_to_exec/test", $output); 
echo "$output[0]<br/>"; 
echo "$output[1]<br/>"; 
echo "$output[2]<br/>"; 
?> 

Ve bu çıktısı şöyledir:

17 20 7 
17 17 8 
17 14 9 

saat açıkça yanlıştır. Buna neden olabilecek herhangi bir fikri olan var mı?

rawtime = mktime(ptm); 

ptm işaretçi mktime işlevi tarafından değiştirilir: Bunu yaptığınızda

:

+0

ne alabilirim zaman 'var_dump ($ çıkış)'? – jprofitt

+0

@jprofitt dizisi (3) {[0] => string (8) "17 17 40" [1] => string (8) "17 14 41" [2] => string (8) "17 11 42 "}' ' – nmat

+0

Tarih bilgisini almak için C'yi neden kullanmak istediğiniz belli bir sebep var mı? PHP'nin yerleşik tarih fonksiyonlarında ne var? – NullUserException

cevap

3

sorun değil PHP kodu, C kodu ile olduğunu. Bunu nedenle,:

rawtime = mktime(ptm); 
ptm = gmtime(&rawtime); 

Sen iki kez dolayısıyla garip sonuçlar işaretçi manipüle aslında konum. Bunun yerine yukarıdaki

, sadece yapın:

mktime(ptm); 
snprintf(...); 

Sen beklenen sonucu elde edersiniz. Yani, tam for döngü kodu olacaktır:

mktime(ptm); 
snprintf(date, 9, "%d %d %d", ptm->tm_mday, ptm->tm_hour, ptm->tm_min); 
printf("%s\n", date); 
ptm->tm_min++; 
+0

Teşekkür ederim. Bu çözüldü. Mktime'ın işaretçiyi değiştirdiğini bilmiyordum. Ama neden PHP'de değil, kabukta çalışıyor? – nmat

+0

@nmat: Dürüstçe? Fikrim yok. İlk etapta hiç çalışmamalıydı. Muhtemelen örneğinizden, buna cevap vermem gereken bir şey eksik. – netcoder

+0

Gerçekten değil. Gerçekte ne olduğundan emin olmak için burayı göndermeden önce bunu başka bir dosyaya kopyalayıp yapıştırdım. Mktime'ın dönüş değeri "Epoch, time_t türünde bir değer olarak kodlandığından beri belirtilen zaman" olduğunu (http://www.cplusplus.com/reference/clibrary/ctime/mktime/) gördüm (eğer "Dönüş Değeri" bölümüne atlanmadı, işaretçiyi değiştirdiğini de okuyacaktır). Her neyse, yazdıklarım gerçekten gereksiz, ama yanlış sonuçlar vermemeliydim sanırım ... – nmat