ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:hiwairo [C++]const int と配列
困り度:
  • 暇なときにでも
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)がだめな理由がわかりません。
どなたか教えてください。
質問投稿日時:08/04/09 22:47
質問番号:3936130
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

 

回答者:aris-wiz No1さんが既に仰っていますが、
「error: array bound is not an integer constant」の通り
配列の添え字が整数の定数では無い為エラーだといっています。

単純に考えて、実数で配列の添え字が扱えるかという問題ですね。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/10 10:25
回答番号:No.2
この回答へのお礼ありがとうございます。
「実数で配列の添え字が扱えるかという問題ですね。」
というより実数を整数にcastして得られる静的整数変数がなぜ配列確保に使えないのかという疑問でした。

回答

良回答20pt

回答者:Tacosan 配列を宣言するときの要素数は, 整数型の定数式が必要です.
この「整数型の定数式」に「リテラル」や「整数型の const 変数」は使えるんですが, 「実数型の const 変数」を使うことはできません. そういうものです.
ISO だと 5.19 Constant expression のあたりに, この制限が書かれています.
種類:回答
どんな人:一般人
自信:参考意見
回答日時:08/04/10 01:24
回答番号:No.1
この回答へのお礼ありがとうございます。浮動小数点リテラルをcastして得られるconst
intはOKで、浮動小数点const変数をcastしてえられるconst intはNGというのが理解できないなかったのですが、「そういうもの」なのですね。
おそらく、cast計算と配列領域確保のtimingの問題でそういう仕様になっているのでしょうか。

教えていただいた規格を確認してみます。
 
最新から表示回答順に表示良回答のみ表示