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



我在这里找到了这个宏,@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("nn%f km , %f km/dayn", km, speed);
printf("distance based on light: %f km/daynn", km_2);
f = fopen("output.txt", "a");
fprintf(f, "%f, %f,", km, speed );
}
fclose(f);
}

这里有两个错误。

首先是类型不匹配。 您有int *soe,但您正在尝试为其分配一个double [](衰减为double *(。 所以把它改成double *soe.

第二个错误在宏中:

for(item = (array) + count; keep; keep = !keep)

看起来您正在尝试将array元素分配给item,但事实并非如此。 您在数组上执行指针添加,但无法取消引用它。

添加取消引用:

for(item = *((array) + count); keep; keep = !keep)

或者使用数组元素运算符:

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

你的宏看起来很可疑——我很难分析它为什么做它所做的一些事情。 我强烈建议您放弃它并使用标准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

以下是forEach的几乎精确的实现: for(int i = 0; i

最新更新