我正在将一些 C++ 转换为 java,但有一点我不确定 第一个问题是行中测试的是什么
if (ampconst[i][0] || ampconst[i][1])
这是数组中数据的示例。
static short ampconst[NUT_SERIES][2] = {
{0,0},
{0,0},
{46,-24}
};
我的第二个问题是 ampsecul 数组比 NUT_SERIES 短得多 所以我得到数组越界异常,数组像这样终止
static long ampsecul[][5] = {
{0 ,-171996 ,-1742 ,92025 ,89},
{1 ,2062 ,2 ,-895 ,5},
{8 ,-13187 ,-16 ,5736 ,-31},
{9 ,1426 ,-34 ,54 ,-1},
{10 ,-517 ,12 ,224 ,-6},
{11 ,217 ,-5 ,-95 ,3},
{12 ,129 ,1 ,-70 ,0},
{15 ,17 ,-1 ,0 ,0},
{17 ,-16 ,1 ,7 ,0},
{30 ,-2274 ,-2 ,977 ,-5},
{31 ,712 ,1 ,-7 ,0},
{32 ,-386 ,-4 ,200 ,0},
{33 ,-301 ,0 ,129 ,-1},
{37 ,63 ,1 ,-33 ,0},
{38 ,-58 ,-1 ,32 ,0},
/* termination */ { -1, }
};
那么这在 Java 中如何处理以及这些行的值是什么 当数组越界或 C++ 将如何处理时。
ampsin = ampsecul[isecul][1] + ampsecul[isecul][2] * T10;
ampcos = ampsecul[isecul][3] + ampsecul[isecul][4] * T10;
提前感谢您的任何建议。 这是整个 for 循环,请参阅上下文中的代码。
for (i = isecul = 0; i < NUT_SERIES ; ++i) {
double arg = 0., ampsin, ampcos;
short j;
if (ampconst[i][0] || ampconst[i][1]) {
/* take non-secular terms from simple array */
ampsin = ampconst[i][0];
ampcos = ampconst[i][1];
} else {
/* secular terms from different array */
ampsin = ampsecul[isecul][1] + ampsecul[isecul][2] * T10;
ampcos = ampsecul[isecul][3] + ampsecul[isecul][4] * T10;
++isecul;
}
for (j = 0; j < 5; ++j)
arg += delcache[j][NUT_MAXMUL + multarg[i][j]];
if (fabs(ampsin) >= prec)
lastdpsi += ampsin * sin(arg);
if (fabs(ampcos) >= prec)
lastdeps += ampcos * cos(arg);
}
最佳答案
if (ampconst[i][0] || ampconst[i][1])
测试 ampconst[i] 中的第一列/第二列是否包含非零值(这是一个早期优化:如果两个常量都为 0 则可以跳过计算)
Edit I just found (google!) that this is a nutation calculation that has been adopted in quite a few places, but seems to be originally from a libastro.
hg clone https://bitbucket.org/brandon/pyephem
就 isecul 索引而言:显然 isecul 永远不应该增长到 >= 15(请注意 i
是循环变量,而不是 isecul
, isecul
有条件地递增)。
但是,看到“终止符”(-1) 值,我真的很期待像
if (ampsecul[isecul][0] == -1)
isecul = 0; // ? just guessing :)
或
if (ampsecul[isecul][0] == -1)
break;
此外,我的印象是 ampsecul 的第一列是基于范围的划分,所以不知何故,会有二进制搜索匹配槽到 ampsecul,而不是直接索引(即 isecul=4 将选择索引 2( 2..8) 不是 4)
您确定您获取的源代码正确吗?我看起来很像您错过了一些自定义索引器( 编辑 从链接源我得到的印象是代码非常符合原样,因此 isecul 不应该增长 >= 15operators[](...)
)?这可能与包含如上所示的终止符检查的类/函数大致相同。
关于java - c++ 到 java 的转换,几个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7548961/