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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

初心者

初心者は、プログラミングやITに不慣れな方が、基礎的な知識やスキルを身につける際に直面する疑問や課題に関する投稿に使用されます。入門書や学習サイトで学び始めた方、初めての開発環境構築でつまずいた方などに向けた質問が多く見られます。

Q&A

解決済

2回答

372閲覧

C# Initialize()を使った方法で配列の初期化ができない。

turnberry0712

総合スコア2

C#

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

初心者

初心者は、プログラミングやITに不慣れな方が、基礎的な知識やスキルを身につける際に直面する疑問や課題に関する投稿に使用されます。入門書や学習サイトで学び始めた方、初めての開発環境構築でつまずいた方などに向けた質問が多く見られます。

1グッド

1クリップ

投稿2025/05/27 06:12

編集2025/05/28 02:41

実現したいこと

  • 三次元配列の中にデータを格納した後に、ユーザーが望むと配列が初期化する動作にしたい。

x,y,zと三次元に変換したい。

前提

C#で3マス×3マスの盤面の配列に〇と×の情報を記録したい。

ここに質問の内容を詳しく書いてください。
C#を使い、○×ゲームを作っています。

//○×ゲーム中に記録する配列
public byte[,,] BoardPlace;

//初期化関数
public void InitializationMethod()
{
//現在は無いが、ほかの初期化したい変数があったらここに書く。
//アンサー初期化
BoardPlace.Initialize();
}

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

エラーメッセージはありません。

該当のソースコード

C#

1usingSystem; 2usingSystem.Collections.Generic; 3usingSystem.Linq; 4usingSystem.Text; 5usingSystem.Threading.Tasks; 6 7namespaceHit_And_Blow 8{ 9 publicclassVariablStorage 10 { 11 //解答用を記録する配列 12 public byte[,,] answer; 13 //2025/05/28 文法の間違いがあり、上記の「public byte[,,] answer;」が正しい表記です。TakaiYさん、ご指摘ありがとうございます。気づけませんでした。 14 //publicbyte[,,]answer; 15 16 //初期化関数 17 publicvoidInitializationMethod() 18 { 19 for(inti=0;i<9;i++) 20 { 21 for(intj=0;j<3;j++) 22 { 23 for(bytek=0;k<3;k++) 24 { 25 Console.WriteLine(i.ToString()+""+j.ToString()+""+k.ToString()+":"+answer[i,j,k]); 26 //ここで変数が使われたことにする。 27 answer[i,j,k]=1; 28 } 29 } 30 } 31 32 //アンサー初期化 33 answer.Initialize(); 34 35 for(inti=0;i<9;i++) 36 { 37 for(intj=0;j<3;j++) 38 { 39 for(bytek=0;k<3;k++) 40 { 41 Console.WriteLine(i.ToString()+""+j.ToString()+""+k.ToString()+":"+answer[i,j,k]); 42 } 43 } 44 } 45 } 46 } 47} 48

試したこと

使用前
「0 0 0:0  ~  8 2 2:0」

盤面使用後&初期化のためのanswer.Initialize();使用後
「0 0 0:1  ~  8 2 2:1」

補足情報(FW/ツールのバージョンなど)

Windows11
Microsoft visual studio 2022(バージョン 17.14.2)
デバイス名 DESKTOP-CDQ748B
プロセッサ Intel(R) Core(TM) i3-4000M CPU @ 2.40GHz 2.40 GHz
実装 RAM 8.00 GB
システムの種類 64 ビット オペレーティング システム、x64 ベース プロセッサ
ペンとタッチ このディスプレイでは、ペン入力とタッチ入力は利用できません

###その他
ビジュアルスタジオでのC#が初めてのプログラミングなので分かってない所があります。何卒優しい目で見てください。問題解決に協力をよろしくお願いいたします。

TN8001👍を押しています

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

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

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

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

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

TakaiY

2025/05/27 06:51 編集

提示のコードは文法的におかしいところ(publicbyteなど)がありますが、この質問のために手打ちしたものでしょうか? 実際に動かしているコードでないのであれば、動かしているコードをそのままコピペして差し替えていただけますか。 質問は編集できます。
turnberry0712

2025/05/28 02:39

TakaiY様 ご指摘のとおり文法的におかしい部分があり、ただいま修正した文章を書きなおしてチェックを行っております。ご指摘くださりましてありがとうございます。 fiveHundred様 Q「なんで、Initialize()が必要だと判断したのでしょう。」 A.どのような配列でも初期化できるメソッドだと思い、使ってみたかったため。   answer.Initialize();で、この配列の中身が0になると思っておりました。 Q「初期化ならnewで済んでますし、値のリセットならfor文と代入などでいいはずです。」 A.配列を使う前にnewしないとどのようなものが入っているかわからないため、newするのだと個人的にはそう思っており、再度newすれば初期化できるのでしょうか?  『値のリセットならfor文と代入などでいいはずです。』その通りです。For文よりInitialize()一行で終わるなら、そちらを書きたかったのですが、できそうが無いのでfor文ですべての変数を0にしようと思います。ありがとうございます。
turnberry0712

2025/05/28 02:47 編集

コメントありがとうございます。For文で初期化を試したところ問題が解決しました! ベストアンサーに選びたいので、fiveHundred様 同じ内容を回答欄に投稿いただけますでしょうか? 2025/05/28 11:46 fiveHundred様大変申し訳ございません。TN8001様の回答が先にあったのでそちらを優先して解決済みとしてもよろしいでしょうか。本当に申し訳ございません。初めてのサイトだったので使い方がまだ分からない状態でした。
fiveHundred

2025/05/28 03:02

入れ違いで回答してしまいました。 ベストアンサーをどうするかはお任せしますが、「回答が先」というよりかは「実際に解決に役に立った」「解決した手段に近かった」ほうが適切だと思います。 (今回のケースとは異なりますが、回答とは明らかに手順が異なる場合は、自己回答したほうがいいです)
turnberry0712

2025/05/28 21:30

fiveHundred様、承知いたしました。 より役に立つ方を今回のベストアンサーにします。 様々な問題を言ってしまい申し訳ございませんでした。
guest

回答2

0

値のリセットならfor文と代入で行います。

Initialize()はこちらのドキュメントに「ほとんどのユーザーはこの方法を必要としません」と記載されています。
通常はnewで初期化するため、実際としても不要です。

コメントには記載していませんでしたが、値が全て0でいいのであれば、TN8001さんの回答のような、newで再生成という方法もあります。

投稿2025/05/28 02:53

fiveHundred

総合スコア10376

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

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

turnberry0712

2025/05/28 21:36

話は変わりますが、 Newをする際に初期化されるので、特定のタイミング(〇×ゲームで確実に〇しょ真ん中に置いて考える時)などでは便利になりそうです。 未熟な私ですが、教えてくださりありがとうございました。
guest

0

ベストアンサー

C# Initialize()を使った方法で配列の初期化ができない。

Array.Initialize メソッドが、turnberry0712さんの期待通りの動作をしないという意味ですね?

ほとんどの場合Initializeは期待通りに動きません。
c# - Array.Initialize - Why does this method exist? - Stack Overflow

単純に割り当て直すのが手っ取り早いでしょう。

cs

1//answer.Initialize(); 2answer = new byte[9, 3, 3];

cs

1using System; 2 3namespace Qoyzjrx92euq9mj 4{ 5 class Program 6 { 7 static void Main() 8 { 9 new VariablStorage().InitializationMethod(); 10 } 11 } 12 13 public class VariablStorage 14 { 15 public byte[,,] answer = new byte[9, 3, 3]; 16 17 public void InitializationMethod() 18 { 19 for (var i = 0; i < 9; i++) 20 { 21 for (var j = 0; j < 3; j++) 22 { 23 for (var k = 0; k < 3; k++) 24 { 25 Console.WriteLine($"{i}{j}{k}:{answer[i, j, k]}"); 26 answer[i, j, k] = 1; 27 } 28 } 29 } 30 Console.WriteLine(); 31 32 //answer.Initialize(); 33 answer = new byte[9, 3, 3]; 34 35 for (var i = 0; i < 9; i++) 36 { 37 for (var j = 0; j < 3; j++) 38 { 39 for (var k = 0; k < 3; k++) 40 { 41 Console.WriteLine($"{i}{j}{k}:{answer[i, j, k]}"); 42 } 43 } 44 } 45 } 46 } 47}

C#10以降では構造体のデフォルトコンストラクタを書けるようになったので、意図して書けば期待通りになりますがあまりお勧めはしません。
パラメーターなしの構造体コンストラクター - C# feature specifications | Microsoft Learn

構造体 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

cs

1var intArray = new int[3]; 2Console.WriteLine(string.Join(",", intArray)); 3 4for (var i = 0; i < intArray.Length; i++) 5{ 6 intArray[i] = 1; 7} 8Console.WriteLine(string.Join(",", intArray)); 9 10intArray.Initialize(); 11Console.WriteLine(string.Join(",", intArray)); 12 13 14Console.WriteLine(); 15 16 17var defaultCtorArray = new A[3]; 18Console.WriteLine(string.Join(",", defaultCtorArray)); 19 20for (var i = 0; i < defaultCtorArray.Length; i++) 21{ 22 defaultCtorArray[i].a = 1; 23} 24Console.WriteLine(string.Join(",", defaultCtorArray)); 25 26defaultCtorArray.Initialize(); 27Console.WriteLine(string.Join(",", defaultCtorArray)); 28 29 30struct A 31{ 32 public int a; 33 public A() => a = 0; 34 public override string ToString() => a.ToString(); 35}
0,0,0 1,1,1 1,1,1 0,0,0 1,1,1 0,0,0

投稿2025/05/27 10:11

編集2025/05/27 11:04
TN8001

総合スコア10049

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

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

turnberry0712

2025/05/28 21:37

2コメのNEWを使った初期化で関数プログラミングする事にしました。 ありがとうございました。また機会があればよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問