Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка Переполнения стека, При компиляции ошибка 'Stack Overflow' 
V
    Опции темы
BlowUp
Дата 15.2.2010, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 17.6.2009

Репутация: нет
Всего: нет



Пытаюсь написать программу реализующую фрактал по алгоритму "Игра Хаос" на Builder 6.0(к сути дела это,конечно , отношения не имеет). Не имея особых навыков программирования, я написал следующий код:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ......................//здесь я задал все используемые символы 



  /* Задаём заравочную точку внутри n-гольника*/
    srand(time(NULL));
    fR=(rand()%720)*(2*pi/720); //Полярный угол затравочной точки
    Rn=F(fR,R0,pi,n);           //Р-в т. n-угольника c таким же f
    RR=(rand()%1000000)*(Rn/1000000); // радиус-в. затравочной б. rand дробной частью
                                     //от радиус-в т. n-угол-ка с таким же f

    xR=RR*cos(fR);yR=RR*sin(fR);//Затравочная т. в прямоугольной СК

    int i=0;int j=0;
    while (i<=1100)
    {
       /* Задаём случайную вершину n-гольника*/
       srand(time(NULL));
       m=rand()%n;   //№ вершины
       fN=2*pi*((n-m)/n);//Её полярный угол
       //R0 - её радиус
       xN=R0*cos(fN);yN=R0*sin(fN);//Вершина в прямоугольной СК

       /* Найдем новую точку*/
       xnew=(xR+L*xN)/(1+L);ynew=(yR+L*yN)/(1+L); //Координаты
       Rnew=sqrt(xnew*xnew+ynew*ynew); //Радиус-вектор
       xR=xnew;yR=ynew;RR=Rnew; //новая т. становится исходной
       

            if(i>a)
            {
            U[j][j]=xR,yR; //Координаты точки в массив
                 
            j++;
            }
            else
            j=0;
       i++;
     }

}

 


Скомпилировать мне удаётся. А когда выполнить, ввожу необходимые параметры и нажимаю кнопку, описанную выше появляется ошибка: Project raised exception class EStackOverflow with message 'Stack overflow'. Как будто Циклы бесконечные. Может быть кто подскажет в каком направлении поиска мне двигаться??


Это сообщение отредактировал(а) BlowUp - 15.2.2010, 19:22
PM MAIL   Вверх
Albor
Дата 15.2.2010, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Убери из цикла srand(time(NULL));. Эта ф-ция должна вызываться один раз (можно при инициализации приложения). Может это не причина, но всё-же. Функция F не рекурсивная?

Это сообщение отредактировал(а) Albor - 15.2.2010, 14:17
PM MAIL ICQ   Вверх
BlowUp
Дата 15.2.2010, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 17.6.2009

Репутация: нет
Всего: нет



Поставил srand(time(NULL)); перед самым циклом ,к сожалению , ничего не изменилось. Сказать рекурсивная функция или нет не могу, я это пока не сильно понимаю(( .  Но определяю я её следующим образом (пытался сделать аналогично учебнику):

Код

float F(float fn,float R0, float pi, int n)
         {
                  
          //Пытаемся взять целую часть от числа
          float k1=(n*fn)/pi;
          int   k2=(int)k1;
          float k=k2/2;
                k=(int)k;

          float Rn=(R0*cos(pi/n)/cos(2*(pi/n)*(k2/2-k-fn+(pi/n)*k)));
          return(Rn);
         }


Также пробовал вместо функции просто вставить её код-определении внутрь программы. 
Результат, пока тот же: "Stack Overflow".
Что ещё может быть не так??


Это сообщение отредактировал(а) BlowUp - 15.2.2010, 19:20
PM MAIL   Вверх
bsa
Дата 15.2.2010, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата
U[j][j]=xR,yR
1. Ты уверен, что должно быть U[j][j]?
2. Почитай про оператор "запятая", думаю, ты не этого ожидал.
3. Ты уверен, что управление доходит до указанного тобой кода? У меня есть подозрение, что вылет происходит в момент определения массива U. Не забывай, есть ограничения на размер автоматических переменных (тех, для которых не выделяется динамическая память с использованием malloc или new)
PM   Вверх
BlowUp
Дата 16.2.2010, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 17.6.2009

Репутация: нет
Всего: нет



Спасибо за подсказки. Особенно за "запятую". Вместо двумерного массива стал использовать два одномерных (в задаче это не принципиально), что в данном случаи избавило от появления ошибки.
PM MAIL   Вверх
bsa
Дата 16.2.2010, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




M
bsa
BlowUp, если ответ на вопрос получен, то пометь тему решенной

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0958 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.