c ++到java转换,有几个问题

时间:2011-09-25 22:07:12

标签: java c++

我正在将一些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);
}

2 个答案:

答案 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是循环变量,而不是iseculisecul有条件地增加)。

但是,看到'终结者'(-1)值,我真的希望检查一些像

if (ampsecul[isecul][0] == -1)
   isecul = 0; // ? just guessing :)

if (ampsecul[isecul][0] == -1)
   break;

另外,我得到的印象是,ampsecul的第一列是基于范围的除法,所以不知何故,将匹配插槽的二进制搜索放入ampsecul,而不是直接索引(即isecul = 4将选择索引2( 2..8)不是4)

您确定要正确获取源代码吗?我看起来非常像你错过了一些自定义索引器(operators[](...))?这可能与包含终结符检查的相同类/函数大致相同,如上所示。 来自链接源的 编辑我得到的印象是代码非常原样,因此isecul应该不会增长&gt; = 15