Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Стёк


Автор: Crut 9.12.2007, 12:31
Каким образом можно расширить пространство стёка? Вот: я написал игру типа "кто хочет стать миллионером", но толтько там надо угадать мелодию. Вопросов 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(); //если было, повторить 
  }
}

Заранее благодарен...

Автор: MAKCim 9.12.2007, 12:41
замени рекурсию циклом
Код

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

Автор: Crut 9.12.2007, 12:51
Я нашёл, где можно увеличьть размер стёка, увеличил. А она теперь Access Ovulation выдаёт и показывает на файл быблиотеки stdlib.h, точнее на функцию random. Ничё не пойму...

Автор: MAKCim 9.12.2007, 12:54
Crut, 
ты посты читаешь?

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

Добавлено через 1 минуту и 25 секунд
Хотя попробую, всё равно - спасибо!

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

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

Автор: Crut 9.12.2007, 13:15
Сделал всё как ты сказал... Теперь ошибок не выдаёт, но после 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); //постройка возможных вариантов
}

Автор: MAKCim 9.12.2007, 13:50
Код

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?
надо с нуля

Автор: Crut 9.12.2007, 14:00
потому-что не нравиться мне писать с нуля.. А wass bool - я не понаял, почему нет???

Автор: MAKCim 9.12.2007, 14:04
Цитата(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;
}

Автор: Crut 9.12.2007, 14:16
Ах Да! Яже и забыл, что в массиве n - 1.  А к стати --a это просто сколько будет если a--, с учётом, что а не изменяется или при использовании такого в функции позвращается не а, а а--?

Автор: MAKCim 9.12.2007, 14:25
Crut, 
ты сам понял, что сказал?
я нет

Автор: Crut 9.12.2007, 14:30
--a что возвращается? И что будет с а?

Автор: ksili 10.12.2007, 06:08
Цитата(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 Найти цитируемый пост)
ты сам понял, что сказал?

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

Автор: Crut 10.12.2007, 13:35
Вопрос с а возник по причине того, что в разных книгах   оператор -- выполняет функции по разному...

Автор: ksili 10.12.2007, 13:45
Цитата(Crut @  10.12.2007,  17:35 Найти цитируемый пост)
в разных книгах   оператор -- выполняет функции по разному... 

сумневаюсь... 
а книги по одному языку программирования были?

Автор: Lazin 11.12.2007, 08:58
Цитата(Crut @  9.12.2007,  12:51 Найти цитируемый пост)
Access Ovulation

это как?  smile 

Автор: dumb 11.12.2007, 10:44
Lazin, а ты как думал?! - нужный доступ рождается в муках! smile

Автор: Crut 11.12.2007, 14:41
сумневаюсь... 
а книги по одному языку программирования были? - Да!
Но увы по чистому с++...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)