初始化不是整数的巨大常量多维数组的最佳方法是什么?
What is the best way to initialize huge constant multidimensional arrays that are not integers?
我正在尝试将美国海军天文台制作的太阳位置算法(又名">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 数组那样初始化它们。
有没有更好的方法来初始化我不知道的多维常量双数组?
注意:USNO 编写的源代码是用 C 语言完成的,但我正在尝试在 C++ 中使用它。我应该只包含他们的文件并调用计算函数吗?
您绝对可以使用初始值设定项列表。做这种事情时,我喜欢做的是从小得多开始。从小得多的阵列开始,以便更易于管理。
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
希望这使它更清楚。请注意,没有理由像我一样留下行,我只是发现它更容易阅读。
所以在初始化列表中,你可以使用((或{},而不是({}(。因此,例如,初始化数组应该使用以下行完成:
class Foo::Foo() : L_TERMS{{{ ... }}}, // rest of initialization
而不是
class Foo::Foo() : L_TERMS( {{{ ... }}} ) // rest of initialization
相关文章:
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 在 C++ 中将整数数组转换为位集表示形式的最佳方法?
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 创建 std::string 的二维数组的最佳做法
- 从数组中删除非唯一值、保持顺序和不使用向量的最佳方法?
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 这是使用构造函数初始化数组对象的最佳方法吗?
- 比较/搜索数组中多个整数的最佳解决方案
- 将空填充但不以空结尾的固定长度字符数组转换为 std::string 的最佳方法
- 填充字符数组的最佳方法(获取与cin.getline)
- 将对象数组作为参数传递的最佳方法是什么
- 在2D数组中交换行的最佳方法
- 读取四个数据文件并使用函数将它们放入结构数组的最佳方法是什么
- 使用索引数组订购 ArrayFire Array 的最佳方式
- C++保存大型数组的最佳方法
- 以C++声明数组大小的最佳方法
- C 初始化列表std ::数组最佳性能
- 我该如何判断k-server动态解决方案的最佳路径以数组成本[i] [j] [k] [t]位于何处
- C++是检查多维数组中匹配项的最佳优化方法
- 保留动态分配的数组而不为删除而烦恼的最佳方法