Помогите избавиться от полтергейста в С.
typedef struct{
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 } */
??
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 }
// 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 }
1. На чём основано предположение, что этот Watch работает правильно с такими структурами?
2. Рекомендую выделить законченный (пригодный для исполнения) кусок кода, и привести его целиком. Перед этим попытаться найти и отбросить части, не влияющие на возникновение эффекта.
<flame>3. В языке C массивов нет, и считать иначе - значит нарываться на грабли, что мы и наблюдаем</flame>
2. Рекомендую выделить законченный (пригодный для исполнения) кусок кода, и привести его целиком. Перед этим попытаться найти и отбросить части, не влияющие на возникновение эффекта.
<flame>3. В языке C массивов нет, и считать иначе - значит нарываться на грабли, что мы и наблюдаем</flame>
typedef struct{
double a0;
double a1;
double a2;
double a3;
}Fi_Coefs;
typedef Fi_Coefs FFunc[4];
FFunc - это что?
А вообще дествительно - кинь законченный кусок я в отладчике сам погоняю, а так лень.
double a0;
double a1;
double a2;
double a3;
}Fi_Coefs;
typedef Fi_Coefs FFunc[4];
FFunc - это что?
А вообще дествительно - кинь законченный кусок я в отладчике сам погоняю, а так лень.
FFunc - Это тип: массив из 4 эл-тов типа Fi_Coefs.
#include <alloc.h>
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;
}
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)
а если не использовать отладчик, эффект сохраняется?
gcc version 2.95.4 20011002 (Debian prerelease)
а если не использовать отладчик, эффект сохраняется?
для бцц31 вотч показывает разные значения.
если компилировать бцц55 из командной строки, значения выводит тоже глюканутые...
если компилировать бцц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 глюк */