我找到了这个宏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);
}
答案 0 :(得分:1)
这里有两个错误。
首先是您的类型不匹配。您有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)
答案 1 :(得分:0)
你的宏看起来很可疑 - 我无法分析它为什么做它做的一些事情。我强烈建议您放弃它并使用标准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
答案 2 :(得分:0)
这是forEach的几乎精确的实现:for(int i = 0; i< something; i ++);至于在这种情况下每个都是c#的forEach(int I in something){// code here}