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

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

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

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

Q&A

解決済

3回答

4435閲覧

構造体配列の個数をscanf関数で設定したい

nissei

総合スコア35

C

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

0グッド

1クリップ

投稿2018/04/24 05:42

初歩的な事かもしれないですが、構造体を設定。

struct SEITO { char namae[30]; int kokugo; int sugaku; int eigo; int goukei; float heikin; };

その後に。。。

int member = 0, subject = 0, OK = 0; while (OK == 0) { printf("人数は何人ですか?\n"); scanf("%d", &member); printf("何教科ありますか?\n"); scanf("%d", &subject); printf("人数%d人\t教科は%d種目\tでいいですか?\n", member, subject); printf("はい=1\tいいえ=0\n"); scanf("%d", &OK); }

と人数と科目数をscanf関数で値を設定し、

SEITO Std[member];

と初期化したいのですが、上記の「SEITO Std[member];」
のmemberの部分がエラーの赤波線が発生し、「式には定数値が必要です」っと
出てしまいます。
c言語ポインタ完全制覇という参考書のP.84に同じ様にscanf関数で値を設定し、その変数を配列の個数に設定(可変長配列の宣言)しています。

なぜエラー表示が出てしまうのか理解に苦しんでいます。

その違いと私が書いたコードはどの様に書き直したらいいのか教えて頂きたいです!
宜しくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

C言語は動的配列をサポートしていません。
C++ならできます。
C言語で目的を達成したい場合は、malloc等で動的にメモリを確保する必要があります。

C

1// ポインタで宣言 2SEITO *pStd 3 4// 動的メモリ確保 5pStd = (SEITO*)malloc(sizeof(SEITO) * member); 6 7// pStd[0].kokugo = 0; 8 9// メモリの解放を忘れずに 10free(pStd);

投稿2018/04/24 05:48

ttyp03

総合スコア16996

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

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

maisumakun

2018/04/24 05:52

あまりメジャーでないとはいえ、機能としては存在しています。
nissei

2018/04/24 05:55

お早い解答ありがとうございます。 上記の様にコードを書いてみたのですが、「malloc」、「free」の記述部分でエラーが出てしまいます。 私の書いてる場所が間違っているのか見当がつきません。
ttyp03

2018/04/24 05:59

>nisseiさん stdlib.hをインクルードする必要があります。 以下を追加してみてください。 #include <stdlib.h>
ttyp03

2018/04/24 06:01

>maisumakunさん やはりありましたか。 あったような気はしたのですが、確かめずに回答してしまいました。 どっちみちC言語では使えない(使えても使わない)と考えておいたほうがよいかと思いましたので。
nissei

2018/04/24 06:07

エラーがなくなりました!! ありがとうございます! 今後の為に確認でお聞きしたいのですが、 質問に書いてあった「SEITO Std[member];」が「SEITO *pStd; 」に変わったという事ですね? それと、「free(pStd);」の 意味と書く場所などの注意点を教えてほしいです。
ttyp03

2018/04/24 06:17

mallocをするとメモリ上に領域が確保されます。 freeはそれを解放して他のプログラムが使えるようにする状態にします。 なのでその領域はもう使わないってタイミングでfreeすればよいです。 malloc/freeの使い方については一度ご自分で調べてみることをおすすめします。
nissei

2018/04/24 06:19

ありがとうございました!!!
guest

0

解決済みとなったようですが。

いずれの回答にも可変長配列についての言及がありますが、今回のような配列の個数がわからないのにはちと不適当ではないかと考えます

可変長配列ってのはスタック上に確保されるため、最初の配列の個数入力でヘタな値を入れられると、暴走するおそれがでてきますね。
って、いまどきのPCのようなリッチな環境では滅多なことはないのでしょうが、そんでもキモチワルイですねー

投稿2018/04/24 06:27

y_waiwai

総合スコア87719

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

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

nissei

2018/04/24 06:31

まだまだ未熟ゆえ、勉強不足でしたがありがとうございます。
y_waiwai

2018/04/24 06:36

可変長配列ってのはあくまでAUTO変数となりますんで、サイズには要注意ですね
nissei

2018/04/24 06:38

やはりcでこの様なプログラムは時代遅れなのでしょうか?^^; c#やJavaなのかな~って思う時がありますw
y_waiwai

2018/04/24 06:45

まあ、組み込み系とかArduinoとかではまだまだCは必須となりますが、 PC上で走らせるなら、C#とかJavaがいいですねー
nissei

2018/04/24 06:53

一様、C#とJavaも並行して勉強していますが、「Cを使えれば最強(どの言語にも活かせる)」と講師より教えられたので、今は6~7割cを勉強しています(^^; ありがとうございますw
guest

0

C99以降(C11以降ではオプションとなりましたが)には、可変長配列の機能があります。コンパイラオプションで有効にできないか確認してみましょう。

C言語(C11)で可変長の配列を使う方法

投稿2018/04/24 05:52

maisumakun

総合スコア145121

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

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

nissei

2018/04/24 06:31

勉強になる記事の欄を添付してくださって本当に感謝です!! ありがとうございます!^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問