无法在输出中显示时钟

时间:2011-12-28 02:33:39

标签: c

要在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 个答案:

答案 0 :(得分: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()是否是正确的系统调用。如果是,则必须先修改大小调整以及将asccurtime转换为字符串,然后再将其连接到结果。

答案 1 :(得分:2)

Jonathan Leffler的回答概述了在代码运行之前需要解决的一些问题。如果你还没有,你应该给他一个upvote:)


在您当前的代码中,代码中的转换为(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是一个好主意。