2011-12-28 61 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