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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

8647閲覧

C#を書いているのですが、エラーメッセージCS0165(未割当のローカル変数が使用されました。)が出て困っています。原因を教えて下さい。

fufufuIQ

総合スコア1

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/11/22 06:55

編集2021/11/22 09:20

前提・実現したいこと

unityでプログラムを書いています。(C#)

実現したいことは、
・変数”A”を作り、0を代入する。
・もしRキーが押されたら、A(変数)にA(変数)+1をした数を代入する。
ということです。

発生している問題・エラーメッセージ

しかし、エラーメッセージCS0165(未割当のローカル変数”A"が使用されました。)が表示されてしまいます。

該当のソースコード(言語:C#)

using System.Collections; using System.Collections.Generic; using UnityEngine; public class a : MonoBehaviour { int A = 0; void Start() { } void Update() { if (Input.GetKey(KeyCode.R)) {int A = A + 1; } } }

###インターネットで調べたこと
初期化をすればいいと書いてあったのですが、初期化は
int A = 0;
ではだめなのでしょうか。

###ツールのバージョン

マイクロソフトビジュアルスタジオ2019

以上です。よろしくお願いします。文章でよくわからないところがあったら質問して下さい。初心者ですいません。僕でもわかるように説明していただけると幸いです。
###解決後のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; public class a : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { int A = 0; if (Input.GetKey(KeyCode.R)) { A = A + 1; } } } //皆さんありがとうございました ```

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

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

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

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

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

BeatStar

2021/11/22 06:58

コードは”<code>”または”<コード>”のボタンを押して出てくるやつの中に書きましょう。 今の状態は、日本語の文章をひらがなのみで、句読点も一切ない状態です。改行もない状態です。 読む気にもなりません。
退会済みユーザー

退会済みユーザー

2021/11/22 07:04

{int A = A + 1; } ⇒ { A = A + 1; } としてみたらどうなりますか?
fufufuIQ

2021/11/22 08:48 編集

>>suferOnWwwさん {int A = A + 1; } ⇒ { A = A + 1; } としてみましたが、CS0103 現在のコンテキストに”A"という名前は存在しません。 となってしまいました
退会済みユーザー

退会済みユーザー

2021/11/22 08:42

×: >>suferOnWww 〇: SurferOnWww さん> おなたのお友達以外は呼び捨てはナシでいきましょう。
退会済みユーザー

退会済みユーザー

2021/11/22 08:43

> {int A = A + 1; } ⇒ { A = A + 1; } としてみましたが、CS0103 現在のコンテキストに”A"という名前は存在しません。 となってしまいました その上にある int A = 0; を消したのでは?
fufufuIQ

2021/11/22 08:57 編集

>>suferOnWwwさん これは大変失礼しました。せっかく考えていただいたのに失礼で本当にすみません。 あと、int A = 0;を書く場所が違っていたようです。解決しました。 int A = 0;を{int A = A + 1; } ( void Update)のところではなく、 void Startのところに書いていました。(あれ、この方法も試したような気がするんだけどなあ) 本当にありがとうございます!!
退会済みユーザー

退会済みユーザー

2021/11/22 08:54

細かい話ですみませんが・・・ >> というのはどこかで普通にやってることなんでしょうか? 自分の古い頭ではそれは 2 重引用なんです。誰かをハンドル名で呼びかけるときは、 ハンドル名さん> というようにしていたのですが・・・ 時代が変わって、そういうのも変わったのかしら?
退会済みユーザー

退会済みユーザー

2021/11/22 08:55

上の 2021/11/22 17:43 のコメントの件、回答欄に画像を貼っておきますので見てください。
BeatStar

2021/11/22 08:55

修正したやつ(SurferOnWwwさんのアドバイスでやってみたやつ)も質問本文に追記してください。 ただし、元のコードは維持してください。 本来なら修正後のやつはなくていいですが、今回の場合、それ以前の問題な気がするので。(質問者さんの実力がわかりにくいから)
BeatStar

2021/11/22 09:05

えーと、その回答でいいのでしょうか? 『僕でもわかるように説明して』とありますが、『なぜそうなるのか』まで知りたいという意味かと思ったんですが。(即物的なのがいいのか?)
fufufuIQ

2021/11/22 09:05

SurferOnWwwさんへ あまり日常で>>は使わないですけど、自分はこうやっています。今さっき返信するときもこれで伝わるかな?と思って書いたんですが...
fufufuIQ

2021/11/22 09:15

BeatStarさんへ ええと、書くいちが間違えていたのかと思って自分で勝手に考えたのですが、違いましたでしょうか? あと、修正後の文は質問文に書いておきます。
dodox86

2021/11/22 09:23

@質問者fufufuIQさん [2021/11/22 18:20]の質問編集を読んで: コンパイルエラーが解消したから即、要望の動きになるとは限りません。 変数Aはずっと存在していて、Rキーが押されるごとに+1していきたいのでは? まぁ、今のコードで良いというのであればそれで良いのですけど。
BeatStar

2021/11/22 09:33 編集

(私の勘違いだったようなので伏せる)
fufufuIQ

2021/11/22 10:04

dodox86さんへ このコードではそうならないのでしょうか?
dodox86

2021/11/22 10:08

> このコードではそうならないのでしょうか? fufufuIQさんが最終的にどのような動きを求めているのか私にはいまだ分からないので、判断できません。実際に動かしてみて、そうならないのなら求めている最終形ではないということになります。何にせよ、実際に動かしてご自身で確認してください。
fufufuIQ

2021/11/22 10:11

dodox86さんへ はい、わかりました。まだコードを書ききっていないのでコードを頑張って書いてみます。 もし上手くできず、調べてもわからなかったら貴方様にお聞きしても良いでしょうか。
dodox86

2021/11/22 10:15

> もし上手くできず、調べてもわからなかったら貴方様にお聞きしても良いでしょうか。 それはまた新しい質問として投稿しましょう。その時はまた適切な回答が私以外からでもいただけると思います。
fufufuIQ

2021/11/22 10:18 編集

dodoxさんへ わかりました。ありがとうございます。
guest

回答2

0

まず、基礎からやりましょう。
基礎ができていたらあり得ないミスをしています。

(クラスやオブジェクト指向がネックになっていますが、大抵の書籍やサイトではがっつり解説されているはずなので。わかりやすいかどうかはともかく)

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class a : MonoBehaviour 6 7{ 8 int A = 0; 9 10 void Start() 11 { } 12 void Update() 13 { 14 if (Input.GetKey(KeyCode.R)) 15 {int A = A + 1; } 16 } 17}

上部にある変数Aはフィールドと言います。
Updateメソッドで宣言されたAは(ローカル)変数と言います。
スコープ、つまり使用可能な範囲が全く違います。

ローカル変数は基本的にメソッドから抜けると消滅します。
フィールドはクラスオブジェクトが破棄されない限りは保持されます。

今回の場合、int A = A + 1;のようにやっていますが、
基本的にその行に近いものが使われます。

わかりやすくするために、int A1 = A2 + 1;としましょうか。
A1では初めて宣言されたものです。A2では本来はフィールドにアクセスしたいのだろうと思いますが、実際にはA1の方のものになります。
そうなると、初期化されていない変数を使う状態になります。

かといって、なんでもかんでも変数はすべてフィールドにすると、どこからでもアクセスできるので、デバッグするのが大変です。それにオブジェクト指向の考え方を壊す原因でもありますし。

なので『「どのようにすべきか」は、場合による』ですね。

投稿2021/11/22 09:28

編集2021/11/22 10:08
BeatStar

総合スコア4958

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

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

fufufuIQ

2021/11/22 09:56

なるほど。詳しい解説ありがとうございます。
dodox86

2021/11/22 10:00

@BeatStarさん > C言語でいうローカル変数のような状態になります。 「グローバル変数」の間違いでしょうか。 また別の話になりますが、C#とは別のプログラミング言語であるC言語を習熟していない(かもしれない)方にC言語の話をするのは解説としてどうなのかな、と思います。(以前、別のご回答でも指摘させてもらった気もしますが)
BeatStar

2021/11/22 10:06

@ dodox86さん あ、確かにそうですね。 (C言語の話を持ち出したのは、単に説明のためだったのですが確かにややこしくなりそうですね…)
dodox86

2021/11/22 10:13

「グローバル変数はダメ。できる限り使わないように。」などとと言う指針は、「なぜ?」という部分で実感を含めて初心の方にはなかなか理解できないと思うので、その状況で更に別の言語の話を出しても良いことは無いと思います。
fana

2021/11/23 01:58

> わかりやすくするために、int A1 = A2 + 1;としましょうか。 A2 の定義を与えない状態では,わかりやすいどころか意味不明なのでは.
guest

0

ベストアンサー

{int A = A + 1; } ⇒ { A = A + 1; } としてみましたが、CS0103 現在のコンテキストに”A"という名前は存在しません。 となってしまいました

その上にある int A = 0; を消したのでは?

イメージ説明

投稿2021/11/22 08:56

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fufufuIQ

2021/11/22 09:07 編集

本当にありがとうございました。非常に丁寧でわかりやすかったです。初歩で間違えて凄く恥ずかしいです。 フォローさせていただきます。感謝しきれないくらいです。
fufufuIQ

2021/11/22 09:12

ちなみに、間違いとしては、{int A = 0;}を書く場所が間違えていたということでした。 修正後のソースコードは質問文に書いておきます。
退会済みユーザー

退会済みユーザー

2021/11/22 22:38

C# の変数のスコープというごく基本的な話で、そこが理解できてないとこの先またいろいろ問題に遭遇すると思います。勉強しましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問