我正在将一些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);
}
答案 0 :(得分:1)
第一个if语句正在测试零/非零的数组条目。在C / C ++中,布尔值只是一个以特殊方式使用的int,使得零为false且非零为真。
关于你的第二个阵列问题,我还没有讨论过它。但要明白C / C ++不进行数组边界检查(除了触摸未定义的存储页面时可能会发生的事情),所以除非C ++代码中存在一个令人震惊的错误,否则必须有一些限制对有效边界的引用。阵列。
答案 1 :(得分:1)
if (ampconst[i][0] || ampconst[i][1])
测试ampconst [i]中的第一列/第二列是否包含非零(这是一个早期优化:如果两个常数都为0则可以跳过计算)
编辑我刚刚发现(谷歌!)这是一个章动计算,已在很多地方采用,但似乎最初来自libastro。
hg clone https://bitbucket.org/brandon/pyephem
就isecul索引而言:显然isecul永远不应该增长到&gt; = 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应该不会增长&gt; = 15 operators[](...)
)?这可能与包含终结符检查的相同类/函数大致相同,如上所示。
来自链接源的