初始化非整数的巨大常量多维数组的最佳方法是什么?

问题描述 投票:-1回答:2

我试图将美国海军天文台制作的solar position algorithm(又名“spa”)的改编功能转换为我的代码,这样我就可以轻松地调用一种方法来计算太阳位置。

下面的代码来自USNO的源代码。我正在尝试初始化列表L_TERMS,B_TERMS和R_TERMS

#define L_COUNT 6
#define B_COUNT 2
#define R_COUNT 5
#define Y_COUNT 63

#define L_MAX_SUBCOUNT 64
#define B_MAX_SUBCOUNT 5
#define R_MAX_SUBCOUNT 40

enum {TERM_A, TERM_B, TERM_C, TERM_COUNT};
enum {TERM_X0, TERM_X1, TERM_X2, TERM_X3, TERM_X4, TERM_X_COUNT};
enum {TERM_PSI_A, TERM_PSI_B, TERM_EPS_C, TERM_EPS_D, TERM_PE_COUNT};
enum {JD_MINUS, JD_ZERO, JD_PLUS, JD_COUNT};
enum {SUN_TRANSIT, SUN_RISE, SUN_SET, SUN_COUNT};

#define TERM_Y_COUNT TERM_X_COUNT

const int l_subcount[L_COUNT] = {64,34,20,7,3,1};
const int b_subcount[B_COUNT] = {5,2};
const int r_subcount[R_COUNT] = {40,10,6,2,1};

const double L_TERMS[L_COUNT][L_MAX_SUBCOUNT][TERM_COUNT]=
 { ... }; // contains 3*(64+34+20+7+3+1) = 387 doubles
const double B_TERMS[B_COUNT][B_MAX_SUBCOUNT][TERM_COUNT]=
 { ... }; // contains 3*(5+2) = 21 doubles
const double R_TERMS[R_COUNT][R_MAX_SUBCOUNT][TERM_COUNT]=
 { ... }; // contains 3*(40+10+6+2+1) = 177 doubles

我在使用构造函数初始化数组时遇到了麻烦。我尝试使用初始化列表,但它似乎不起作用。如果我在构造函数中初始化数组,一切都很好,但不会在其他方法的范围内,因为我不能在标题中声明它们。我不能像const int数组那样初始化它们。

有没有更好的方法来初始化我不知道的多维const双数组?

注意:USNO编写的源代码是用C语言完成的,但我试图在C ++中使用它。我应该只包含他们的文件并调用计算功能吗?

c++ arrays multidimensional-array initialization-list
2个回答
1
投票

你绝对可以使用初始化列表。做这种事情时我喜欢做的事情虽然要小得多。从更小的阵列开始,因此更容易管理。

int main()
{
    const double d[2][3][4] =
    {
        {
            { 0.1, 0.2, 0.3, 0.4 },
            { 0.5, 0.6, 0.7, 0.8 },
            { 0.9, 1.0, 1.1, 1.2 }
        },
        {
            { 0.1, 0.2, 0.3, 0.4 },
            { 0.5, 0.6, 0.7, 0.8 },
            { 0.9, 1.0, 1.1, 1.2 }
        },
    };
}

在这里,我们将d声明为2 x 3 x 4.因此我们可以使用d[0]d[1],而d[0][2]d[1][2][3]是最后一个元素。

这是各种打印的内容,注意到我一直懒惰,只是声明外部数组具有相同的元素:

std::cout << d[0][0][0] << ", " << d[1][0][0] << "\n"; // prints 0.1, 0.1
std::cout << d[0][2][3] << ", " << d[1][2][3] << "\n"; // prints 1.2, 1.2
std::cout << d[0][1][2] << ", " << d[1][1][2] << "\n"; // prints 0.7, 0.7

希望这更清楚。请注意,没有理由留下像我一样的线条,我发现它更容易阅读。


0
投票

因此,在初始化列表中,您可以使用()或{},而不是({})。因此,例如,应使用以下行初始化数组:

class Foo::Foo() : L_TERMS{{{ ... }}}, // rest of initialization

而不是

class Foo::Foo() : L_TERMS( {{{ ... }}} ) // rest of initialization
© www.soinside.com 2019 - 2024. All rights reserved.