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

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

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

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

Q&A

解決済

6回答

1436閲覧

同じクラスから別々に生成したオブジェクトの値が一緒になってしまうのですが?

MZ-SOFT

総合スコア11

C#

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

0グッド

1クリップ

投稿2018/04/28 06:49

編集2018/04/28 07:53

編集し直します。パズルゲーム『倉庫番』を解くソフトを作ろうと思っているのですが、

class t_node { public ulong hash_key; // ノードのハッシュ値 public ulong before_hash_key; // 前のノードのハッシュ値 public static int[] box_pos = new int[BAGGAGE_MAX]; // 箱の位置 public int box_number; // 動かした箱の番号 public int man_pos; // プレイヤーがいる位置 public int step; // 歩数 public int state; // 既に探索したノードかどうか public int cost; // 現在位置のコスト(低いほどよい) } // 正解の手を探索 void playstep_search() { t_node nownode = new t_node(); // 現在の局面 t_node newnode = new t_node(); // 現在の局面から番人を一手動かしてみた局面 // 以下色々 }

としてnewnode.man_pos の値を変えても nownode.man_pos の値が変わらないようにしたいのですが、何か良い方法はないでしょうか?

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

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

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

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

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

hichon

2018/04/28 07:01

一緒になったと判断した方法を貼ってください。
ozwk

2018/04/28 08:12 編集

今のままでnewnode.man_pos の値を変えても nownode.man_pos の値は変わりません。回答者がコピペして問題が再現するようなコードを貼ってください。
ozwk

2018/04/28 08:13

newnodeとnownodeで字面が似ているのでうっかり取り違えたとかありませんか?
guest

回答6

0

つpublic static int a; → public int a;

投稿2018/04/28 07:31

hichon

総合スコア5737

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

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

0

ベストアンサー

いえ、ちゃんとA.aは10のままです(paiza.io)。


(質問の変更を踏まえて)

としてnewnode.man_pos の値を変えても nownode.man_pos の値が変わらないようにしたいのですが

もとの質問と同様、いま書かれている範囲内ではnewnode.man_posnownode.man_posは連動しません。書いていない部分に問題があるものと思われます。

投稿2018/04/28 07:20

編集2018/04/28 08:12
maisumakun

総合スコア145123

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

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

maisumakun

2018/04/28 07:22

「何かを見間違えた」あるいは「ここに書いたのと実際のコードが違う部分があって、それが影響している」ということなので、再現するような条件を提示していただければと思います。
MZ-SOFT

2018/04/28 08:21

『C#の絵本』『猫でもわかるC#プログラミング』を読み直してみるとクラスは参照型、構造体は値型なのだそうで、構造体でやり直してみます。ありがとうございました。
MMashiro

2018/04/28 10:20

クラスでも構造体でも今回提示されているコードでは他の値が書き換わることは無いと思いますが…
guest

0

structにして解決するということは

c#

1 t_node nownode = new t_node(); // 現在の局面 2 t_node newnode = new t_node(); // 現在の局面から番人を一手動かしてみた局面

ではなく

C#

1 t_node newnode = new t_node(); // 現在の局面から番人を一手動かしてみた局面 2 t_node nownode = newnode; // 現在の局面

なのでしょうね。

MemberwiseCloneメソッドを利用するなどしてcloneメソッドを作るか、
コピーコンストラクタを作ることでclassでも解決は可能です。

投稿2018/04/28 10:54

asm

総合スコア15147

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

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

MZ-SOFT

2018/04/28 11:18

いやー、上図でやっているのですが・・・。
guest

0

こんにちは、

Java

1using System; 2public class Practice1{ 3 public static void Main(){ 4 5 test A = new test(); 6 test B = new test(); 7 A.a = 10; 8 B.a = 20; 9 Console.WriteLine(A.a); 10 Console.WriteLine(B.a); 11 A.a = 30;//値をかえてみる 12 Console.WriteLine(A.a); 13 } 14} 15 16class test{ 17 public int a; 18}

<結果>
10
20
30

投稿2018/04/28 06:58

編集2018/04/28 07:43
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/04/28 07:04 編集

名前と数字を引数にします。
MZ-SOFT

2018/04/28 07:33

御返事ありがとうございます。コンストラクタを使うわけですから、初期化の時だけですよね? 初期化以外のときにも色々引数の値を変えたいのですが。
Zuishin

2018/04/28 07:34

するとどう改善されますか?
Zuishin

2018/04/28 07:50

もう一度聞きます。 引数にすることによってどんな問題が改善されますか? 質問者のソースで問題ないことは maisumakun さんのおっしゃる通りですし、hichon さんの回答はなるほどありそうだと思える問題点を改善しています。 しかしこの回答は全く明後日の方を向いています。 質問者さんはソースが書かれたからといって飛びつくのではなく、信頼がおけるソースかどうかを確かめてください。 回答についた評価はある程度の目安になります。 また追記・修正依頼で問われたことは問題解決に必要な情報の追加を求めるものなので必ず目を通して返事をしてください。
guest

0

マイクロソフト公式のマニュアルを見て解決しました。構造体の中に配列を入れた場合、下記のようにしなければいけないようです。

/* 探索用キューに使う1要素あたりのノード */ struct t_node { public ulong hash_key; // ノードのハッシュ値 public ulong back_hash_key; // 前のノードのハッシュ値 public int man_pos; // プレイヤーがいる位置 public int[] box_pos; // 箱の位置 public int step; // 歩数 public int state; // 既に探索したノードかどうか public int dir; // 動いた方向 public int cost; // 現在位置のコスト(低いほどよい) public int move_box_number; // 動かした駒の番号 // コピーコンストラクタ public t_node(t_node source) { this.hash_key = source.hash_key; this.back_hash_key = source.back_hash_key; this.man_pos = source.man_pos; this.step = source.step; this.state = source.step; this.dir = source.dir; this.cost = source.cost; this.move_box_number = source.move_box_number; // 配列フィールドは、フィールドに設定されている配列を複製して初期化する this.box_pos = (int[])source.box_pos.Clone(); } } コード

として、生成したノードをもうひとつのノードにコピーするときには、

     // ノードの生成 t_node nownode = new t_node(); t_node tmpnode = new t_node(); // これでは駄目 // tmpnode = nownode; // 正しくはこう tmpnode = new t_node(nownode); コード

イメージ説明
参考のために追記させていただきます。
イメージ説明

投稿2018/05/03 00:31

MZ-SOFT

総合スコア11

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

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

0

構造体にしてネット上の色んな方法を試してみたところ、うまくいきました。

struct t_node { public ulong hash_key; // ノードのハッシュ値 public ulong back_hash_key; // 前のノードのハッシュ値 public int[] box_pos; // 箱の位置 public void Reset() { box_pos = new int[BAGGAGE_MAX]; } public int box_number; // 動かした箱の番号 public int man_pos; // プレイヤーがいる位置 public int step; // 歩数 public int state; // 既に探索したノードかどうか public int cost; // 現在位置のコスト(低いほどよい) }      static t_node[] hash_table = new t_node[HASH_SIZE]; for (int i = 0; i < HASH_SIZE; i++) { hash_table[i] = new t_node(); hash_table[i].state = 0; }

ご回答をしてくださった皆様に深く感謝します。ありがとうございました。

投稿2018/04/28 10:37

MZ-SOFT

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問