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