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

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

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

Здравствуйте, есть код, можете помочь объяснить, что тут происходит. О себе: с института знаю паскаль - не знаю c. AskS - массив sk1 - массив я не могу понять, как это работает, можно ли написать этот код в прямом обращении, думаю, что мне так удобнее понять будет.
Листинг программы
  1. ....
  2. for (i=0;i<49;i++)
  3. {
  4. vl += *(AskS+i)*sin((*(sk1+i*5+0))*l1+
  5. (*(sk1+i*5+1))*g1+
  6. (*(sk1+i*5+2))*g3+
  7. (*(sk1+i*5+3))*g4+
  8. (*(sk1+i*5+4))*g5);
  9. ....
Заранее благодарен за ответ. Причина вопроса. Есть большой рабочий модуль: определяет время восхода и заката солнца. Я хочу перенести его на arduino, который, выдает ошибку связанную с адресацией. Мне кажется, что компилятор arduino не понимает косвенную адресацию.
Листинг программы
  1. sun.ino: In function 'double get_lon(double)':
  2. sun.ino:491:1: error: unable to find a register to spill in class 'POINTER_REGS'
  3. sun.ino:491:1: error: this is the insn:
  4. (insn 301 300 304 5 (set (reg:SF 124 [ D.4711 ])
  5. (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}
  6. (expr_list:REG_INC (reg:HI 16 r16 [orig:149 ivtmp.76 ] [149])
  7. (nil)))
  8. sun.ino:491: confused by earlier errors, bailing out
  9. Ошибка компиляции.
Как я переносил код. Я в начало перенес все типы из файла заголовков ".h", а чуть ниже перенес все из файла ".cpp". Вот процедура целиком. строка 491, в которой компилятор видит ошибку, - последняя строка в функции "}"
Листинг программы
  1. /*********************************************************
  2. * Получение долготы Солнца
  3. * (в градусах) (ошибка до +(2-8) секунд)
  4. * t - Юлианское время от J2000
  5. *********************************************************/
  6. double get_lon(double t)
  7. {
  8. double T = t/C_T;
  9. double ret=0,
  10. vl=0,
  11. lgr=0;
  12. double l,l1,D,F,
  13. g1,g3,g4,g5;
  14. int i;
  15. // Средняя аномалия Луны
  16. l = retlJ(t);
  17. // Средняя аномалия Cолнца
  18. l1= retl1J(t);
  19. // Средняя аномалия Венеры
  20. g1= retl_Wn(t)-retp_Wn(t);
  21. // Средняя аномалия Марса
  22. g3= retl_Mar(t)-retp_Mar(t);
  23. // Средняя аномалия Юпитера
  24. g4= retl_Jup(t)-retp_Jup(t);
  25. // Средняя аномалия Сатурна
  26. g5= retl_Sat(t)-retp_Sat(t);
  27. l *= PI/180.0;
  28. l1 *= PI/180.0;
  29. g1 *= PI/180.0;
  30. g3 *= PI/180.0;
  31. g4 *= PI/180.0;
  32. g5 *= PI/180.0;
  33. FillAmS(t);
  34. for (i=0;i<49;i++)
  35. {
  36. vl += *(AskS+i)*sin((*(sk1+i*5+0))*l1+
  37. (*(sk1+i*5+1))*g1+
  38. (*(sk1+i*5+2))*g3+
  39. (*(sk1+i*5+3))*g4+
  40. (*(sk1+i*5+4))*g5);
  41. vl += *(AckS+i)*cos((*(sk1+i*5+0))*l1+
  42. (*(sk1+i*5+1))*g1+
  43. (*(sk1+i*5+2))*g3+
  44. (*(sk1+i*5+3))*g4+
  45. (*(sk1+i*5+4))*g5);
  46. }
  47. double a = 13*l1-8*g1+3.8990655+0.0785398*(t+36525)/C_T;
  48. vl += 6e-6*cos(a)+7e-6*sin(a);
  49. // Средний аргумент широты Луны
  50. F = retFJ(t);
  51. // Разность средних долгот Луны и Солнца
  52. D = retDJ(t);
  53. F *= PI/180.0;
  54. D *= PI/180.0;
  55. for (i=0;i<4;i++)
  56. {
  57. vl += *(AskS+i+49)*sin((*(sk2+i*4+0))*l+
  58. (*(sk2+i*4+1))*l1+
  59. (*(sk2+i*4+2))*F+
  60. (*(sk2+i*4+3))*D);
  61. }
  62. ret = retl_Sl(t);// средняя долгота солнца
  63. vl *= 180/PI;
  64. ret+= vl;
  65. ret = fmod(ret,360);
  66. if (ret<0) ret+=360;
  67. return ret;
  68. }

Решение задачи: «Объяснить код с непрямым обращением»

textual
Листинг программы
  1. struct A
  2. {
  3. double val1;
  4. double val2;
  5. double val3;
  6. double val4;
  7. double val5;
  8. } sk[49];
  9. // обращение будет выглядеть намного приятней
  10.      vl += AskS[i]*sin(sk1[i].val1*l1+
  11.                               sk1[i].val2*g1+
  12.                               sk1[i].val3*g3+
  13.                               sk1[i].val4*g4+
  14.                               sk1[i].val5*g5);

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут