java - c++ 到 java 的转换,几个问题

标签 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);
}

最佳答案

  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)

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

关于java - c++ 到 java 的转换,几个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7548961/

相关文章:

java - 搜索 View 不显示任何结果

java - 如何使用 Spring 手动 Autowiring bean?

java - 只要有非零余数,我的 Bigdecimal 除法就会导致应用程序崩溃?

C++ ofstream 写入在 Windows 下不起作用。在 Linux 下工作正常

c++ - 如何计算 3d 数组中的索引值在内存中的位置?如何计算 char** 中的索引值在内存中的位置?

java - 如何阅读管道分隔线 |来自一个文件并在两个不同的 ArrayList 中拆分整数

java - Unity 4.3 + Android - 我需要在 1080 x 1920 下至少以 30 FPS 更新 Texture2D 或 RenderTexture

C++模板类成员函数特化

c++ - 派生类的 Push_back shared_ptr

libraries - 对符号 'BIO_ctrl@@libcrypto.so.10' 的 undefined reference