Объяснить код с непрямым обращением - 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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д