質問 |
||
| 質問者: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の問題でそういう仕様になっているのでしょうか。 教えていただいた規格を確認してみます。 |