電子書籍の厳選無料作品が豊富!

C言語で書かれた短いプログラムを、Javaならどう書くかということを考えることになり、かなりの時間を費やして、ググったりして、なんとかそれらしい形になったのですが、1か所だけエラーになり、途方にくれております。助言・こうすればよい的なこと、気付いたこと、などどんなことでもかまいませんので(趣旨のずれたものは、残念ながら相手にできません)ご教授願います。お願いいたします。
詳しくは後述します。
Cのプログラムと、Javaのプログラムと、エラーログを載せます。

Cのプログラムーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
bootpack.c

void main(void)
{
int i;
char *p;

for (i = 0xa0000; i <= 0xaffff; i++) {

(int)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++)
{
(int)p=i;
p = i & 0x0f;
}
}
}

エラーログーーーーーーーーーーーーーーーーーーーーーーーーー

C:\tolset\java>make run

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:9: error: Invalid expression statement.
(int)p = i;
^
1 error
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>
ここまでーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

エラーログを見れば、一目瞭然に、(int)p=i; がおかしいことはわかるのですが、何がおかしいのか散々修正してみたのですがわかりませんでした。調べられるものはほとんど調べたのですが、おかしい点に、気付かれましたら、ご教授願えれば幸いです。

あと補足ですが、CのプログラムをJavaのプログラムにしようとすること自体がおかしい。とかの質問自体を完全否定するようなことを言われた場合も無視しますがご理解ください。

よろしくおねがいいたします。

A 回答 (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);
}
}
}
    • good
    • 0
この回答へのお礼

回答くださりありがとうございます。私も教えてくださったコードが書けるレベルになるようもっと、勉強しようと思います。教えてくださったコードは、完全ではありませんが、コンパイルのミスもなく、実行できました。一瞬でしたが、成功しました。よって、約束どおり、ベストアンサーを差し上げます。ありがとうございました。

お礼日時:2012/09/06 02:23

まずはCでもJavaでもいいので基本をきっちり押さえましょう。

って事ですよ。

>ですので、ベストアンサーは、コンバート後の実物(bootpack.java)で、私がコンパイルして、きちんと通り、実行できるものを提示してくださった方に差し上げようと思います。

ベストアンサーなんてどうでもいいんですが、あえて突っ込みますね。
それ「ベストアンサーあげる気はありません。」といってるのと同じ。

回答者はbootpack.cはjavaにコンバートできないのわかってます。
    • good
    • 0
この回答へのお礼

散々、大事なことをおっしゃっておられたので、どうしようかと思いましたが、約束は約束ですので、ご了承ください。残念です。とりあえず、出直します。当分ここにも来ないと思いますので、お騒がせすることもないでしょう。ありがとうございました。

お礼日時:2012/09/06 02:32

>間違っているとのご指摘ですが、もとは、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さんにはこの場を借りて、お礼申し上げます。ありがとうございました。

補足日時:2012/09/06 00:34
    • good
    • 0

bootpack.cは特定のメモリに書き込むプログラムですよね。


しかし、Javaでは特定のメモリを指して書き込むことは根本的にできないので無理だと思います。

補足ですが、bootpack.cのpの宣言がchar*になっているのは、文字列という意味ではなくcharが1Byteだから特定のメモリへの書き込みに使われているのだと思います。

この回答への補足

回答くださりありがとうございます。冷静に考えてみるとおっしゃられている通りに思えますが、実践してみないとわからないたちなのでもう少し考えてみたいと思っています。

補足日時:2012/09/05 22:30
    • good
    • 0

ふと思ったのですが、もしかしたら、元のCはマイコン等の組込み向けのものではないでしょうか?


前の質問( http://oshiete.goo.ne.jp/qa/7676944.html )も今回もメモリを直接アクセスするもののようですが、PC用ではそのような使い方は特殊なケース(ドライバー、カーネル等のハードに近いところ)でしか見ないものです。


とすると、Javaも組込み用でしょうか?
それなら、専用APIが用意されているかもしれませんが、私は不勉強なもので存じません。

この回答への補足

回答くださりありがとうございます。鋭いご意見ありがとうございます。前回は、インラインアセンブラの難しさを、ひしひしと感じました。そのプログラムをJavaになんぞ、書き換えは不可能(今の私に実力では。)と感じたので、インラインアセンブラなしというのを、何とか作ったところ、前回に書いた書籍に載っていました。同じだったので、それをJavaにしようとしていました。JNIなども考えたのですが、少し、理解できないところがあり、何とか、使わない方向で考えていました。理屈上では、できると思ったのでいろいろ考えていました。

補足日時:2012/09/05 22:00
    • good
    • 0

もう一点


Cの処理はどういう事を行ってるのか理解されてますか?
まずはそれを理解しないことにはJavaへのコンバートできないですよ(可能か不可能かも判断できない)

この回答への補足

#4の方が回答なさったものがそのまま理由です。

補足日時:2012/09/05 22:26
    • good
    • 0

そもそも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>

でした。大変申し訳ありません。これは私のミスなので、この場をお借りして陳謝いたします。申し訳ありませんでした。

補足日時:2012/09/05 21:48
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!