Объяснить код с непрямым обращением - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, есть код, можете помочь объяснить, что тут происходит. О себе: с института знаю паскаль - не знаю c. AskS - массив sk1 - массив я не могу понять, как это работает, можно ли написать этот код в прямом обращении, думаю, что мне так удобнее понять будет.
....    
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);
....
Заранее благодарен за ответ. Причина вопроса. Есть большой рабочий модуль: определяет время восхода и заката солнца. Я хочу перенести его на arduino, который, выдает ошибку связанную с адресацией. Мне кажется, что компилятор arduino не понимает косвенную адресацию.
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
Ошибка компиляции.
Как я переносил код. Я в начало перенес все типы из файла заголовков ".h", а чуть ниже перенес все из файла ".cpp". Вот процедура целиком. строка 491, в которой компилятор видит ошибку, - последняя строка в функции "}"
/*********************************************************
 * Получение долготы Солнца 
 * (в градусах) (ошибка до +(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);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.429 из 5