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のプログラムにしようとすること自体がおかしい。とかの質問自体を完全否定するようなことを言われた場合も無視しますがご理解ください。
よろしくおねがいいたします。
No.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);
}
}
}
回答くださりありがとうございます。私も教えてくださったコードが書けるレベルになるようもっと、勉強しようと思います。教えてくださったコードは、完全ではありませんが、コンパイルのミスもなく、実行できました。一瞬でしたが、成功しました。よって、約束どおり、ベストアンサーを差し上げます。ありがとうございました。
No.6
- 回答日時:
まずはCでもJavaでもいいので基本をきっちり押さえましょう。
って事ですよ。>ですので、ベストアンサーは、コンバート後の実物(bootpack.java)で、私がコンパイルして、きちんと通り、実行できるものを提示してくださった方に差し上げようと思います。
ベストアンサーなんてどうでもいいんですが、あえて突っ込みますね。
それ「ベストアンサーあげる気はありません。」といってるのと同じ。
回答者はbootpack.cはjavaにコンバートできないのわかってます。
散々、大事なことをおっしゃっておられたので、どうしようかと思いましたが、約束は約束ですので、ご了承ください。残念です。とりあえず、出直します。当分ここにも来ないと思いますので、お騒がせすることもないでしょう。ありがとうございました。
No.5
- 回答日時:
>間違っているとのご指摘ですが、もとは、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:34No.4
- 回答日時:
bootpack.cは特定のメモリに書き込むプログラムですよね。
しかし、Javaでは特定のメモリを指して書き込むことは根本的にできないので無理だと思います。
補足ですが、bootpack.cのpの宣言がchar*になっているのは、文字列という意味ではなくcharが1Byteだから特定のメモリへの書き込みに使われているのだと思います。
この回答への補足
回答くださりありがとうございます。冷静に考えてみるとおっしゃられている通りに思えますが、実践してみないとわからないたちなのでもう少し考えてみたいと思っています。
補足日時:2012/09/05 22:30No.3
- 回答日時:
ふと思ったのですが、もしかしたら、元のCはマイコン等の組込み向けのものではないでしょうか?
前の質問( http://oshiete.goo.ne.jp/qa/7676944.html )も今回もメモリを直接アクセスするもののようですが、PC用ではそのような使い方は特殊なケース(ドライバー、カーネル等のハードに近いところ)でしか見ないものです。
とすると、Javaも組込み用でしょうか?
それなら、専用APIが用意されているかもしれませんが、私は不勉強なもので存じません。
この回答への補足
回答くださりありがとうございます。鋭いご意見ありがとうございます。前回は、インラインアセンブラの難しさを、ひしひしと感じました。そのプログラムをJavaになんぞ、書き換えは不可能(今の私に実力では。)と感じたので、インラインアセンブラなしというのを、何とか作ったところ、前回に書いた書籍に載っていました。同じだったので、それをJavaにしようとしていました。JNIなども考えたのですが、少し、理解できないところがあり、何とか、使わない方向で考えていました。理屈上では、できると思ったのでいろいろ考えていました。
補足日時:2012/09/05 22:00No.1
- 回答日時:
そもそも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>
でした。大変申し訳ありません。これは私のミスなので、この場をお借りして陳謝いたします。申し訳ありませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- Java Java 配列<選挙> 4 2023/07/31 15:07
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java Java です 途中は省いてますが for(int i = 0; i < 25; i ++) { s 4 2022/05/20 23:36
- Java Java、配列の問題を教えて欲しいです。 ・日、月、火、水、木、金、土 ・各曜日の英語 を2次元配列 2 2023/07/10 19:14
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#でfirefoxのウインドウを移動...
-
C++からC#のdllを参照する際、...
-
javaでcsvファイル読込時の改行...
-
identifierについて教えて下さい
-
6桁の数字を重複なしでランダム...
-
java streamでenum配列への変換
-
デスクトップのアイコンの位置...
-
【C#】フォームをなめらかに移動
-
JAVA エラー 式の開始が不正で...
-
Randomクラスを使い同じ値をも...
-
C#経過時間の求め方
-
式の型は配列型で int に解決済...
-
因数分解メソッドの改良
-
java spring でエラーが出て困...
-
JAVAのプログラムソースコード
-
Javaでポインタ的なことはでき...
-
byte[2] から int へ。
-
C#で実行時にメソッドの返り値...
-
フィボナッチ数列 java
-
画像が表示されません。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
Javaで電卓を作りたい
-
式の型は配列型で int に解決済...
-
javaでカレンダー作成
-
JAVA エラー 式の開始が不正で...
-
JAVAでCの関数ポインタのような...
-
java spring でエラーが出て困...
-
6桁の数字を重複なしでランダム...
-
c# デリゲート関連の命名について
-
C++からC#のdllを参照する際、...
-
メインが含まれていません
-
(Swing)JTextFieldを半角のみ入...
-
DataSet(DataTable)の使い方
-
JUnit4のアノテーションについて
-
三目並べ(Tick-Tack-Toe)をJav...
-
初心者ですが、今javaで簡単な...
-
javaでcsvファイル読込時の改行...
-
classを使って座標軸を求めるコ...
-
C#で実行時にメソッドの返り値...
-
Java 初心者 int型の取り扱い方
おすすめ情報