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

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

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

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

600閲覧

C言語 enumで列挙した型へ乱数を入れる事ができない

jelly-mitsu

総合スコア1

C

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2025/02/21 22:32

実現したいこと

イメージ説明
![イメージ説明]
(https://ddjkaamml8q8x.cloudfront.net/questions/2025-02-22/3fbaaea5-9719-4a97-a564-6c9700fd286d.png)
上記が学習用の教科書に記載してあるコードになっており、enumにて列挙していた型(Element配列)に乱数を入れています。

発生している問題・分からないこと

イメージ説明
こちらは簡易化したコードですが、前述していた様にenumにて列挙していた型(Element配列)に乱数を入れようとすると、「型intの値を型Elementのエンティティへ割り当てる事はできません」となってしまいます。

教本のエラーの無いコードと自作のコードではなにが違うのでしょうか?
見える範囲で相違がなければ、考えられる可能性をお教えいただけると幸いです。

エラーメッセージ

error

1型intの値を型Elementのエンティティへ割り当てる事はできません

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

グーグルでenumや乱数生成について調べてみたが、自分では解決策が見つけられませんでした。
教本のコードを一部コピーして貼り付けてみたりもしましたが、エラーの解消はできませんでした。

補足

特になし

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

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

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

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

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

archiver

2025/02/21 23:36

本当に教科書にそのように記載されていたのでしょうか? 可能であれば、その教科書に記載のコードを載せていただけませんか。 ちなみにenumは宣言時に列挙子に自動的に通番を割り振りますので、プログラム中で変更することはできません(ついでにenumは配列でもありません)。
jelly-mitsu

2025/02/22 22:02

archiverさん、コメントありがとうございます! 他の方の回答も参照したところ、確かにC言語の教科書をC++のシステムを使って勉強していたので、その差異によるエラーだとわかりました。
guest

回答3

0

C++ としてコンパイルしようとしている可能性が高いように思われます。

代入しようとしているときに型が合わない場合には可能なら暗黙に型変換しようとしますが、 C++ では整数から列挙型への暗黙の変換を認めていません。

C では OK です。

投稿2025/02/21 23:48

SaitoAtsushi

総合スコア5710

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

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

jelly-mitsu

2025/02/22 22:04

Saitoさんご回答ありがとうございます。 おっしゃる通り、C言語の教科書をC++のシステムで勉強しておりました。 ありがとうございました!
guest

0

問題なく通りますが、誤字などありませんか?

enum element{ FIRE, WATER, EARTH }; void r(enum element *p_element){ for(int i=0;i<EARTH;++i){ p_element[i]=rand()%EARTH; printf("%i\n",p_element[i]); } }; int main(void){ srand((unsigned)time(NULL)); enum element elements[3]={}; r(elements); return 0; };
1 0

投稿2025/02/22 00:02

編集2025/02/22 00:09
Manabu

総合スコア99

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

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

jelly-mitsu

2025/02/22 22:06

Manabuさんご回答ありがとうございます! 他の方の回答から、C言語の教科書をC++のシステムを使って勉強していた故のエラーと気づくことができました。わざわざお試しいただきありがとうございました。
guest

0

ベストアンサー

C++の場合はエラーになります。C++のコンパイラを使ってC言語を勉強する場合は、両言語の間で少し違いがありますので注意が必要です。
以下のように直すと良いです。
【元記述】 pElement[i] = rand() % EARTH;
【修正例】 pElement[i] = static_cast<Element>(rand() % EARTH);
【別の例】 pElement[i] = (Element)(rand() % EARTH);
static_castはC++用です。別の例として掲げた書き方はC++とC言語の両方で使えます。
《参考》
Element Elements[3] = {};
この記述はC++では大丈夫ですが、C言語では要素が一つも無いため正しくないとされます。

投稿2025/02/22 07:14

n2q37_cpp

総合スコア9

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

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

jelly-mitsu

2025/02/22 22:08

n2q37さんご回答ありがとうございます! 仰るとおり、C言語の教本をC++のシステムで勉強しておりました。 修正例や他の案までご考慮いただき、大変助かりました。
n2q37_cpp

2025/02/22 23:35

ご返信ありがとうございます。お役に立てたようで私も嬉しいです。
SaitoAtsushi

2025/02/23 02:00

余談ですが 2023 年の規格改定 (通称 C23、実際に承認されたのは 2024 年に入ってからですが……) で波括弧の中が空の初期化子を許容するようになりました。 ただ、必ずしも最新の規格が良いというわけではなく、各コンパイラがどこまでサポートしているかも色々ですし、プログラムがどの規格に基づいて書かれているかも色々です。 勉強するなら教本がどの規格に対応しているかは意識したほうが良いかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.32%

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

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

質問する

関連した質問