Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C语言中实现多维数组上的foreach循环?_C_Arrays_Multidimensional Array_Foreach_Macros - Fatal编程技术网

如何在C语言中实现多维数组上的foreach循环?

如何在C语言中实现多维数组上的foreach循环?,c,arrays,multidimensional-array,foreach,macros,C,Arrays,Multidimensional Array,Foreach,Macros,我找到了这个宏,@Johannes Schaub用它来数组。我试图将其应用于多维数组,但收到警告: 从不兼容的指针类型初始化[默认启用]| #define foreach(item, array) \ for(int keep = 1, \ count = 0,\ size = sizeof (array) / sizeof *(array); \ keep && count != size; \

我找到了这个宏,@Johannes Schaub用它来数组。我试图将其应用于多维数组,但收到警告:

从不兼容的指针类型初始化[默认启用]|

#define foreach(item, array) \
    for(int keep = 1, \
            count = 0,\
            size = sizeof (array) / sizeof *(array); \
        keep && count != size; \
        keep = !keep, count++) \
      for(item = (array) + count; keep; keep = !keep)

double DaysEarthSun[][10] = {
    //            0                                                         1                       2                       3                       4                       5                       6                       7                       8                       9
    //          JDTDB,            Calendar Date (TDB),                      X,                      Y,                      Z,                     VX,                     VY,                     VZ,                     LT,                     RG,                     RR,
    {2305447.500000000, /*"A.D. 1600-Jan-01 00:00:00.0000",*/ -2.568497981915648E-01,  9.438245451677045E-01,  6.410938668761658E-04, -1.684598702834566E-02, -4.667597482526307E-03, -4.906040833845624E-06,  5.649322014152373E-03,  9.781497849989120E-01, -8.026158042429985E-05},
    {2305448.500000000, /*"A.D. 1600-Jan-02 00:00:00.0000",*/ -2.736541829631095E-01,  9.390104932363517E-01,  6.360724040092633E-04, -1.676196451434489E-02, -4.960286450217222E-03, -5.142448255071298E-06,  5.648881285390255E-03,  9.780734751792867E-01, -7.236940265538736E-05}
};

void printSOE(){
    double distance, velocity, km, km_2, speed;
    FILE *f;
    foreach(int *soe,
                DaysEarthSun) {
        distance = sqrt( soe[1]*soe[1] + soe[2]*soe[2] + soe[3]*soe[3] ); // units: AU-D
        velocity = sqrt( soe[4]*soe[4] + soe[5]*soe[5] + soe[6]*soe[6] ); // units: AU-D
        km = (149597870.700*distance); // km/day
        speed = (149597870.700*velocity); // km/day
        km_2 = 25902068370*soe[7]; // E-S distance: light day to km
        printf("\n\n%f km , %f km/day\n", km, speed);
        printf("distance based on light: %f km/day\n\n", km_2);
        f = fopen("output.txt", "a");
        fprintf(f, "%f, %f,", km, speed );
    }
    fclose(f);
}

您的宏看起来可疑--我无法分析它为什么会执行某些操作。我强烈建议您放弃它,使用标准的
for
构造编写自己的迭代

但是,无论是否继续使用宏,都需要了解C多维数组是数组的数组。因此,指向多维数组中一个元素的指针就是指向数组的指针。这种指针的类型不同于指向最终标量类型的指针的类型

特别是

double DaysEarthSun[][10] = {
    // ...
};
,指向
DaysEarthSun
元素的指针的类型为
double(*)[10]
。您可以这样声明该类型的变量:

double (*soe)[10];  // RIGHT: pointer to array of 10 doubles
如果希望通过指向数组元素的指针遍历数组,则需要使用指针的类型

还要注意的是,这与

double *soe;        // WRONG: pointer to (one) double
来自

double *soe[10];    // WRONG: Array of 10 pointers to (one) double

这里有两个错误

首先是类型不匹配。您有
int*soe
,但您正试图为其分配一个
double[]
(衰减为
double*
)。因此,将其更改为
double*soe

第二个错误在宏中:

for(item = (array) + count; keep; keep = !keep)
看起来您正试图将
数组
的元素分配给
,但实际情况并非如此。您在数组上添加指针,但无法取消引用它

添加取消引用:

for(item = *((array) + count); keep; keep = !keep)
或使用数组元素运算符:

for(item = (array)[count]; keep; keep = !keep)

这里是forEach的一个几乎完全相同的实现:for(inti=0;i
int*soe
是错误的,我也尝试了
double*soe
,但警告是sameyes,这两种类型都不是正确的类型。对于语句,只使用标准的c
,而不是使用引入自定义伪关键字的宏如何?我看不出你认为你的方法有什么好处。但是,如果你坚持使用
foreach
宏,那么关于你的代码的问题需要包括它的定义。链接到外部站点是不够的。非常感谢。解决方案看起来很简单,但很棘手,如果没有您的帮助,我将无法找到。@user1141649我注意到的另一点是:内部循环是不必要的,因为您没有循环第二组元素。您可以将
项的赋值
移动到上面的循环中。好的,但是当我想要导出一些数据时,我只需要将此代码用于临时目的。当数据被导出时,我将不再使用它(我已经完成)。但是我可以稍后使用foreach宏。