我找到了这个宏 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/