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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

配列

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

Q&A

解決済

3回答

737閲覧

Java 関数の引数への配列データ受け渡しについて

HelpfulJp

総合スコア22

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

配列

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

0グッド

0クリップ

投稿2018/11/11 23:01

編集2018/11/11 23:06

配列と数字を渡して配列を返す関数でのトラブルが起きました。
if(s<0)の部分で配列MBから配列tに値を渡して、
新しくnewしたMBにtの要素を渡したところMBの中身はデータが渡せてました。
しかし、MBからkへデータを渡し直したところkの中身はNullとなってしまいました。

インスタンスの問題ではないのでしょうか。
どうしたら配列要素を渡せるか教えてください。

java

1static Integer[] kaiten(Integer[] MB, Integer s) { 2 Integer[] k = new Integer[9]; 3 System.out.print(s+":"); 4 if (s < 0) { 5 Integer[] t = new Integer[9]; 6 t[0] = MB[2]; 7 t[1] = MB[1]; 8 t[2] = MB[0]; 9 t[3] = MB[5]; 10 t[4] = MB[4]; 11 t[5] = MB[3]; 12 t[6] = MB[8]; 13 t[7] = MB[7]; 14 t[8] = MB[6]; 15 s += 4; 16 MB=new Integer[9]; 17 for(int u=0;u<9;u++) 18 MB[u]=t[u]; 19 } else if (s == 1) { 20 for (int i = 0; i < 9; i++) { 21 k[8 - i] = MB[i]; 22 } 23 } else if (s == 2) { 24 k[0] = MB[6]; 25 k[1] = MB[3]; 26 k[2] = MB[0]; 27 k[3] = MB[7]; 28 k[4] = MB[4]; 29 k[5] = MB[1]; 30 k[6] = MB[8]; 31 k[7] = MB[5]; 32 k[8] = MB[2]; 33 } else if (s == 3) { 34 k[0] = MB[2]; 35 k[1] = MB[5]; 36 k[2] = MB[8]; 37 k[3] = MB[1]; 38 k[4] = MB[4]; 39 k[5] = MB[7]; 40 k[6] = MB[0]; 41 k[7] = MB[3]; 42 k[8] = MB[6]; 43 }else if (s == 0) { 44 for(int u=0;u<9;u++) 45 k[u]=MB[u]; 46 } 47 show(k); 48 return k; 49 }

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

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

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

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

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

m.ts10806

2018/11/11 23:32

そもそも何を目的としたコードなのでしょうか。それ次第ではもっと適切な案がつくかもしれません。何をしたいのか分かりませんが、あまり効率的ではなさそうですし。でも目的や経緯・背景が要件としてきちんとなってないとリファクタリングもできません。
HelpfulJp

2018/11/12 03:37 編集

そもそもは三目並べの限られたデータから、盤を回転させたり、反転させてパターンを蓄積するのを目的としていました。いちおう完成しましたがコードに無駄があります。^^;;対称性のあるゲームなので場合分けしたif文ごとに同じ処理をコピペしてたらコードが増え、結果としてコード改修ミスに気づけなかったです。コメントありがとうございます。
guest

回答3

0

sが負のとき、および4以上のとき、**kは一切操作されません。**そのため、参照型の配列の中身の初期値であるnullが入ったままreturnされています。

投稿2018/11/12 01:28

swordone

総合スコア20649

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

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

HelpfulJp

2018/11/12 03:31

そのおっしゃる通りです。sには0~3もしくは-4~-1の値になります。 sがマイナスのときに(s<0)内の操作をしてからs+4で加算し引き続き sが自然数のときの操作をしてもらおうと思って作りました。 nullが返されたのはその原因もありましたが、 本文のプログラムで書き間違いがあったことも影響してました。 いまは直りましたので大丈夫です。 丁寧に御指摘ありがとうございます。またよろしくお願いします。
guest

0

ベストアンサー

関数の引数のMBというのは、配列オブジェクトのアドレスのコピーが渡ります
関数の中でnewしてしまったら、呼び元には反映されなくなります
new しないでそのまま値を代入しましょう

# ってそれもどうかとは思いますが

投稿2018/11/11 23:11

y_waiwai

総合スコア87719

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

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

HelpfulJp

2018/11/12 03:23

以前もお世話になってます。回答ありがとうございます。 newしないでやってみましたが、kのところでMBから値が渡されずnullでした^^; if文でs<0内の操作を一括しないで エラーができた関数kaitenのなかに関数を入れ子状にしてみたらうまくいきました。 kaiten(mirror(now), 3); mirrorはs<0内の操作です。
guest

0

関数を変えてみました。
原因は関数kaitenの引数をnewしていた以外にも
本文で関数kaitenに引数sを渡す処理を間違えていたことがわかりました。

わかりやすいシンプルな書き方に努めようと思います。

Java

1kaiten(mirror(n.get(i)));

Java

1static Integer[] mirror(Integer[] MB) { 2 Integer[] t = new Integer[9]; 3 t[0] = MB[2]; 4 t[1] = MB[1]; 5 t[2] = MB[0]; 6 t[3] = MB[5]; 7 t[4] = MB[4]; 8 t[5] = MB[3]; 9 t[6] = MB[8]; 10 t[7] = MB[7]; 11 t[8] = MB[6]; 12 return t; 13 } 14 15 static Integer[] kaiten(Integer[] MB, Integer s) { 16 Integer[] k = new Integer[9]; 17 if (s == 0) { 18 for(int u=0;u<9;u++) 19 k[u]=MB[u]; 20 } 21 else if (s == 1) { 22 for (int i = 0; i < 9; i++) { 23 k[8 - i] = MB[i]; 24 } 25 } else if (s == 2) { 26 k[0] = MB[6]; 27 k[1] = MB[3]; 28 k[2] = MB[0]; 29 k[3] = MB[7]; 30 k[4] = MB[4]; 31 k[5] = MB[1]; 32 k[6] = MB[8]; 33 k[7] = MB[5]; 34 k[8] = MB[2]; 35 } else if (s == 3) { 36 k[0] = MB[2]; 37 k[1] = MB[5]; 38 k[2] = MB[8]; 39 k[3] = MB[1]; 40 k[4] = MB[4]; 41 k[5] = MB[7]; 42 k[6] = MB[0]; 43 k[7] = MB[3]; 44 k[8] = MB[6]; 45 } 46 return k; 47 }

投稿2018/11/12 03:43

HelpfulJp

総合スコア22

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問