2010-11-28 14 views
3

私はC.以下は、より簡単に、より効率的にすることができますか?

でまだ実用的な経験を持っていないとして、私はそれは入力です変換する方法を決定し、ディスパッチャ機能を持っている私とCに動的な型付けの言語からいくつかのコードを変換するために クマをしてくださいしようとしています に基づいて、flag引数の値。

void output_dispatcher(char *str, int strlen, int flag) { 
    char output[501]; 
    char *result; 

    switch (flag) { 
     /* No conversion */ 
     case 0: 
      result = str; 
      break; 
     case 1: 
      result = convert_type1(output, str, strlen); 
      len = strlen(result); 
      break; 
     /* ... */ 
    } 
    /* do something with result */ 
} 

私は現在、5種類の出力コンバータを持っており、それらはすべて(たとえ将来 ものが)のみ300-500文字を生成することが保証されています。可能であれば、 スタックに動的に領域を割り当てるよりも、ヒープ変数を使用する方が私の読書からは、 が望ましいです。私は、彼らは出力を構築 時に出力コンバータがそれを知っているので、それは出力サイズを再計算 にuncessaryであることから、ディスパッチャではstrlenを避けたい

static char * convert_type1(char *out, const char *in, int inlen); 

:のようにいずれかの関数宣言が見えます。また、私は出力 変数へのポインタを渡しているので、結果ポインタを返す必要はありません。そこで、私は を次のように変更しますが、 '互換性のないタイプ'のコンパイルエラーが発生します。

void output_dispatcher(char *str, int strlen, int flag) { 
    char output[501]; 

    switch (flag) { 
     /* No conversion */ 
     case 0: 
      output = str; /* ERROR: incompatible type */ 
      break; 
     case 1: 
      strlen = convert_type1(output, str, strlen); 
      break; 
     /* ... */ 
    } 
    /* do something with result */ 
} 

このアプローチは機能しますか、それとも良い方法がありますか?これと呼ばれる

static char * convert_type1(char *out, const char *in, int *len); 

:あなたの出力コンバータは、このようなプロトタイプを持っている必要があります再計算を回避するために

答えて

1

result = convert_type1(output, str, &strlen); 

内部出力コンバータはの内容を読み取るために必要があるだろうポインタに文字列の長さが格納され、そのポインタの内容が上書きされてから返されます。

ヒープ対スタックの問題では、スタックに割り当てられた変数は関数が終了するとすぐに消えるため、実際にはヒープを使用する必要があります。

0

ライン:配列とポインタが類似しているが、彼らは同じじゃない、ので

output = str; 

はあなたの問題を与えています。

"output"はポインタではなく配列です。

str = output; 

char ptrは配列変数によく似ているため、機能します。

しかし、 "出力"変数は配列へのポインタではなく配列自体であるため、逆のことはありません。

たとえば

、あなたが持っていた場合:

char output[501]; 
char output1[501]; 

、あなたがやった:

output1 = output; 

これはOKだろう、とCはOUTPUT1配列にして、出力配列の内容をコピーします。

あなたは配列とptrsについてちょっと混乱しています。

+0

2番目の例( 'output1 = output;')は動作しません。Cには、この種の直接割り当てを許可しないように動作する配列の特殊ルールがあるためです。 'memcpy(&output1、&output、sizeof output)'は動作します。 – caf

0

char出力[501]; 出力= str;/*エラー:互換性のない型*/

=>

はstrncpy(出力、STR、はsizeof(出力))。 「出力が」「str」は

0

この場合のエラーが理にかなって保持するのに十分な大きさであれば

注意は、あなたがチェックする必要があります。 outputはcharデータを保持するバッファで、strはメモリ内の他の領域へのポインタです。あなたは、strが出力先を指しているアドレスを割り当てるのではなく、正しいのでしょうか?このアプローチを使いたいのであれば、strが指すデータを出力にコピーするだけです。変換が必要ない場合はstrを使うだけです。

0

Cでは、配列を直接代入で変更することはできません。配列メンバーを個別に変更する必要があります。あなたは、文字列をコピーしたい場合は、配列outputstrで指さしたがって、あなたが使用する必要があります(どちらの場合も、最初にそのstrlen < sizeof outputを確認した後に)

strcpy(output, str); 

または多分

memcpy(output, str, strlen + 1); 

を。

ローカル変数strlenの名前を付けて、その名前の標準機能をシャドウすることは、あとであなたのコードを見る人のために少し混乱することになります。私は別の名前を選ぶだろう。

関連する問題