Помогите избавиться от полтергейста в С.

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 глюк */

vitasgigant

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 } */
??

vitasgigant

А вот еще несколько интересных вотчей:
// 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 }

abrek

1. На чём основано предположение, что этот Watch работает правильно с такими структурами?
2. Рекомендую выделить законченный (пригодный для исполнения) кусок кода, и привести его целиком. Перед этим попытаться найти и отбросить части, не влияющие на возникновение эффекта.
<flame>3. В языке C массивов нет, и считать иначе - значит нарываться на грабли, что мы и наблюдаем</flame>

netmaxed

typedef struct{
double a0;
double a1;
double a2;
double a3;
}Fi_Coefs;
typedef Fi_Coefs FFunc[4];
FFunc - это что?
А вообще дествительно - кинь законченный кусок я в отладчике сам погоняю, а так лень.

vitasgigant

FFunc - Это тип: массив из 4 эл-тов типа Fi_Coefs.

vitasgigant

#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;
}

Marinavo_0507

у меня всё нормально
gcc version 2.95.4 20011002 (Debian prerelease)
а если не использовать отладчик, эффект сохраняется?

vitasgigant

для бцц31 вотч показывает разные значения.
если компилировать бцц55 из командной строки, значения выводит тоже глюканутые...

abrek

мне лениво в стандарт лезть смотреть, должно ли такое вообще работать
но имхо так не пишут обычно, так что вполне возможен баг в компиляторе, тем более в таком древнем

vitasgigant

почему же не пишут.
"указатель на массив из указателей на функции, возвращающие указатель на очередной массив" - так же пишут
пример был в К-Р.

Eugenia_2005

Зачем нужен указатель на массив?
Массив и так указатель на линейно упорядоченные записи.
Оставить комментарий
Имя или ник:
Комментарий: