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

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

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

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

Q&A

解決済

2回答

1042閲覧

javaによるジョセファス問題の実現方法

freeza

総合スコア4

Java

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

0グッド

1クリップ

投稿2021/09/19 07:27

編集2021/09/19 07:36

現在javaを勉強中なのですがC言語で書かれた以下のコードをjavaで書いてみようとしています.

該当のソースコード

C

1//リンクによるリスト 2//Josephus problem 3#include <stdlib.h> 4 5typedef struct node *link; 6struct node { 7 int item; 8 link next; 9}; 10 11main(int argc, char *argv[]){ 12 int i, N = atoi(argv[1]), M = atoi(argv[2]); 13 // N人の人がリーダーを選ぶのに環状に並んで適当な始点から数えてM番目の人を削除していく 14 15 link t = malloc(sizeof *t), x = t; 16 17 t -> item = 1; 18 t -> next = t; 19 20 for(i=2;i<=N;i++){ 21 x = (x->next = malloc(sizeof *x)); 22 x->item = i; 23 x->next = t; 24 } 25 26 while(x != x->next){ 27 for(i=1;i<M;i++) x = x->next; 28 29 //節点の削除 30 t = x->next; 31 x->next = t->next; 32 33 N--; 34 } 35 36 printf("Leader is %dth\n", x->item); 37}

試したこと

上記のCのコードに対して以下のようなjavaのコードを書いてみました.
###ソースコード

java

1class Node{ 2 int item; 3 Node next; 4 Node(){ 5 item = 0; 6 next = this; 7 } 8 Node(int item, Node next){ 9 this.item = item; 10 this.next = next; 11 } 12} 13 14public class Ex3{ 15 public static void main(String[] args){ 16 int i; 17 int N = Integer.parseInt(args[0]); 18 int M = Integer.parseInt(args[1]); 19 Node t = null; 20 Node x; 21 x = t; 22 t.item = 1; 23 t.next = t; 24 for(i=2;i<=N;i++){ 25 x = x.next; 26 x.item = i; 27 x.next = t; 28 } 29 while(x!=x.next){ 30 for(i=1;i<M;i++) x = x.next; 31 x.next = (x.next).next; 32 N--; 33 } 34 System.out.printf("%d/n", x.item); 35 } 36}

###試したこと
上のようにコードを書くとCのコードでいうmallocの部分が表現できていないためかException in thread "main" java.lang.NullPointerException
at Ex3.main(Ex3.java:24)
というエラーが出てしまいました.少し調べてみるとjavaにはmallocのようなものはないとありましたのでどうしようか行き詰ってしまいました.まだ勉強して間もないため基礎的な間違いや勘違いがありましたら申し訳ないのですがこの解決方法について教えてほしいです.

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

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

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

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

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

y_waiwai

2021/09/19 07:30

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
freeza

2021/09/19 07:37

ご返信ありがとうございます。質問を編集しました。始めてtaratailを利用したので不手際があって申し訳ございません。
dodox86

2021/09/19 09:20

C言語のプログラムの方はご自身で書かれ、内容は理解している上で想定通り動作している完動品なのでしょうか。それをJavaの勉強の為に移植している、ということですか。
freeza

2021/09/19 09:35

ご返信ありがとうございます。Cのコードはある参考書に載っていたコードで動くことは確認しており内容は少しは理解しているつもりです.そのコードをjavaの勉強のために移植している感じです.
guest

回答2

0

ベストアンサー

javaにはmallocのようなものはない

メモリ管理は JVM が行いますので、"何かを入れる為の領域"をユーザが低レベルで確保して利用する必要はありません。

例えば、任意のタイミングで任意の型・長さの配列を確保・使用することが出来ます。

java

1ex) int array[] = new int[N]; //C的 : int *array=(int*)malloc(sizeof(int)*N);

開放は、そのオブジェクト(配列もオブジェクトです)への参照が無くなれば自動で行われます。

C の構造体を java のクラスとして表現されるのでしたら、インスタンスの生成が malloc に相当します。

java

1ex) Node node = new Node(); //C的 : Node *node = (Node*)malloc(sizeof(Node));

C では malloc した後にその領域を初期化したりがありますが、java ではコンストラクタのパラメータを使って初期化させるのが一般的かと思います。

投稿2021/09/19 09:33

jimbe

総合スコア13209

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

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

freeza

2021/09/19 09:39

ご返信ありがとうございます。ご指摘のとおり Node t = new Node(); Node x = new Node(); x = x.next = new Node(); のように改変したら動くことができました!ありがとうございます!
guest

0

そのアルゴリズムは存じませんが、今回のエラー原因について回答します。

まず、エラーメッセージを読みましょう。エラーメッセージにヒントが隠されています。

Exception in thread "main" java.lang.NullPointerException at Ex3.main(Ex3.java:24) [訳] mainメソッドからjava.lang.NullPointerExceptionという例外が投げられています。 場所はEx3.javaの24行目です。

ですね。今回はエラーではなく、例外ですね。

このNullPointerExceptionはいわゆるヌルポです。

インスタンス化していないオブジェクトを動かそうとしているときに飛んでくる例外です。

参考; 公式

で、今回のコードを見ると、ヌルポが飛んできそうな場面は、

Node t = null; Node x; x = t; t.item = 1; t.next = t; for(i=2;i<=N;i++){ x = x.next; x.item = i; x.next = t; } while(x!=x.next){ for(i=1;i<M;i++) x = x.next; x.next = (x.next).next; N--; }

ですかね。

で、コードを読んでみましょう。

コードを読むコツは、一行レベルで、その行が何をしているかを考えながら読むですね。

で、読んでみると、

Node t に null として、Node x にその t を割り当てているようですね。

ですが、Javaとかでは、(動きから見るに)
参照型です。

まず、t = null となります。
で、そのnull というのは『有効でない範囲』です。

ヒント: 参考

Xにtが指しているnullを設定します。
そして、t をインスタンス化しています。

ですが、tが指し示す場所をxも指し示している…わけではありません。

ある意味、null用のアドレスが入っている状態です。

その状態で、xを動かそうとしていますから、今回の例外が飛んできているはずです。

おそらく、C/C++のポインタと混同しているのではないかと思いますが。

投稿2021/09/19 08:17

編集2021/09/19 08:20
BeatStar

総合スコア4962

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

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

dodox86

2021/09/19 09:01

ご回答が間違っている、という指摘ではないのですが、質問文中にある > javaにはmallocのようなものはないとありましたのでどうしようか行き詰ってしまいました. という文から、C言語構造体をmallocで割り当てる方法をJavaで代替するにはどうしたら良いのか?という疑問が元にあるのではないかと思います。Nodeクラスをnewでインスタンス化してあれやこれやする、ような。質問者さんのJavaの習熟状況は置いておいたとしても。
freeza

2021/09/19 09:40

ご返信ありがとうございます。Node t にnullを入れている部分に関して Node t = new Node(); にして, また Node x = new Node(); x = x.next = new Node(); にすることで動くことができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問