私は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);
:あなたの出力コンバータは、このようなプロトタイプを持っている必要があります再計算を回避するために
2番目の例( 'output1 = output;')は動作しません。Cには、この種の直接割り当てを許可しないように動作する配列の特殊ルールがあるためです。 'memcpy(&output1、&output、sizeof output)'は動作します。 – caf