1

PC上でJavaコードとして実行されるコードがいくつかあり、必要な答え(正しいもの)が得られます。アンドロイドでは、同じコードでも非常に異なる答えが得られます。

私が使用しているコードは、もともと JsatTrack プロジェクトからのものであり、Eclipse の Java プロジェクトとしてこれらの回答 jun を提供します (正解):

Lat [deg]:10.386382587628313
Lon [deg]:-93.88496253189982
Alt [m]  :418288.8335920386

Android で同じ入力を使用して同じコードを実行すると、次の結果が得られます。

Lat [deg]:-37.97635062163793
Lon [deg]:-147.34940989563563
Alt [m]  :6.86973250782099E29

私はJavaが初めてなので、このような問題を追跡するにはどこから始めればよいでしょうか。たとえば、アンドロイドが数学を処理する方法でしょうか?

私の質問は、なぜ PC と Android が同じ数学の質問に対して異なる答えを出すのかということになると思います。2+2 は、どのプラットフォームでも同じ答えになるはずです。SGP4モデルの数学はより複雑ですが、それでも単なる数学です。

誰かが見たい場合は、コードをここで入手できます

https://dl.dropbox.com/u/70291490/jstest.zip

4

2 に答える 2

4

I am new to java so where would I start looking to track down a problem like this?

Android フォンを PC の USB 経由で接続し、Eclipse で計算を開始する相対コードの左側をダブルクリックすると、青い点 (コード ブレークポイント) が表示されます。Eclipse ツールバーの小さなバグのあるボタン (DEBUG ボタン) をクリックします。デバイスでプロジェクトを起動し、ドットを置いた場所で処理を停止します。

これで、デバッグ ビュー ツールバーを使用してコードを 1 行ずつ確認し、マウスをクラス/フィールドに合わせて値を確認できます。PCでも同じことができ、お互いの値を比較できます。

于 2013-01-11T11:01:01.303 に答える
0

問題は、stackoverflowに関する以前の質問(http://stackoverflow.com/questions/14190692/how-to-debug-dalvikvm-rejecting-opcode)と非常によく似ていました。

Androidは多くのローカル変数を処理できないため、メソッドの外部でそれらを定義することが解決策です。私の前の質問では、dalvikvmはメソッドを拒否していました。この場合、それは異なっていました、このコードはここにあります:

ss = 78.0 / radiusearthkm + 1.0;

radiuseathkmがデバッガーで数行前に設定されていたときにssを1.0に設定していましたが、値は6378.135であるはずのときに0.0であるため、ssは1.0122292801892716になります。その後、そのエラーは次の数百の計算に伝播し、問題が発生します。

だから私はこれを変更しました:

public static boolean sgp4init(
        Gravconsttype whichconst, char opsmode, final int satn, final double epoch,
        final double xbstar, final double xecco, final double xargpo,
        final double xinclo, final double xmo, final double xno,
        final double xnodeo, SGP4SatData satrec)
{
    /* --------------------- local variables ------------------------ */
    double ao, ainv, con42, cosio, sinio, cosio2, eccsq,
            omeosq, posq, rp, rteosq,
            cnodm, snodm, cosim, sinim, cosomm, sinomm, cc1sq,
            cc2, cc3, coef, coef1, cosio4, day, dndt,
            em, emsq, eeta, etasq, gam, argpm, nodem,
            inclm, mm, nm, perige, pinvsq, psisq, qzms24,
            rtemsq, s1, s2, s3, s4, s5, s6,
            s7, sfour, ss1, ss2, ss3, ss4, ss5,
            ss6, ss7, sz1, sz2, sz3, sz11, sz12,
            sz13, sz21, sz22, sz23, sz31, sz32, sz33,
            tc, temp, temp1, temp2, temp3, tsi, xpidot,
            xhdot1, z1, z2, z3, z11, z12, z13,
            z21, z22, z23, z31, z32, z33,
            qzms2t, ss, j2, j3oj2, j4, x2o3, //r[3], v[3],
            tumin, mu, radiusearthkm, xke, j3;
    double[] r = new double[3];
    double[] v = new double[3];

これに:

static double radiusearthkm, ao, ainv, con42, cosio, sinio, cosio2, eccsq,
        omeosq, posq, rp, rteosq,
        cnodm, snodm, cosim, sinim, cosomm, sinomm, cc1sq,
        cc2, cc3, coef, coef1, cosio4, day, dndt,
        em, emsq, eeta, etasq, gam, argpm, nodem,
        inclm, mm, nm, perige, pinvsq, psisq, qzms24,
        rtemsq, s1, s2, s3, s4, s5, s6,
        s7, sfour, ss1, ss2, ss3, ss4, ss5,
        ss6, ss7, sz1, sz2, sz3, sz11, sz12,
        sz13, sz21, sz22, sz23, sz31, sz32, sz33,
        tc, temp, temp1, temp2, temp3, tsi, xpidot,
        xhdot1, z1, z2, z3, z11, z12, z13,
        z21, z22, z23, z31, z32, z33,
        qzms2t, ss, j2, j3oj2, j4, x2o3, //r[3], v[3],
        tumin, mu,  xke, j3;


public static boolean sgp4init(
        SGP4unit_a.Gravconsttype whichconst, char opsmode, final int satn, final double epoch,
        final double xbstar, final double xecco, final double xargpo,
        final double xinclo, final double xmo, final double xno,
        final double xnodeo, SGP4SatData satrec)
{

    double[] r = new double[3];
    double[] v = new double[3];

そして、すべてが正しく機能しています。

于 2013-01-11T19:43:17.777 に答える