- ベストアンサー
C言語からJavaに書き換えの質問
- C言語で書かれた短いプログラムを、Javaならどう書くかということを考えることになり、1か所だけエラーになっている。
- エラーログを見れば、(int)p=i;がおかしいことはわかるが、修正しても解決しない。
- 質問自体が完全否定されるような意見は無視してほしい。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
No.4の方が書いている通り、Javaでは特定のアドレスを指定して読み書きすることができません。 JavaはJVMと呼ばれる仮想マシン上で動作するため、オブジェクトが実メモリ上のどこに配置されるのかプログラムからはまったく分からないのです。 また、そもそもポインタが存在しないのでアドレス指定そのものが出来ません。 以上の理由から、JavaでこのCプログラムの動作を再現するのは不可能であると言えます。 ちなみに、提示されたJavaプログラムのコンパイルエラーを強引になくすとすると、例えば次のようなプログラムが考えられます。 ただし、このプログラムはCで書いたプログラムとはまったく異なる動作をします。(期待された動作はしません) public class bootpack { public static void main(String[] args) { byte[] p = new byte[0xb0000]; // ここがどうしようもない for(int i = 0xa0000; i <= 0xaffff; i++) { p[i] = (byte)(i & 0x0f); } } }
その他の回答 (6)
- wormhole
- ベストアンサー率28% (1626/5665)
まずはCでもJavaでもいいので基本をきっちり押さえましょう。って事ですよ。 >ですので、ベストアンサーは、コンバート後の実物(bootpack.java)で、私がコンパイルして、きちんと通り、実行できるものを提示してくださった方に差し上げようと思います。 ベストアンサーなんてどうでもいいんですが、あえて突っ込みますね。 それ「ベストアンサーあげる気はありません。」といってるのと同じ。 回答者はbootpack.cはjavaにコンバートできないのわかってます。
お礼
散々、大事なことをおっしゃっておられたので、どうしようかと思いましたが、約束は約束ですので、ご了承ください。残念です。とりあえず、出直します。当分ここにも来ないと思いますので、お騒がせすることもないでしょう。ありがとうございました。
- wormhole
- ベストアンサー率28% (1626/5665)
>間違っているとのご指摘ですが、もとは、p = i; と書かれていたのですが、コンパイラのgccが、キャストするようにとエラーログを出したからです。 それはエラーではなく警告で、そして解釈を間違ってると思います。 解釈を間違ってるので、対処方法も間違ってると。 >bootpack.java:11: error: Incompatible type for `='. Can't convert `int' to `java .lang.String'. intは、java.lang.Stringにそのままでは変換できないんだから当然のことです。 そして左辺の変数pの型をintにキャストしようと思われたのでしょうが java.lang.Stringはキャストではintに変換できませんし仮にキャストできたとしても キャストされるのは変数pではなく、変数pの持つ値(インスタンス)です。 (pの)値に(iの)値を代入できるわけありませんよね(1に2を代入できませんよね。という意味です) 厳しいこと書きますが、CにしてもJavaしてもアセンブラにしても全てが中途半端なので正直コンバート作業するには時期尚早のように見受けられます。 中国語や英語もよくわからない人が、中国語→英語の翻訳を直訳のみで行おうとしてるそんなイメージ。
補足
回答ありがとうございます。それと、忠告ありがとうございます。おっしゃるように、私は、今、非常に焦っています。実力以上にことをしようとしていることも承知しています。皆さんのご意見を総合して考えると、どうも出直したほうがよさそうだということがわかりました。ありがとうございました。ただ、モチベーションを下げたくないので、bootpack.c が目標として、bootpack.javaをどう書ければよいかのお手本を、提示してはいただけないでしょうか。これは、ここを読んでくださった方々すべてにお願いします。コンバートができるという実物に出会うことができたら、初心に帰り、出直そうと思います。そのほうが、私にとって大事だと判断したからです。ですので、ベストアンサーは、コンバート後の実物(bootpack.java)で、私がコンパイルして、きちんと通り、実行できるものを提示してくださった方に差し上げようと思います。勝手なことを承知で書いていますが、私にとっては、人生レベルでの分岐点になると思いますので、何卒よろしくお願いいたします。wormholeさんにはこの場を借りて、お礼申し上げます。ありがとうございました。
- 500cii
- ベストアンサー率50% (14/28)
bootpack.cは特定のメモリに書き込むプログラムですよね。 しかし、Javaでは特定のメモリを指して書き込むことは根本的にできないので無理だと思います。 補足ですが、bootpack.cのpの宣言がchar*になっているのは、文字列という意味ではなくcharが1Byteだから特定のメモリへの書き込みに使われているのだと思います。
補足
回答くださりありがとうございます。冷静に考えてみるとおっしゃられている通りに思えますが、実践してみないとわからないたちなのでもう少し考えてみたいと思っています。
- kmee
- ベストアンサー率55% (1857/3366)
ふと思ったのですが、もしかしたら、元のCはマイコン等の組込み向けのものではないでしょうか? 前の質問( http://okwave.jp/qa/q7676944.html )も今回もメモリを直接アクセスするもののようですが、PC用ではそのような使い方は特殊なケース(ドライバー、カーネル等のハードに近いところ)でしか見ないものです。 とすると、Javaも組込み用でしょうか? それなら、専用APIが用意されているかもしれませんが、私は不勉強なもので存じません。
補足
回答くださりありがとうございます。鋭いご意見ありがとうございます。前回は、インラインアセンブラの難しさを、ひしひしと感じました。そのプログラムをJavaになんぞ、書き換えは不可能(今の私に実力では。)と感じたので、インラインアセンブラなしというのを、何とか作ったところ、前回に書いた書籍に載っていました。同じだったので、それをJavaにしようとしていました。JNIなども考えたのですが、少し、理解できないところがあり、何とか、使わない方向で考えていました。理屈上では、できると思ったのでいろいろ考えていました。
- wormhole
- ベストアンサー率28% (1626/5665)
もう一点 Cの処理はどういう事を行ってるのか理解されてますか? まずはそれを理解しないことにはJavaへのコンバートできないですよ(可能か不可能かも判断できない)
補足
#4の方が回答なさったものがそのまま理由です。
- wormhole
- ベストアンサー率28% (1626/5665)
そもそもCの方もおかしいんですけど >(int)p=i; これは、どういう意図で書かれたものですか?
補足
回答くださりありがとうございます。というか前回は大変お世話になりました。解決したのですが、前回のベストアンサーを、たくさんの情報を下さった方にするか、動くプログラムを提示された方にするか本当に迷っております。余談はさておき、これは、前回のものが複雑すぎた(私にとって。はずかしいのですが・・・。)そこで、ご指摘があった、インラインアセンブラは使わない方法を考えて書いたもので、プログラムの内容は最終的に同一のものになります。間違っているとのご指摘ですが、もとは、p = i; と書かれていたのですが、コンパイラのgccが、キャストするようにとエラーログを出したからです。例のごとくエラーログを載せますが、ほかに間違っているといわれても、私はあっていると思うのですが・・・。 皆さま、大変申し訳ありませんでした。p = i;で何事もなくコンパイルが通りました。なぜ、前にやった時通らなかったのかは不明です。Javaのコンパイラは、gcjです。 もとのプログラム:bootpack.c void main(void) { int i; char *p; for (i = 0xa0000; i <= 0xaffff; i++) { p = i; *p = i & 0x0f; } } Javaのプログラムーーーーーーーーーーーーーーーーーーーーーーーー bootpack.java public class bootpack { public static void main() { int i; String p; for (i = 0xa0000; i <= 0xaffff; i++) { p = i; p = i & 0x0f; } } } エラーログーーーーーーーーーーーーーーーーーーーーーー C:\tolset\java>..\z_tools\make.exe run ../z_tools/make.exe -r img make.exe[1]: Entering directory `C:/tolset/java' ../z_tools/make.exe -r haribote.img make.exe[2]: Entering directory `C:/tolset/java' ../z_tools/gcj/bin/gcj.exe -c -Os -o bootpack.obj bootpack.java bootpack.java: In class `bootpack': bootpack.java: In method `bootpack.main()': bootpack.java:11: error: Incompatible type for `='. Can't convert `int' to `java .lang.String'. p = i; ^ bootpack.java:12: error: Incompatible type for `='. Can't convert `int' to `java .lang.String'. p = i & 0x0f; ^ 2 errors make.exe[2]: *** [bootpack.obj] Error 1 make.exe[2]: Leaving directory `C:/tolset/java' make.exe[1]: *** [img] Error 2 make.exe[1]: Leaving directory `C:/tolset/java' ..\z_tools\make.exe: *** [run] Error 2 C:\tolset\java> でした。大変申し訳ありません。これは私のミスなので、この場をお借りして陳謝いたします。申し訳ありませんでした。
お礼
回答くださりありがとうございます。私も教えてくださったコードが書けるレベルになるようもっと、勉強しようと思います。教えてくださったコードは、完全ではありませんが、コンパイルのミスもなく、実行できました。一瞬でしたが、成功しました。よって、約束どおり、ベストアンサーを差し上げます。ありがとうございました。