C言語からJavaに書き換えの質問

このQ&Aのポイント
  • C言語で書かれた短いプログラムを、Javaならどう書くかということを考えることになり、1か所だけエラーになっている。
  • エラーログを見れば、(int)p=i;がおかしいことはわかるが、修正しても解決しない。
  • 質問自体が完全否定されるような意見は無視してほしい。
回答を見る
  • ベストアンサー

C言語からJavaに書き換えの質問です。

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のプログラムにしようとすること自体がおかしい。とかの質問自体を完全否定するようなことを言われた場合も無視しますがご理解ください。 よろしくおねがいいたします。

  • valox
  • お礼率48% (45/92)
  • Java
  • 回答数7
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • racene
  • ベストアンサー率70% (21/30)
回答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); } } }

valox
質問者

お礼

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

その他の回答 (6)

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.6

まずはCでもJavaでもいいので基本をきっちり押さえましょう。って事ですよ。 >ですので、ベストアンサーは、コンバート後の実物(bootpack.java)で、私がコンパイルして、きちんと通り、実行できるものを提示してくださった方に差し上げようと思います。 ベストアンサーなんてどうでもいいんですが、あえて突っ込みますね。 それ「ベストアンサーあげる気はありません。」といってるのと同じ。 回答者はbootpack.cはjavaにコンバートできないのわかってます。

valox
質問者

お礼

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

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答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してもアセンブラにしても全てが中途半端なので正直コンバート作業するには時期尚早のように見受けられます。 中国語や英語もよくわからない人が、中国語→英語の翻訳を直訳のみで行おうとしてるそんなイメージ。

valox
質問者

補足

回答ありがとうございます。それと、忠告ありがとうございます。おっしゃるように、私は、今、非常に焦っています。実力以上にことをしようとしていることも承知しています。皆さんのご意見を総合して考えると、どうも出直したほうがよさそうだということがわかりました。ありがとうございました。ただ、モチベーションを下げたくないので、bootpack.c が目標として、bootpack.javaをどう書ければよいかのお手本を、提示してはいただけないでしょうか。これは、ここを読んでくださった方々すべてにお願いします。コンバートができるという実物に出会うことができたら、初心に帰り、出直そうと思います。そのほうが、私にとって大事だと判断したからです。ですので、ベストアンサーは、コンバート後の実物(bootpack.java)で、私がコンパイルして、きちんと通り、実行できるものを提示してくださった方に差し上げようと思います。勝手なことを承知で書いていますが、私にとっては、人生レベルでの分岐点になると思いますので、何卒よろしくお願いいたします。wormholeさんにはこの場を借りて、お礼申し上げます。ありがとうございました。

  • 500cii
  • ベストアンサー率50% (14/28)
回答No.4

bootpack.cは特定のメモリに書き込むプログラムですよね。 しかし、Javaでは特定のメモリを指して書き込むことは根本的にできないので無理だと思います。 補足ですが、bootpack.cのpの宣言がchar*になっているのは、文字列という意味ではなくcharが1Byteだから特定のメモリへの書き込みに使われているのだと思います。

valox
質問者

補足

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

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

ふと思ったのですが、もしかしたら、元のCはマイコン等の組込み向けのものではないでしょうか? 前の質問( http://okwave.jp/qa/q7676944.html )も今回もメモリを直接アクセスするもののようですが、PC用ではそのような使い方は特殊なケース(ドライバー、カーネル等のハードに近いところ)でしか見ないものです。 とすると、Javaも組込み用でしょうか? それなら、専用APIが用意されているかもしれませんが、私は不勉強なもので存じません。

valox
質問者

補足

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

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.2

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

valox
質問者

補足

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

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.1

そもそもCの方もおかしいんですけど >(int)p=i; これは、どういう意図で書かれたものですか?

valox
質問者

補足

回答くださりありがとうございます。というか前回は大変お世話になりました。解決したのですが、前回のベストアンサーを、たくさんの情報を下さった方にするか、動くプログラムを提示された方にするか本当に迷っております。余談はさておき、これは、前回のものが複雑すぎた(私にとって。はずかしいのですが・・・。)そこで、ご指摘があった、インラインアセンブラは使わない方法を考えて書いたもので、プログラムの内容は最終的に同一のものになります。間違っているとのご指摘ですが、もとは、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

  • JavaでC言語のポインタ演算風な使い方は

    Java初心者です。ずっとC言語をやっていました。 Javaにはポインタは存在せず(実際は参照渡しなのでポインタその ものなのですが)、ポインタに対する演算はありませんよね。 C言語で、 int buf[2*10]; int *dst = buf; for(i=0;i<10;i++){ dst[0]=a; dst[1]=b; dst += 2; } のようなソースをJavaで書こうとすると、 for(i=0;i<10;i++){ buf[i*2+0]=a; buf[i*2+1]=b; } しか思いつきません。 コンパイルして最適化されれば問題ないと思いますが、 なんか配列中の演算が演算量をとりそうで、気になっています。 もっと高速に処理されるような書き方はないものでしょうか? アドバイスよろしくお願いします。

    • ベストアンサー
    • Java
  • C言語からjavaを呼び出したい

    C言語からjavaを呼び出したいのでjniを使うことにしました。 各言語のソースはWebで見つけたサンプルを見ながら何とか作成し、各々コンパイルまで終わったのですが、javaのオブジェクト(?)をどこに置いたら良いのかさっぱりわかりません。 java使いの人達には常識の話だと思いますがjavaはサーブレットしか作ったことが無くどうしたものかと困っています。 分からないのは次の2点です。 1.classファイルのままでも良いのかjarにしないといけないのか? 2.どこに設置したら良いのか? これまでやったこと 1.javaのソースを作成しコンパイルしました(classファイルのままです) 2./etc/profileに次のコマンドを追加しました。 LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/java/jdk1.7.0_03/jre/lib/amd64/server export LD_LIBRARY_PATH 3.C言語のソースを次のコマンドでコンパイルしました。 % gcc -I/usr/java/jdk1.7.0_03/include/ -I/usr/java/jdk1.7.0_03/include/linux -L/usr/java/jdk1.7.0_03/jre/lib/amd64/server -ljvm -lpthread jnitest.c -o jnitest 4.javaモジュールの設置←これがわかりません 初歩的な質問で申し訳ありませんがご教示下さい。

    • ベストアンサー
    • Java
  • JAVAでCの関数ポインタのようなことをするには?

    CのプログラムをJAVAに移植しています。関数ポインタのプログラムを移植したいのですがやり方がよく判りません。interfaceを実装するとできるようですが・・・ 以下のCプログラムをJAVAに移植する方法を教えてください。 #include <stdio.h> int func(int , int); int main() { int (*po)(int , int) , i; po = func; i = (*po)(10 , 3); printf("%d" , i); return 0; } int func(int i , int j) { return i + j; }

    • ベストアンサー
    • Java
  • java3dが動かない

    javaでプログラミングをしています. WindowsXPでJava3Dを使って3Dのスタンドアローンで動くアプリケーション(javaアプレットではないもの)を作ろうと思っています. しかし,プログラムがコンパイルエラーになってしまいます. プログラム自体は書籍のCD-ROMについてきたものなのでバグは無いはずです. 以下に必要な情報を示します. ・インストールしたもの(java3Dの書籍付属のCD-ROMから)   jdk-1_5_0_11-windows-i586-p.exe   java3d-1_5_0-windows-i586.exe ・コンパイルエラーの内容   : パッケージ javax.media.j3d は存在しません。   : パッケージ javax.vecmath は存在しません。   : パッケージ com.sun.j3d.utils.universe は存在しません。   : パッケージ com.sun.j3d.utils.geometry は存在しません。 ・java3Dを用いないjavaプログラムは動作する

    • ベストアンサー
    • Java
  • javaで質問です。

    java初心者です。 unix系のコマンドでfindコマンドの動作と同じ動作をするプログラミングを教えて頂きたいです。 実行の際に、同時に引数としてディレクトリを渡すとそのディレクトリ以下のファイルが全て一覧表示されるというものです。 どうしても下記のコードから進まないです。 特にわからない部分は ・7行目の配列の確保にどのような引数を渡せばいいのか。 ・繰り返し処理の中で、ディレクトリかどうかの条件文で更に下位層をチェックしていきたいが、下位層にいかない。 ・16行目のcでチェックしている箇所が配列のどの部分なのかを引数で渡してそこにコピーたいのですが、9行目のint c;で何を渡せばいいのか分からない。 ・11行目の条件の4の部分も何を渡せばいいのかわからない。 です。 どうかご教授いただきますようお願いします。 1 import java.io.File; 2 import java.util.Arrays; 3 4 public class Find { 5 public static void main(String[] args) { 6 File findFile = new File(args[0]); 7 File names[] = new File[15] ; 8 names[0] = findFile; 9 int c = 0; 10 11 for (int i = 0; i < 4; i++) { 12 names[i] = findFile; 13 if (names[i].isDirectory()) { 14 File subfiles[] = names[i].listFiles(); 15 names[i] = subfiles[i]; 16 System.arraycopy(names, i, names, (i + c), subfiles.length); 17 } 18 } 19 for (int k = 0; k < names.length; k++) { 20 System.out.println(names[k]); 21 } 22 } 23 }

  • JNI C言語からjava

    お世話になります。 JNIでC言語からJAVAを呼び出したいのですがやり方が分からないので教えて下さい。 【呼び出されるJAVA側のソース】 public class JniTest { public String GetXX(String P1, String P2) { String R = P1 + P2; return R; } } 上記をC言語から呼び出して結果を表示したいのですが、どのようにコーディングしたら良いのか分かりません。 色々探してみたのですがギブアップです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javaでc言語を実行

    java初心者です 10年以上前にC言語で作成されたプログラムを,GUIの部分だけ JAVAで組み直したいと思っております そこで質問なのですが、例えばC言語で作成されたHELLO WORLDを表示するような 実行ファイルをJAVAで作成したボタンで実行が可能かどうか。 もし可能ならば、その方法について教えて頂きたいのですが よろしくお願いします

  • c言語 プログラミング

    以下のプログラムで分からないところがあります。 数式をxpyの形式で入力して、(x,y:整数、p:x,-,*,/のいずれかの演算記号) 答えを表示するというプログラムなのですが、 5行目と9行目にある”-'0'”の意味が分からないので教えてください。 01: int x=0,y=0,z,i;char a[30],p; 02: printf("式を入力してください。:);gets(a); 03: for(i=0;a[i];i++) 04:  if('0'<=a[i] && a[i]<='9') 05:   x=10*x+a[i]-'0'; 06:  else{p=a[i]-'0';break;} 07: for(i++;a[i];i++) 08:  if('0'<=a[i] && a[i]<='9') 09:   y=10*y+a[i]-'0'; 010: switch(p){ 11:  case '+':z=x+y;break; 12:  case '-':z=x+y;break; 13:  case '*':z=x*y;break; 14:  case '/':z=x/y;break; 15:  default:puts("入力エラーです。");return 0; 16: } 17: printf("%d%c%d=%d\n",x,p,y,z); よろしくお願いします。(読みにくかったらメモ帳などにコピペしてください)

  • javaでコンパイルが成功しません!!ヘルプです。

    javaのアプレットを利用して、製作途中なのですが 整数宣言をしようとして int p(i) , q(i); とコマンドを入力し、コンパイルしたところ 「sample2.java:78: ';' がありません。 int p(i) , q(i); ^  エラー 1 個            」 といったエラーメッセージが出てきてしまいました。 p(i)とq(i)を、ただ単に整数宣言しようとしただけなのに失敗してしまったのはなぜでしょうか? 初心者でとても初歩的な質問で大変申し訳ないのですが教えていただけないでしょうか、よろしくお願いいたします。    

    • ベストアンサー
    • Java
  • javaに関する質問

    n個の整数値を入力し、それらの値を昇順に並べ替えるプログラムを書いたのですがエラーにより問題が発生しました。 問題は下記の実行例のように数字を,で区切り入力すると、エラーが発生し結果が表示されないという問題です。(Enterで改行するように区切ればエラーなく実行されます) 実行例として 整数値を入力してください。 1,5,7,3 ← 手入力部分 1,3,5,7 ← 実行結果 となれば正解のようです。 これが僕の書いたコードです。 package jp.javadrive; import java.util.Arrays; import java.util.Scanner; public class Java { public static void main(String[] args) { System.out.println("整数値を入力してください。"); @SuppressWarnings("resource") Scanner a = new Scanner(System.in); @SuppressWarnings("resource") Scanner b = new Scanner(System.in); @SuppressWarnings("resource") Scanner c = new Scanner(System.in); @SuppressWarnings("resource") Scanner d = new Scanner(System.in); int a1 = a.nextInt(); int b1 = b.nextInt(); int c1 = c.nextInt(); int d1 = d.nextInt(); int[] arr = new int[]{a1,b1,c1,d1}; Arrays.sort(arr); for(int i = 0;i < arr.length;i++) System.out.print(arr[i]); } } 初めてjavaを触った為、ググりながら書いていたので仕組みを分かっていないところがあるので、間違っている箇所があればどしどしご指摘お願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう