使用多个小数组代替大数组

时间:2015-08-18 17:51:22

标签: c arrays struct

为了增加代码的并行化,我试图使用具有17个不同子阵列的结构,而不是具有一个巨大的17维数组的结构,通过这样做:

int n_1[box1];
int n_2[box2];
int n_3[box3];
int n_4[box4];
int n_5[box5];
int n_6[box6];
int n_7[box7];
int n_8[box8];
int n_9[memvara];
int n_10[memvarb];
int n_11[memvarc];
int n_12[memvard];
int n_13[adirect];
int n_14[tdirect];
int n_15[fs];
int n_16[bs];
int n_17[outputnum];

// Set up a pointer-based structure
typedef struct calookup_b
{
    int *n_1;
    int *n_2;
    int *n_3;
    int *n_4;
    int *n_5;
    int *n_6;
    int *n_7;
    int *n_8;
    int *n_9;
    int *n_10;
    int *n_11;
    int *n_12;
    int *n_13;
    int *n_14;
    int *n_15;
    int *n_16;
    int *n_17;
} calookup_b;

而不是这个,目前在代码中大量使用:

typedef struct calookup
{

    signed char n[box1][box2][box3][box4][box5][box6][box7][box8][memvara][memvarb][memvarc][memvard][adirect][tdirect][fs][bs][outputnum];
    double raw;
} calookup;

当我遇到这样的电话时,我遇到了麻烦:

for (m = 0; m < outputnum; m++)
{
    behaviour[m] = calookup->n[s3][s4][s5][s6][wa][wb][aa][ab][a->memm[0]][a->memm[1]][a->memm[2]][a->memm[3]][a->lightdirection][a->lightsense][a->fsa][a->maxload][m];
... }

我如何将两者等同?我应该编写一个具有17个以上输入的函数来返回巨型多维数组的值,还是有更优雅的方式?

1 个答案:

答案 0 :(得分:2)

17维数组与17个数组不同。简单案例:

int array[3][3][3];  // This can hold 3x3x3 = 27 elements

int array1[3];
int array2[3];
int array3[3];       // Together, they can hold only 9 elements.

您可以使用:

int array1[3][3];
int array2[3][3];
int array3[3][3];    // Together, they can hold 27 elements.

将这个类比用于17维阵列......

数组:

signed char n[box1][box2][box3][box4][box5][box6][box7][box8][memvara][memvarb][memvarc][memvard][adirect][tdirect][fs][bs][outputnum];

可以转换为:

signed char n1[box2][box3][box4][box5][box6][box7][box8][memvara][memvarb][memvarc][memvard][adirect][tdirect][fs][bs][outputnum];
signed char n2[box2][box3][box4][box5][box6][box7][box8][memvara][memvarb][memvarc][memvard][adirect][tdirect][fs][bs][outputnum];

...

signed char nN[box2][box3][box4][box5][box6][box7][box8][memvara][memvarb][memvarc][memvard][adirect][tdirect][fs][bs][outputnum];