Помогите избавиться от полтергейста в С.
double a0;
double a1;
double a2;
double a3;
}Fi_Coefs;
typedef Fi_Coefs FFunc[4];
FFunc * Fi;
int ii = 1;
int ps = 1;
??
/* Fi[ii-1][ps-1]: { 1.6, 6.4, 0.6, 3.2 }
Fi[0][0]: { 0.9,-5.2, 1.6, 6.4 } */
??
// ii == 1, ps == 1
Fi[ii-1][ps]: { -5.6, -6.4, -0.4, 3.2 }
Fi[ii-1][1]: { -5.6, -6.4, -0.4, 3.2 }
Fi[0][ps]: { 0.6, 3.2, -5.6, -6.4 }
Fi[0][1]: { 0.6, 3.2, -5.6, -6.4 }
Fi[ii-1][ps-1]: { 1.6, 6.4, 0.6, 3.2 }
Fi[ii-1][0]: { 1.6, 6.4, 0.6, 3.2 }
Fi[0][ps-1]: { 1.6, 6.4, 0.6, 3.2 }
Fi[0][0]: { 0.9, -5.2, 1.6, 6.4 }
(**Fi): { 0.9, -5.2, 1.6, 6.4 }
2. Рекомендую выделить законченный (пригодный для исполнения) кусок кода, и привести его целиком. Перед этим попытаться найти и отбросить части, не влияющие на возникновение эффекта.
<flame>3. В языке C массивов нет, и считать иначе - значит нарываться на грабли, что мы и наблюдаем</flame>
double a0;
double a1;
double a2;
double a3;
}Fi_Coefs;
typedef Fi_Coefs FFunc[4];
FFunc - это что?
А вообще дествительно - кинь законченный кусок я в отладчике сам погоняю, а так лень.
FFunc - Это тип: массив из 4 эл-тов типа Fi_Coefs.
typedef struct{
double a0;
double a1;
double a2;
double a3;
}Fi_Coefs;
typedef Fi_Coefs FFunc[4];
int main{
FFunc * Fi;
int n,r,ii,jj;
n = 16;
Fi = (FFunc *) malloc (n * sizeof(FFunc;
for(ii=0;ii<n;ii++)
for(jj=0;jj<4;jj++) {
Fi[ii][jj].a0 = ii+jj;
Fi[ii][jj].a1 = ii+jj+1;
Fi[ii][jj].a2 = ii+jj+2;
Fi[ii][jj].a3 = ii+jj+3;
}
ii=1; jj=1;
/*watch Fi[ii-1][jj-1] =? F[0][0], F[ii][jj] =? F[1][1]*/
return 0;
}
gcc version 2.95.4 20011002 (Debian prerelease)
а если не использовать отладчик, эффект сохраняется?
если компилировать бцц55 из командной строки, значения выводит тоже глюканутые...
но имхо так не пишут обычно, так что вполне возможен баг в компиляторе, тем более в таком древнем
"указатель на массив из указателей на функции, возвращающие указатель на очередной массив" - так же пишут
пример был в К-Р.
Массив и так указатель на линейно упорядоченные записи.
Оставить комментарий
vitasgigant
double res;int ii,ps;
double xx,yy;
//Fi - двумерный массив структур с полями а0..а3 типа double
/* Watch:
Fi[ii-1][ps-1].a0: 1.6
Fi[ii-1][ps-1].a1*xx: 1.6
Fi[ii-1][ps-1].a2*yy: 0.075
Fi[ii-1][ps-1].a3*(xx*xx-yy*yy): 0.15
Fi[ii-1][ps-1].a0 + Fi[ii-1][ps-1].a1*xx + Fi[ii-1][ps-1].a2*yy + Fi[ii-1][ps-1].a3*(xx*xx-yy*yy): 3.425
Все значения верные
*/
res = Fi[ii-1][ps-1].a0 + Fi[ii-1][ps-1].a1*xx + Fi[ii-1][ps-1].a2*yy + Fi[ii-1][ps-1].a3*(xx*xx-yy*yy);
/* Watch:
res: 0.1
глюк
*/
//Пробуем по-другому:
res = (double) (Fi[ii-1][ps-1].a0);
/* res: 0.9 глюк */
res+= (double) (Fi[ii-1][ps-1].a1*xx);
/* res: -0.4 глюк */
res+= (double) (Fi[ii-1][ps-1].a2*yy);
/* res: -0.2 глюк */
res+= (double) (Fi[ii-1][ps-1].a3*(xx*xx-yy*yy;
/* res: 0.1 глюк */