プロが教える店舗&オフィスのセキュリティ対策術

constについて教えてください。以下のコード
//------------------------------------------------------
#include <stdio.h>
#include <math.h>
const double RANGE = 12.;
const int MESH = 10;
//const int N = (int)(12.0*10); // (1) OK
//const int N = (int)(12.0*MESH); // (2) OK
const int N = (int)(RANGE*10); // (3) NG
//const int N = (int)rint(12.0*10); // (4) NG
double Array[N];
//------------------------------------------------------
をg++ 4.0.1でcompileすると
error: array bound is not an integer constant
とでてきます。(1)(2)ではエラーは出ません。
(1)(2)が良くて、(3)がだめな理由がわかりません。
どなたか教えてください。

A 回答 (2件)

配列を宣言するときの要素数は, 整数型の定数式が必要です.


この「整数型の定数式」に「リテラル」や「整数型の const 変数」は使えるんですが, 「実数型の const 変数」を使うことはできません. そういうものです.
ISO だと 5.19 Constant expression のあたりに, この制限が書かれています.
    • good
    • 0
この回答へのお礼

ありがとうございます。浮動小数点リテラルをcastして得られるconst
intはOKで、浮動小数点const変数をcastしてえられるconst intはNGというのが理解できないなかったのですが、「そういうもの」なのですね。
おそらく、cast計算と配列領域確保のtimingの問題でそういう仕様になっているのでしょうか。

教えていただいた規格を確認してみます。

お礼日時:2008/04/10 11:16

No1さんが既に仰っていますが、


「error: array bound is not an integer constant」の通り
配列の添え字が整数の定数では無い為エラーだといっています。

単純に考えて、実数で配列の添え字が扱えるかという問題ですね。
    • good
    • 0
この回答へのお礼

ありがとうございます。
「実数で配列の添え字が扱えるかという問題ですね。」
というより実数を整数にcastして得られる静的整数変数がなぜ配列確保に使えないのかという疑問でした。

お礼日時:2008/04/10 11:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!