Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Стёк, Переполнен 
:(
    Опции темы
Crut
  Дата 9.12.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 27.11.2007
Где: Воронеж

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



Каким образом можно расширить пространство стёка? Вот: я написал игру типа "кто хочет стать миллионером", но толтько там надо угадать мелодию. Вопросов 20; Когда я перехожу на 19 вопрос, то выходит ошибка, что стёк перепонен. Ес чо компиллтор указывает на ту функцию, которая узнаёт случайное чило до 20 и проверяет, было ли оно. Вот она:
Код

int TForm1::rand_play(void) //функция возвращает номер звучащей мелодии
{
  int num;
  num = random(20);   
  if(num == 0) num = 1;
  if(wass[num] == false){ // was - массив из bool, которых хранить бывшие номера мелодий
     play_num(num); // то-же моя функция, которая воспроизводит мелодию по её номеру
      TStringList *p=new TStringList();
     p->LoadFromFile("numbering.t"); // файл, в котором назодятся названия мелодий
     sndName = p->Strings[num]; /* sndName - Переменная String, которая хранить веное название мелодии*/
     delete p;
     wass[num] = true; // указание, что было
     return num;
  }
  else{
    return rand_play(); //если было, повторить 
  }
}

Заранее благодарен...
PM MAIL   Вверх
MAKCim
Дата 9.12.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



замени рекурсию циклом
Код

int TForm1::rand_play(void) //функция возвращает номер звучащей мелодии
{
  int num;
  while (true) {
    num = random(20);   
    if(num == 0) num = 1;
    if(wass[num] == false){ // was - массив из bool, которых хранить бывшие номера мелодий
       play_num(num); // то-же моя функция, которая воспроизводит мелодию по её номеру
       TStringList *p=new TStringList();
       p->LoadFromFile("numbering.t"); // файл, в котором назодятся названия мелодий
       sndName = p->Strings[num]; /* sndName - Переменная String, которая хранить веное название мелодии*/
       delete p;
       wass[num] = true; // указание, что было
       return num;
    }
    else{
       if (!check_count()) // check_count проверяет, есть ли в wass элементы со значением false
         return -1; // нет мелодий
      continue;
    }
  }
}


Добавлено @ 12:42
 smile 
и не стёк, а стек  smile

Добавлено @ 12:43
кроме того, у тебя нет проверки на то, что все wass[i] равны true

Это сообщение отредактировал(а) MAKCim - 9.12.2007, 12:46


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Crut
Дата 9.12.2007, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 27.11.2007
Где: Воронеж

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



Я нашёл, где можно увеличьть размер стёка, увеличил. А она теперь Access Ovulation выдаёт и показывает на файл быблиотеки stdlib.h, точнее на функцию random. Ничё не пойму...
PM MAIL   Вверх
MAKCim
Дата 9.12.2007, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Crut, 
ты посты читаешь?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Crut
Дата 9.12.2007, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 27.11.2007
Где: Воронеж

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



Проверка на все was в данном случае не нужна! bool was[20] - это обьявление той переменной. При нажатии кнопки-варианта, она считает номер и если он больше 20, то вызавает функцию конца игры. А та в свою очередь все was приводит к false...

Добавлено через 1 минуту и 25 секунд
Хотя попробую, всё равно - спасибо!
PM MAIL   Вверх
MAKCim
Дата 9.12.2007, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(Crut @  9.12.2007,  12:54 Найти цитируемый пост)
Проверка на все was в данном случае не нужна! bool was[20] - это обьявление той переменной

нужна
иначе в твоем коде возможна бесконечная рекурсия, что и ведет к переполнению стека


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Crut
  Дата 9.12.2007, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 27.11.2007
Где: Воронеж

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



Сделал всё как ты сказал... Теперь ошибок не выдаёт, но после 19 зависает... smile

Добавлено @ 13:19
Я неменого изменил случайный выбор:
Код

int TForm1::rand_play(void) //функция возвращает номер звучащей мелодии
{
  int num;
  while (true) {    
    num = random(20);    
    if(num == 0) num = 1;    
    if(wass[num] == false){ // was - массив из bool, которых хранить бывшие номера мелодий
       play_num(num); // то-же моя функция, которая воспроизводит мелодию по её номеру    
       TStringList *p=new TStringList();
       p->LoadFromFile("numbering.t"); // файл, в котором назодятся названия мелодий
       sndName = p->Strings[num]; /* sndName - Переменная String, которая хранить веное название мелодии*/
       delete p;
       wass[num] = true; // указание, что было
       return num;
    }
    else{
       if (!check_count()) // check_count проверяет, есть ли в wass элементы со значением false
         over(); // завершение игры
      continue;
    }
  }
}


Вот так я написал check_count:
Код

bool TForm1::check_count(void)
{
int t;
 for(int a=1; a <= 20; a++){
     if (wass[a] == true) t++;
 }
 return t;
}

А вот код кнопки - варианта:
Код

void __fastcall TForm1::b1Click(TObject *Sender)
{
if (b1->Caption == sndName) {ok++;}
else {no++;}
int a = rand_play();
get_comments(a); //постройка возможных вариантов
}


Это сообщение отредактировал(а) Crut - 9.12.2007, 13:22
PM MAIL   Вверх
MAKCim
Дата 9.12.2007, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Код

bool TForm1::check_count(void)
{
 for(int a=1; a <= 20; a++){
     if (!wass[a]) 
        return true;
 }
 return false;
}


Добавлено через 3 минуты и 33 секунды
почему у тебя wass определен как bool[20], а индексы начинаются с 1?
надо с нуля


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Crut
Дата 9.12.2007, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 27.11.2007
Где: Воронеж

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



потому-что не нравиться мне писать с нуля.. А wass bool - я не понаял, почему нет???
PM MAIL   Вверх
MAKCim
Дата 9.12.2007, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(Crut @  9.12.2007,  14:00 Найти цитируемый пост)
потому-что не нравиться мне писать с нуля.. А wass bool - я не понаял, почему нет??? 

в С/С++ индексы в массиве начинаются с нуля
если ты определил wass как bool wass[20], то последний элемент будет иметь индекс 19, а не 20
у тебя же в check_count а пробегает значения от 1 до 20 включительно, т. е выходит за границу массива
Код

int TForm1::rand_play(void) //функция возвращает номер звучащей мелодии
{
  int num;
  while (true) {    
    num = random() % 20;       
    if(wass[num] == false){ // was - массив из bool, которых хранить бывшие номера мелодий
       play_num(num); // то-же моя функция, которая воспроизводит мелодию по её номеру    
       TStringList *p=new TStringList();
       p->LoadFromFile("numbering.t"); // файл, в котором назодятся названия мелодий
       sndName = p->Strings[num]; /* sndName - Переменная String, которая хранить веное название мелодии*/
       delete p;
       wass[num] = true; // указание, что было
       return num;
    }
    else{
       if (!check_count()) // check_count проверяет, есть ли в wass элементы со значением false
         over(); // завершение игры
      continue;
    }
  }
}

Код

bool TForm1::check_count(void)
{
 for(int a=0; a < 20; a++){
     if (!wass[a]) 
        return true;
 }
 return false;
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Crut
Дата 9.12.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 27.11.2007
Где: Воронеж

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



Ах Да! Яже и забыл, что в массиве n - 1.  А к стати --a это просто сколько будет если a--, с учётом, что а не изменяется или при использовании такого в функции позвращается не а, а а--?
PM MAIL   Вверх
MAKCim
Дата 9.12.2007, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Crut, 
ты сам понял, что сказал?
я нет


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Crut
  Дата 9.12.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 27.11.2007
Где: Воронеж

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



--a что возвращается? И что будет с а?
PM MAIL   Вверх
ksili
Дата 10.12.2007, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Цитата(Crut @  9.12.2007,  18:30 Найти цитируемый пост)
--a что возвращается? И что будет с а? 

1) Ничто никуда не возвращается, т.к. здесь нету return'а!
2) a уменьшится на единицу


Цитата(Crut @  9.12.2007,  18:16 Найти цитируемый пост)
А к стати --a это просто сколько будет если a--, с учётом, что а не изменяется или при использовании такого в функции позвращается не а, а а--?

Цитата(MAKCim @  9.12.2007,  18:25 Найти цитируемый пост)
ты сам понял, что сказал?

Бу-го-га-га-га-га!


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Crut
Дата 10.12.2007, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 27.11.2007
Где: Воронеж

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



Вопрос с а возник по причине того, что в разных книгах   оператор -- выполняет функции по разному...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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