質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

6698閲覧

C言語でint変数を配列の要素に持つ方法について

izuki_y

総合スコア65

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/10/30 15:27

フーリエ変換の勉強してます。
C言語でフーリエ変換のプログラム写経していました。

環境
OS:Windows10 64bit pro
IDE:Visual Studio Community 2019
言語:C言語
参考にしたサイト:http://programming.blogo.jp/c/fourier_transform

リンク先を写経してたらdouble f[]の要素をint変数で定義しています。
これはエラーになるだろうなぁ。
と思っていたらやはりエラーになりました。

なのでconstをつけて定数にしました。

C

1int dft(char readfile[], char writefile[]) { 2 int k, n, N; 3 const int max = 100000; // 読み込むデータ数の上限 4 double f[max + 1], re, im; 5 6 7 return 0; 8}

やっぱり「式には定数値が必要です。」と表示されてエラーが起きます。
てかconstつけてるから定数やっちゅうねん!!!
これでビルド通らなかったっけ?と思って質問しました。

C

1#define max 10000

にするしかないのか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

すでに回答にあるように、
・Cではconstは変更禁止属性であって「定数」ではない(C++では定数)
・Cの規格のオプションで「可変長配列」というのがあって、gccやclang等(といいつつ他にあるのか?)対応したコンパイラでは要素数に変数が使える。MicrosoftのCはこれに対応していない。また、C++でも規格上可変長配列は使えない(gccでは"できちゃった"ような気が)。

ということで。

一点補足というか注意というか。
ローカル変数は一般的にスタック領域に確保されます。スタック領域は、もともと「一時的な、ちょっとした記憶場所」という性格で、プロセスあたり2MB程度がデフォルトで確保されています。ここにあまり大きなローカル変数などを確保するとスタック領域を使い尽くしてしまうことが起こり得ます。
今回は一気にスタックを埋め尽くしてしまうサイズではないですが、ちょっと気になる大きさではあります。
管理の手間は発生しますが、mallocの利用なども検討されてみてはいかがでしょう。

投稿2019/10/30 23:04

thkana

総合スコア7652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

const修飾子は、変数の値を変更しないことを示します。変数には違いないです。

投稿2019/10/30 15:36

otn

総合スコア84702

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

izuki_y

2019/10/30 15:48

ご回答ありがとうございます。 配列の指定にはリテラル定数(数字直接)かマクロ定数(#define)しか使えないという事ですね。 スッキリしました。 それにしても一体、どこで勘違いしたんだろ。
asm

2019/10/30 15:57

C++では要素数にconst intを渡せます。
Zuishin

2019/10/30 16:03

可変長配列の使える処理系でも渡せそうですね。
SaitoAtsushi

2019/10/30 16:42

可変長配列 (いわゆる VLA) は C99 では明確に言語仕様に含まれていてコンパイル時に大きさが確定しなくても (定数でなくても) 許容するはずなんですが、 Visual Studio (Microsoft C) ではサポートしていないようですね。 https://docs.microsoft.com/en-ca/cpp/parallel/openmp/a-examples?view=vs-2019#a27-c99-variable-length-arrays ドキュメントによれば Microsoft C は C90 には準拠していてその他の拡張は文書で明らかにするという意味のことが書かれているので、あくまで C90 を実装しつつ C99 にあるような機能も拡張機能として持っている (ので C99 やそれ以降の C 規格にある機能を導入していないこともある) という立場なのだと思います。 https://docs.microsoft.com/en-us/cpp/c-language/ansi-conformance?view=vs-2019
Zuishin

2019/10/30 21:07

仮に C11 に対応していても可変長配列には対応しなくてよかったはずです。
SaitoAtsushi

2019/10/30 22:37

はい。 C11 以降では VLA はオプショナルな扱いになっています。
Zuishin

2019/10/30 23:06

何か教えてくれてるんですか?
otn

2019/10/31 01:09

回答は端的に書きましたが、const int でも int でも配列サイズ宣言においては同じということです。 皆さんの補足を含めて書くと、 ・可変長配列を使える処理系と使えない処理系がある ・可変長配列を使える処理系だと、const int でなくても単なるintで実行時に初めて決まるサイズでも宣言できる ・可変長配列を使えない処理系だと int はもちろん const int でも使えない
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問