Microsoft Visual C++ 5.0を使っています。
いつもLINUXでCのコンパイルをしているのですが、Win上でコンパイルすると
「error C2057: 定数式が必要です。」
とでます。
このエラーの指し示すのは、

double x[N];

というような配列の宣言のようです。
ちなみにNは、ヘッダーに

const int N = 2;

と定義しています。
このエラーを出さなくするにはどうしたら良いでしょうか。
ご回答をよろしくお願いします。

A 回答 (2件)

言葉が足りなかった様に思いましたので補足です。


先程の回答の中で述べた、「constを定数として扱うのはC++の流儀」というのはCではconstが使えないと言うことではありません。
ただ、Cの場合constを用いた場合あくまで変更できない変数という扱いになります。(つまり定数式でなければならない配列定義時の要素数等には使えない)
これに対しC++ではdefineの機能の置き換えとしてconstを推奨していますので定数として扱われる様になったと言うことです。
同様にマクロによるバグを減らす為inline関数の使用も推奨しています。
C++の流儀としてはdefineはあまり使わない方向ということでしょうか。
    • good
    • 0
この回答へのお礼

具体的なご回答ありがとうございました。
例のエラーはなくなり、ようやく実行できました。
ちなみに、inline関数を推奨とのことですが、どのように使ったよいのでしょうか。時間がありましたら、お願いします。

お礼日時:2001/08/29 16:00

Cとしてコンパイルするのならdefineを用いるのが適切かもしれません。


constを定数として扱うのはC++の流儀だった様な気がします。
で、配列の宣言時には要素数は定数で指定しなければいけないよ、と言われているのではないでしょうか。
とりあえず

#define N 2

に変更するというのは駄目ですか?

#VC++のオプション設定の中にコンパイルルールをある程度変更できる部分が
#あったような気がするのですが・・・。
#記憶違いかも・・・。(^_^;
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qgroovy は今でも使用されていますか

groovy という単語は、(レコードの)「溝」から来たそうですね。Simon & Garfunkel の歌にも Feeling Groovy という副題の歌がありました。また、名詞groove も、What a groove! などと使えるようですが、この groovy という単語、今でも英語圏で頻用されているのでしょうか。
私は93年にオクラホマの高校で教育実習生としていましたが、現地の高校生は Cool としか言わなかったように思うのですが、最近の事情をご存じの方、お教え下さい。

また、このように、使用頻度を確認できるコーパスのようなサイトがありましたらご紹介下さい。

Aベストアンサー

Gです。

もし子供に'Dad, you lived in a groovy era"と言われたら、groovyは時代に生きたではなく、恐竜の時代に生きていたんだよ!古い、古い!、と言われているんですね。

ですから、あの時代(35年前)を笑うコメディーで使われたりはしますが、日本語の最近死語と言われるようになった単語と同じレベルだと思ってください。

意味が分かる程度では、使われるとはいえないと思いますよ。 ま、意味がわからない20代の人入るかもしれませんね。知ってても、「吾が輩は」を知っているけど、使わない、と同じですね。

なお、私も、Groovyと言われていた時には生きていましたよ。 <g>

Qconst int i ? int const i ?

お世話になります

初歩的な事ですがよろしくお願い致します
const 修飾子って変数型の前につけるの?後につけるの?

//----------------------------------------------------
const int iTest1[] = { 0x0000, 0x0000 };
const int iTest2[] = { 0xFFFF, 0xFFFF };

const int* const piTest[] = { iTest1, iTest2 };
//----------------------------------------------------

const int 型のポインタ配列をロム領域に確保したい場合は変数の後にconst修飾子をつけると思います

const const int* piTest[] = { iTest1, iTest2 };
これだとエラーとなるはずです。。。


そこで、疑問に思ったのが、私の書式だと、const intとconst修飾子は前に着けるのが普通だと思ってました
//----------------------------------------------------
  const int i = 0;
  int const i = 0;
//----------------------------------------------------
でも、どちらでもコンパイルは通ると思います
配置領域を確認した所、どちらもROMに確保されてました
一般的にどちらが正解なのでしょうか?


const const int* piTest[] = { iTest1, iTest2 };
が、エラーになるという事は、int const i が正解なのでしょうか?


教授よろしくお願い致します


ちなみに、組み込み系に特化した話になっています
windows系とかだとconst宣言は何処にいくんですかね・・・
ヒープじゃない予備領域とかあるんですかね・・・

お世話になります

初歩的な事ですがよろしくお願い致します
const 修飾子って変数型の前につけるの?後につけるの?

//----------------------------------------------------
const int iTest1[] = { 0x0000, 0x0000 };
const int iTest2[] = { 0xFFFF, 0xFFFF };

const int* const piTest[] = { iTest1, iTest2 };
//----------------------------------------------------

const int 型のポインタ配列をロム領域に確保したい場合は変数の後にconst修飾子をつけると思います

const const int...続きを読む

Aベストアンサー

> const int* const piTest[] = { iTest1, iTest2 };

これは、

(const int*) const piTest ...

の意味ですね。(正しい文法ではカッコは付けられません)
piTestそのものを修飾するには、constは必ず後ろに付けなければなりません。

> const const int* piTest[] = { iTest1, iTest2 };
> これだとエラーとなるはずです。。。

C90ではエラーですが、C99ではエラーになりません。(警告は出るかもしれません)

実際のところ、どの構成要素を修飾するのかが明確であれば、修飾子は前でも後でも真ん中でもかまわないのです。

const unsigned int x;
unsigned int const;
unsigned const int x;

これらは、どれでもOKです。
もし、どの構成要素を修飾しているのかがよく分からないのであれば、修飾子は必ず後ろに付ける方が無難です。

> どちらもROMに確保されてました
> ちなみに、組み込み系に特化した話になっています

組込みでもPCでも関係ありません。
書き換え不可の静的オブジェクトをどこに配置するかは、リンカの設定で決まります。組込みでも、起動時にROMやフラッシュメモリからいったんRAMに展開することもあるように、PCの場合でもいったんディスクからメインメモリに展開することになります。

> const int* const piTest[] = { iTest1, iTest2 };

これは、

(const int*) const piTest ...

の意味ですね。(正しい文法ではカッコは付けられません)
piTestそのものを修飾するには、constは必ず後ろに付けなければなりません。

> const const int* piTest[] = { iTest1, iTest2 };
> これだとエラーとなるはずです。。。

C90ではエラーですが、C99ではエラーになりません。(警告は出るかもしれません)

実際のところ、どの構成要素を修飾するのかが明確であれば、修飾子は前でも後でも...続きを読む

Qイオン式と組成式と分子式の違いについて質問です。 化学式とは〜式の総称だというのはわかるのですが、

イオン式と組成式と分子式の違いについて質問です。
化学式とは〜式の総称だというのはわかるのですが、
組成式と分子式、イオン式の違いがよくわかりませんでした。
これは表すものが違うことで生じた名称なのでしょうか?
それとも同じものでもそれぞれの式で表せるのでしょうか?
後者が当てはまる場合はそれぞれの式で表した場合の違いを具体的なもので教えて頂けると助かります。

Aベストアンサー

イオン式 イオンを表すときに用いる式 H+ (SO4)2- 等。

組成式 物質の元素構成について重点を置いて表す式、FeC3(セメンタイト、鉄と炭素の合金、分子として存在はしていない)、P2O5(五酸化二リン、実際の化合物の分子はP4O10)。

分子式 分子の元素構成を表す式、P2O5(五酸化二リン)の実際の化合物の本当の分子式はP4O10で十酸化四リン。

化学式の中でも、イオン式はイオンの電荷の状態を表す必要があるため組成式や分子式とは異なるが、
複雑な構造の分子のイオン状態を表そうとした場合、イオン式か分子式か組成式かの呼び方が曖昧になってきます。

組成式と分子式の違いも不明瞭ことがありますね、
セメンタイト等の金属材料の析出物は、ある結晶構造を持つが”分子”という形態を取らないため組成式でしか表せないことが多いです。

また、上記で例に出した五酸化二リンは、分子的には十酸化四リンが正しいが、慣用的に五酸化二リンと用いられることが多いです。
他に、分子の構造を表すことに重きを置いた構造式(数種有り)や、
実験式(構造や組成を確かめる途中の元素構成をアバウトに表した式)等がありこれは組成式に近い表し方をします。

何を表すかによって、式を使い分けている部分がある。
明確な区分が存在していない部分もある。
慣用的に昔からだから…という部分もある。
化学の分野によって、特に、構造式、分子式、組成式と断らなくても通じてしまう部分がある。

中高の教科書で教わるような基本的なことなのですが、曖昧に使い分けていることが時々ありますね。

イオン式 イオンを表すときに用いる式 H+ (SO4)2- 等。

組成式 物質の元素構成について重点を置いて表す式、FeC3(セメンタイト、鉄と炭素の合金、分子として存在はしていない)、P2O5(五酸化二リン、実際の化合物の分子はP4O10)。

分子式 分子の元素構成を表す式、P2O5(五酸化二リン)の実際の化合物の本当の分子式はP4O10で十酸化四リン。

化学式の中でも、イオン式はイオンの電荷の状態を表す必要があるため組成式や分子式とは異なるが、
複雑な構造の分子のイオン状態を表そうとした場合、イオン式か分...続きを読む

Qfor(int i = 100, long n = 1; i > n/3i; i++)

for(int i = 100, long n = 1; i > n/3i; i++)
のように、初期設定で型の違う変数を宣言したいんだけど
C++ではこんなふうに2つ以上の型を宣言してはいけないんですか?

Aベストアンサー

,

コンマ演算子の原理です。
forの初期化文で "," で区切れるのは値を返す文だけです。
よってintステートメントもlongステートメントも値を返さないので、この文では使用できません。

というか、むしろ、intステートメントの第2引数としてlongが認識されてしまいます。
外で

int i; long n;

とし

for(i = 0, n = 0; hoge; hoge)

なら可能です。

Qイオン反応式・組成式の表記の仕方の違いについて

私は今高1で化学Iを勉強しています。

そのなかの組成式で持った疑問についてです。


化学反応式やイオン反応式や電離式では

化学反応式の例) 2H2O2→2H2O+O2

イオン反応式の例) 2Ag^+ +Cu→2Ag +Cu^2+


組成式の例) 酸化ナトリウム Na^2O  ※ナトリウムイオン Na^+  酸化物イオン O^2-


化学反応式イオン反応式や電離式では化学式の係数がその式のもっとも簡単な整数比を表して

いますよね?

ですが組成式ではその式のもっとも簡単な整数比を表している所は元素記号の右下ですよね?


なぜ簡単な整数比を表しかたがそれぞれ違うのですか?

これはただの決まりなのでしょうか?
 

Aベストアンサー

イオン反応式や電離式は化学反応式の一種。
化学反応式というのは、
ある化学反応について、反応物や生成物を化学式で書いて矢印で結び、係数をつけてその反応する比をあらわしたもの。

組成式は化学式の一種。
カテゴリの違うものを比較しようとしても意味はないですね。

QC++の const int* dataを置き換える C#

C#2005で、C++の const int* dataを置き換えるにはどうしたらよいでしょうか?

メソッドの引数でdataを渡しているのですが、dataは intの配列です。
メソッド内では書きかえられたくないのでC++の時にconstを付けました。
C#ではどのように記述するのが正しいでしょうか?

C++からC#に置き換えていますが、参考になるサイトがありましたら教えてください。

Aベストアンサー

 こんにちは。
 配列をメソッドの引数に渡したいのでしょうか。

 以下の通り
 http://msdn.microsoft.com/ja-jp/library/hyfeyz71(VS.80).aspx

private void test()
{
int[] data = { 0, 1, 2 };
this.Method(data);
}

private void Method(int[] data)
{
//dataを見る
}

 で出来るのではないでしょうか。

 其の他参考になりそうなサイト
 http://ufcpp.net/study/csharp/sp_ref.html

 constキーワードに関しては諦めるしかないと思います。
 例えばC#でwin32APIを呼び出す場合でも、const ???* のパラメータをSystem.IntPtr等として指定します(constである事を意識していない)。

 こんにちは。
 配列をメソッドの引数に渡したいのでしょうか。

 以下の通り
 http://msdn.microsoft.com/ja-jp/library/hyfeyz71(VS.80).aspx

private void test()
{
int[] data = { 0, 1, 2 };
this.Method(data);
}

private void Method(int[] data)
{
//dataを見る
}

 で出来るのではないでしょうか。

 其の他参考になりそうなサイト
 http://ufcpp.net/study/csharp/sp_ref.html

 constキーワード...続きを読む

Q示性式について

組成式がCH2O
分子式がC2H4O2
となった物質がありました。
その物質はカルボキシル基を持っていたそうなので、
-COOOを組成式と分子式に足した結果、
組成式が方が-CH2OCOOOと
分子式の方が-C2H4O2COOO
という示性式が出来上がったのですが答えは
CH3COOO
となっていました。

示性式とはどの式にカルボキシル基を足すものなのでしょうか?
それとなぜ組成式と分子式に足す場合に元のOが消えている気がするのですがなぜでしょう?
組成式、分子式、示性式CとHとOはどの順番に並べてもいいものなのでしょうか?

ご回答の方よろしくお願いします。

Aベストアンサー

まず、カルボキシル基は-COOHです。-COOOではありません。
そして、組成式というのは原子の個数の比率しか表しておらず、実際の構造を考える直接のヒントにはなりません。
分子式がC2H4O2ということですので、この物質は炭素原子2個、水素原子4個、酸素原子2個でできています。
「○○基を持つ」とは、分子を構成する原子がどのように結合していたかのことです(これは日本語力の問題)。
C2H4O2にさらに-COOHがつくのではなく、C2H4O2のうち一部の原子のつながりが特定できたと言うことです。
よって、C1個とH3個は未確定ですが、-COOHだけは確定です。
このあと-COOHの左につながる原子を考えるのですが、
HをつなげてしまうとH-COOHで完結してしまい、分子式C2H4O2になりませんからこれは違います。
ということでCをつなげます。C-COOHとなり、Cの残った結合の手にさらに3つ水素が結合できますから
CH3COOH、分子式にしてC2H4O2となって題意を満たします。

高校化学の構造解析は所詮パズルです。楽しみましょう。

組成式、分子式はC,H,Oの順に書くのが慣例で、
示性式は特定の官能基を目立たせて書く物ですから、その官能基がわかるように書かねばなりません。
官能基がわかれば性質がわかる、だから示性式と言います。

まず、カルボキシル基は-COOHです。-COOOではありません。
そして、組成式というのは原子の個数の比率しか表しておらず、実際の構造を考える直接のヒントにはなりません。
分子式がC2H4O2ということですので、この物質は炭素原子2個、水素原子4個、酸素原子2個でできています。
「○○基を持つ」とは、分子を構成する原子がどのように結合していたかのことです(これは日本語力の問題)。
C2H4O2にさらに-COOHがつくのではなく、C2H4O2のうち一部の原子のつながりが特定できたと言うことです。
よって、C1個とH3個は未...続きを読む

Q[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)がだめな理由がわかりません。
どなたか教えてください。

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];
//----------------------------------------...続きを読む

Aベストアンサー

配列を宣言するときの要素数は, 整数型の定数式が必要です.
この「整数型の定数式」に「リテラル」や「整数型の const 変数」は使えるんですが, 「実数型の const 変数」を使うことはできません. そういうものです.
ISO だと 5.19 Constant expression のあたりに, この制限が書かれています.

Q回帰式と近似式について

回帰式と近似式の違いについてどなたか教えてください。
回帰式とは最小二乗法で求めた式(1次式に回帰して?)、近似式とは実測値に基づいてなんらかの方法で算出した式の事でしょうか?数学の知識に乏しいのでよくわかりません。宜しくお願い致します。

Aベストアンサー

No.2です。補足質問にお答えします。

> 予測値と実測値の差は 回帰式<近似式 なのでしょうか?

ちょっと意味不明です。

もう一度整理してみます。
まず回帰式と近似式は別物と考えた方がいいです。
y=f(x)という関数(理論式又は経験式)が有るとします。

関数そのものは判っているが、複雑で取り扱いが面倒なので
実用的に差支えが無い程度に簡略化して使うというのが近似式です。
No.2であげた例がそれにあたります。

次に関数の次数はわかっているが係数が判らない時又は全く何もわからない場合に
実測値又は実験値から元の関数を推定するのが回帰式です。
これは統計的処理というか数学的(算数的)処理で行います。

さらに
理論値・・理論式がわかっている場合
予測値・・普通は経験式がわかっている場合
実測値・・説明の必要は無いでしょう
近似値・・近似式で値を求めた場合、
  又はまるめを行った場合:例えば円周率πを3.14で近似

最後に、無理やり解釈すれば回帰式は理論式又は経験式の代用品という意味では
近似式の仲間に入ると言えなくも無いでしょう。
真ならずとも遠からず・・ですね。

No.2です。補足質問にお答えします。

> 予測値と実測値の差は 回帰式<近似式 なのでしょうか?

ちょっと意味不明です。

もう一度整理してみます。
まず回帰式と近似式は別物と考えた方がいいです。
y=f(x)という関数(理論式又は経験式)が有るとします。

関数そのものは判っているが、複雑で取り扱いが面倒なので
実用的に差支えが無い程度に簡略化して使うというのが近似式です。
No.2であげた例がそれにあたります。

次に関数の次数はわかっているが係数が判らない時又は全く何もわから...続きを読む

Qvoid (*signal(int signum, void (*handler)(int)))(int);

の解釈を教えてください
最後の「(int)」については詳しくお願いします

Aベストアンサー

signalが

(1)1つ目の引数の型:int
(2)2つ目の引数の型:引数がintで戻り値がvoidである関数へのポインタ
(3)戻り値の型:引数がintで戻り値がvoidである関数へのポインタ(2と同じ)

を満たす関数である事を宣言しています。最後の(int)はsignalの戻り値の
関数ポインタがint型の引数を持つ事を示しています。

「引数がintで戻り値がvoidである関数へのポインタ」の型をHANDLERと表すと

HANDLER signal(int signum, HANDLER handler);

となります。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング