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

标签 c arrays multidimensional-array foreach macros

我找到了这个宏 here ,@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);
}

最佳答案

这里有两个错误。

首先是您的类型不匹配。您有 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)

关于c - 如何在 C 中的多维数组上实现 foreach 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45379739/

相关文章:

c - 嵌套函数及其用途,一个接一个调用的函数?

java - 如何使用多线程在java中找到二维数组的最大值

arrays - 将旧的 C for 循环更改为新的 Swift 循环

c++ - 在函数中修改二维数组

c - 这个数组大小是怎么来的呢?

C dlsym undefined symbol

c - sqrt 函数出现小错误

C 编程 - 不知道为什么输入首先在打印语句之前

java - Java 中的对象列表排序 - 包含十进制数的字符串对象

php - 在一行代码中回显一些字符串和多维数组元素