2011-12-28 79 views
0

要在strcat後使用時鐘函數產生毫秒,但它只是崩潰,可能是什麼問題?無法在輸出中顯示時鐘

FREObject result = 0; 

uint32_t len = -1; 
const uint8_t *str = 0; 
char *temp = "Millisecond: "; 
uint8_t *strAll; 

clock_t curtime = clock(); 

double *asc = (double *) curtime; //Using double datatype? 

if(FREGetObjectAsUTF8(argv[0], &len, &str) == FRE_OK) { 

    strAll = (char *)malloc(strlen(temp) + strlen(str) + 1 + strlen(asc) + 1); 
    strcpy(strAll,temp); 
    strcat(strAll,str); 
    strcat(strAll," "); 
    strcat(strAll,(char *)asc); //Is this correct? 
} 

FRENewObjectFromUTF8(strlen((const char *)strAll)+1, (const uint8_t *)strAll, &result);   

return result; 

回答

2

分配到asc非常可疑:

double *asc = (double *) curtime; //Using double datatype? 

可以測量兩個clock()值之間的差,來確定所使用的處理器時間。

你可能會更接近成功的結果:

double asc = curtime; 

strlen()操作未定義 - 的asc要麼定義下:

strAll = (char *)malloc(strlen(temp) + strlen(str) + 1 + strlen(asc) + 1); 

然後strcat()操作會失敗,可怕的;您必須將double轉換爲字符串,然後才能將字符串連接到另一個字符串。

strcat(strAll,(char *)asc); //Is this correct? 

所以,你有很多工作要做。您需要確定clock()是否是正確的系統調用。如果是,則必須先將大小和asc或轉換爲字符串,然後再將它連接到結果。

+0

另外,我認爲'clock_t'是一個長整數而不是雙精度。 – 2011-12-28 02:53:12

+0

thx,似乎很多工作在雙重字符串,我沒有找到C上的任何字符串函數?那麼將不得不使用Array? – 2011-12-28 03:07:24

+1

@JamesONG將'double'(或'long')轉換爲C中的字符串,我會推薦['sprintf()'](http://linux.die.net/man/3/sprintf)。 – 2011-12-28 03:18:56

2

Jonathan Leffler的回答概述了在代碼工作之前需要理清的一些事情。如果你還沒有準備好,你應該給他一個給予好評:)


在你當前的代碼,投給(char*)在你的代碼告訴編譯器把其中asc存儲爲char*的內存,但它不會爲你轉換字符串。 爲了將double轉換爲字符串,請查看sprintf()。我將這個替換strcat的線路:

sprintf(strAll,"%s%s %f",temp,str,asc); 

請注意,您首先需要確保strAll是大到足以容納結果字符串。對於double這可能有點棘手。不過,我真的不認爲你有一個double - clock_t可能是一個long,這意味着你可以這樣做:

long asc = (long) curtime; 

... 

strAll = malloc(strlen(temp) + strlen(str) + 1 + (asc/10 +1) + 1); 
sprintf(strAll,"%s%s %ld",temp,str,asc); 

警告:asc/10 +1只告訴你你需要多少個字符要分配給非負數。由於時鐘被記錄爲在錯誤情況下返回負值,因此您應該首先檢查。

請注意,我也刪除了演員到char*since it can cause problems in C(感謝匿名評論者)。

此外:目前malloc的結果未檢查錯誤 - 出錯時,將返回NULL,這將打破嘗試使用strAll。因此,在嘗試使用它之前確保它不是NULL是個好主意。

+0

您需要'NUL'終止*字符串*。 'malloc'不能保證0填滿內存,你最好用'calloc'代替。最好不要對'malloc'或'calloc'的返回值進行類型轉換# – 2011-12-28 03:36:24

+0

'sprintf'不會把null放入?還是我錯過了別的? – 2011-12-28 03:38:52

+0

你爲什麼說'malloc'的結果不好呢? – 2011-12-28 03:42:02