2011-01-25 16 views
4

次のコードで何が問題になっていますか?ファイルスコープで可変に配列を変更

 
#define DELAY_CYCLES ((int)(0.1/0.001)) 
typedef struct { 
    double state_history[N_X][DELAY_CYCLES]; 
    double foo; 
} foo 

gccが文句を言う:

main.h:52:3:警告:ファイルスコープで可変修正 'state_history'

int型のキャストはすることはできませんそれからです何らかの理由でコンパイル時に完了しましたか?

答えて

9

EDIT AGAIN

あなたは手紙に標準に従っている場合は、[はい、あなたはそこに浮動小数点式を避ける必要があります。 Cでは、整数にキャストした浮動小数点定数((int)3.0fなど)を除いて、浮動小数点式は、配列サイズの計算の目的でコンパイル時に整数定数式と見なされません。浮動小数点数を避けるために定義を変更し、整数だけを使用する必要があります。

可変長配列でないためには、配列のサイズは "整数定数式"(C99§6.7.5.2/ 4)でなければならず、 "整数定数式"は§6.6/ 6で定義されています強調鉱山):

整数定数式96)は整数型を有するもののみ整数定数、列挙定数、文字定数、その結果を整数定数でsizeof式、あるオペランドを有するものキャストの即値オペランドである浮動定数。整数定数式のキャスト演算子は、演算子の型を整数型に変換するのみで、演算子の一部としては演算子のsizeofを除きます。

GCCがバージョン4.5で警告を追加したように見えます。 4.4以降では、-Wall -Wextra -ansi -pedanticであっても、そのコードに対する警告は報告されません。ただし、安全で100%移植可能なように、浮動小数点式を避けるには、DELAY_CYCLESの定義を変更する必要があります。値0.10.001を浮動小数点で存在しないので

+0

私はgcc 4.5.2を使用しています。 N_Xを出しても警告が出ます。余分な警告フラグを使用する必要はありませんでした。 – allanw

3

は、整数定数式があった場合でも、(int)(0.1/0.001)が容易、99または100のいずれかとすることができます。 IEEE 754で指定する値を決定するには、0.1と0.001の両方をチェックして、それらが隣接しているかどうかを確認し、隣接するものを実際に分割したり、適合するシステムでチェックしたりする必要があります。しかし、これは正しい答えを得るための実装に依存したくない場所です。

関連する問題