2011-12-28 5 views
0

strcatの後にクロック機能を使用してミリ秒を生成するには単純にクラッシュしますが、何が問題なのでしょうか? asc出力にクロックを表示することができません

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

割り当て極めて疑わしいある:

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

に使用したプロセッサ時間を決定するために、2つの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またはcurtimeを文字列に修正する必要があります。

+0

また、 'clock_t'はdouble型ではなく長い整数型であると思います。 –

+0

thxは、文字列に二重に作用するように思えますが、Cでは文字列関数が見つかりませんか?だから配列を使用する必要がありますか? –

+1

@ Jamesongは 'double'(または' long')をC言語の文字列に変換するために、 '' sprintf() '](http://linux.die.net/man/3/sprintf)をお勧めします。 –

2

ジョナサン・レフラーの答えは、コードが機能するには、事前にソートする必要があることを概説しています。あなたがいない既に持っている場合は、あなたが彼にupvote :)あなたの現在のコードで


を与える必要があり、あなたのコード内(char*)へのキャストはascchar*として格納されているメモリを治療するためのコンパイラに指示しますが、それはあなたのための文字列への変換を行いません。 doubleを文字列に変換するには、sprintf()をご覧ください。あなたが最初に確認してくださいstrAllは、結果の文字列を格納するのに十分な大きさであることを確認する必要があります

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

注:私はこれでstrcatの行を置き換えます。これは、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'はメモリを埋めることが保証されていません。代わりに' calloc'を使うのが良いでしょう。 'malloc'や' calloc'の戻り値をタイプキャストしないほうがいいです –

+0

'sprintf'はnullを入れませんか?あるいは私は何か他のものを逃していますか –

+0

なぜあなたは 'malloc'の結果をキャストするのは良くないと言いますか? –

関連する問題