Объяснить код с непрямым обращением - C (СИ)
Формулировка задачи:
Здравствуйте, есть код, можете помочь объяснить, что тут происходит.
О себе: с института знаю паскаль - не знаю c.
AskS - массив
sk1 - массив
я не могу понять, как это работает, можно ли написать этот код в прямом обращении, думаю, что мне так удобнее понять будет.
Заранее благодарен за ответ.
Причина вопроса. Есть большой рабочий модуль: определяет время восхода и заката солнца. Я хочу перенести его на arduino, который, выдает ошибку связанную с адресацией. Мне кажется, что компилятор arduino не понимает косвенную адресацию.
Как я переносил код. Я в начало перенес все типы из файла заголовков ".h", а чуть ниже перенес все из файла ".cpp".
Вот процедура целиком. строка 491, в которой компилятор видит ошибку, - последняя строка в функции "}"
....
for (i=0;i<49;i++)
{
vl += *(AskS+i)*sin((*(sk1+i*5+0))*l1+
(*(sk1+i*5+1))*g1+
(*(sk1+i*5+2))*g3+
(*(sk1+i*5+3))*g4+
(*(sk1+i*5+4))*g5);
....sun.ino: In function 'double get_lon(double)':
sun.ino:491:1: error: unable to find a register to spill in class 'POINTER_REGS'
sun.ino:491:1: error: this is the insn:
(insn 301 300 304 5 (set (reg:SF 124 [ D.4711 ])
(mem:SF (post_inc:HI (reg:HI 16 r16 [orig:149 ivtmp.76 ] [149])) [2 MEM[base: _224, offset: 0B]+0 S4 A8])) sun.ino:479 99 {*movsf}
(expr_list:REG_INC (reg:HI 16 r16 [orig:149 ivtmp.76 ] [149])
(nil)))
sun.ino:491: confused by earlier errors, bailing out
Ошибка компиляции./*********************************************************
* Получение долготы Солнца
* (в градусах) (ошибка до +(2-8) секунд)
* t - Юлианское время от J2000
*********************************************************/
double get_lon(double t)
{
double T = t/C_T;
double ret=0,
vl=0,
lgr=0;
double l,l1,D,F,
g1,g3,g4,g5;
int i;
// Средняя аномалия Луны
l = retlJ(t);
// Средняя аномалия Cолнца
l1= retl1J(t);
// Средняя аномалия Венеры
g1= retl_Wn(t)-retp_Wn(t);
// Средняя аномалия Марса
g3= retl_Mar(t)-retp_Mar(t);
// Средняя аномалия Юпитера
g4= retl_Jup(t)-retp_Jup(t);
// Средняя аномалия Сатурна
g5= retl_Sat(t)-retp_Sat(t);
l *= PI/180.0;
l1 *= PI/180.0;
g1 *= PI/180.0;
g3 *= PI/180.0;
g4 *= PI/180.0;
g5 *= PI/180.0;
FillAmS(t);
for (i=0;i<49;i++)
{
vl += *(AskS+i)*sin((*(sk1+i*5+0))*l1+
(*(sk1+i*5+1))*g1+
(*(sk1+i*5+2))*g3+
(*(sk1+i*5+3))*g4+
(*(sk1+i*5+4))*g5);
vl += *(AckS+i)*cos((*(sk1+i*5+0))*l1+
(*(sk1+i*5+1))*g1+
(*(sk1+i*5+2))*g3+
(*(sk1+i*5+3))*g4+
(*(sk1+i*5+4))*g5);
}
double a = 13*l1-8*g1+3.8990655+0.0785398*(t+36525)/C_T;
vl += 6e-6*cos(a)+7e-6*sin(a);
// Средний аргумент широты Луны
F = retFJ(t);
// Разность средних долгот Луны и Солнца
D = retDJ(t);
F *= PI/180.0;
D *= PI/180.0;
for (i=0;i<4;i++)
{
vl += *(AskS+i+49)*sin((*(sk2+i*4+0))*l+
(*(sk2+i*4+1))*l1+
(*(sk2+i*4+2))*F+
(*(sk2+i*4+3))*D);
}
ret = retl_Sl(t);// средняя долгота солнца
vl *= 180/PI;
ret+= vl;
ret = fmod(ret,360);
if (ret<0) ret+=360;
return ret;
}Решение задачи: «Объяснить код с непрямым обращением»
textual
Листинг программы
struct A
{
double val1;
double val2;
double val3;
double val4;
double val5;
} sk[49];
// обращение будет выглядеть намного приятней
vl += AskS[i]*sin(sk1[i].val1*l1+
sk1[i].val2*g1+
sk1[i].val3*g3+
sk1[i].val4*g4+
sk1[i].val5*g5);