Форум программистов, компьютерный форум CyberForum.ru

Вложенные циклы - C++

Восстановить пароль Регистрация
 
iVeage
0 / 0 / 0
Регистрация: 27.05.2012
Сообщений: 9
18.09.2012, 22:14     Вложенные циклы #1
Всем привет!
Суть проблемы в следующем: вычисляется функция R[l][w], где внешний цикл по l, внутренний по w. Затем вычисляем функцию Beam[i[k]+=fr[w]*R[l][w]*cos(t*w), здесь i-внешний, k-внутренний. Вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
T_complex ** calc_reflected_beam ( T_complex *fr, T_complex **R,                        
                                 double fr_begin, double fr_end, double fr_step,    
                                 double f_begin, double f_end, double f_step,  
                                 double l_begin, double l_end, double l_step)
{
    double x, p, nkappa;
    int  i, k, j, n, l;
    int max_NNN_R_BEAM;
 
    max_NNN_R_BEAM = (int) floor ( ( l_end - ( - l_end) ) / l_step)+2;
    T_complex ** R_BEAM;
    R_BEAM = (T_complex **)malloc(max_NNN_R_BEAM * sizeof(T_complex*));
    for(int i=0; i < max_NNN_R_BEAM; i=i++){
    R_BEAM[i] = (T_complex*)malloc(max_NNN_R_BEAM*sizeof(T_complex));
    }
    i = 0;
    n = 0;
    for (nkappa = l_begin; nkappa < l_end; nkappa = nkappa + l_step )
    {
        k=0;
        for (x = f_begin; x < f_end; x = x + f_step)
        {
            R_BEAM[i][k].re = 0;
            R_BEAM[i][k].im = 0;
            j=0;
            l=0;
            for ( p = fr_begin; p < fr_end; p = p + fr_step)
            {
                R_BEAM[i][k].im += (fr[l].re*R[n][j].im * cos ( p * x ) + fr[l].im*R[n][j].re * cos ( p * x ) + fr[l].re*R[n][j].re * sin ( p * x ) - fr[l].im*R[n][j].im * sin ( p * x ))* fr_step/(dsqrt_2_pi);
                R_BEAM[i][k].re += (fr[l].re*R[n][j].re * cos ( p * x ) - fr[l].im*R[n][j].im * cos ( p * x ) - fr[l].re*R[n][j].im * sin ( p * x ) - fr[l].im*R[n][j].re * sin ( p * x ))* fr_step/(dsqrt_2_pi);
                j += 1; 
                l += 1;
            }
            k += 1;
        }
        n += 1;
        i += 1;
    }
    return ( R_BEAM );
}
Функцию R[l][w] не привожу так как там все работает. Но функция представленная выше, реализует как раз Beam[i[k]+=fr[w]*R[l][w]*cos(t*w) не работает: то выход за пределы цикла, то еще чего. Не могу понять в чем дело.
Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2012, 22:14     Вложенные циклы
Посмотрите здесь:

C++ вложенные циклы
Вложенные циклы C++
Вложенные циклы C++
C++ Вложенные циклы
Вложенные циклы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
18.09.2012, 22:44     Вложенные циклы #2
Разбей это полотнище на 4-5 функций поменьше. Может быть, тогда станет понятнее. Добрый совет, ничего личного.
serejkus
46 / 44 / 4
Регистрация: 31.10.2011
Сообщений: 98
19.09.2012, 00:26     Вложенные циклы #3
Присоединяюсь к совету про разбиение на меньшие, логически связанные функции.
Ну и отладчик - лучший помошник в таком случае.
iVeage
0 / 0 / 0
Регистрация: 27.05.2012
Сообщений: 9
19.09.2012, 00:38  [ТС]     Вложенные циклы #4
С моим опытом в C++, не получится! Условие задачи найти значения для каждой l - поэтому я реализовал расчет таким способом. А есть ли методы, которые позволяют сохранить алгоритм, при этом разбить расчет на части?
serejkus
46 / 44 / 4
Регистрация: 31.10.2011
Сообщений: 98
19.09.2012, 00:55     Вложенные циклы #5
Цитата Сообщение от iVeage Посмотреть сообщение
С моим опытом в C++, не получится! Условие задачи найти значения для каждой l - поэтому я реализовал расчет таким способом. А есть ли методы, которые позволяют сохранить алгоритм, при этом разбить расчет на части?
Не уверен, что понял вопрос, но метод предельно прост - вместо одной здоровенной функции пишете несколько маленьких, которые в бывшей здоровенной функции вызываете.
Попробуйте на русском языке рассказать, что должна делать функция - это ее результат и побочные эффекты. Расскажите, как она должна это делать - это те самые маленькие функции.
Например, у вас в начале идёт инициализация переменных, выделение памяти. Внутри цикла вы вычисляете комплексное число по какой-то формуле - это все отличные кандидаты на вынос в отдельные функции. В итоге функция calc_reflected_beam станет вполне читаемой (примерно как англицйский текст, и вам же станет легче разобраться.
iVeage
0 / 0 / 0
Регистрация: 27.05.2012
Сообщений: 9
19.09.2012, 01:17  [ТС]     Вложенные циклы #6
Я понял, что необходимо разбить, мне не понятно как. Я исходил из математического смысла, а именно:
два внутренних цикла - это, по сути, интегрирование. Внешний, же, выполняет интегрирование для каждой l.
Алгоритм:
1. внутренний цикл по p - идет пересчет раннее вычисленных значений функций (неупомянутых здесь) для каждого x;
2. цикл по x - здесь идет суммирование и запись в массив по х;
3. цикл по l - пересчет по i и n и запись в массив по i.
Короче, говоря я не представляю как разбить циклы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2012, 09:51     Вложенные циклы
Еще ссылки по теме:

C++ Вложенные циклы
Вложенные циклы for C++
Вложенные циклы C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
serejkus
46 / 44 / 4
Регистрация: 31.10.2011
Сообщений: 98
19.09.2012, 09:51     Вложенные циклы #7
Может, return должен быть после цикла?
Yandex
Объявления
19.09.2012, 09:51     Вложенные циклы
Ответ Создать тему
Опции темы

Текущее время: 15:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru