Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ странное поведение элементарной программы..

Автор: compiler 12.06.2008 21:57

Добрый день!
Приступил к изучению c++, ну и начал писать дурацкие программки для понятия основ синтаксиса.. Вот собственно одна из них:

#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;
int main(void){
bool b(true);
string nick;
string name;
while (b==true){
cout << "Введите Ваше имя:\t";
cin >> name;

cout << "Введите Ваш ник:\t";
cin >> nick;

cout << "Вы:\t" << name << " aka " << nick << "\nПравильно?(Y/N)";
char ch('0');
while( (ch!='Y') && (ch!='y') && (ch!='N') && (ch!='n') )
cin >> ch;
b = ((ch=='N') || (ch=='n'));
}
char ch('0');
cout << "Привет!\n" << nick << ", не хочешь ли сыграть?(Y/N)";
while( (ch!='Y') && (ch!='y') && (ch!='N') && (ch!='n') )
cin >> ch;
b = ((ch=='Y') || (ch=='y'));
if (b==true){
cout << "Удачи, " << name << "!\n";
const int number(5); //количество элементов
vector<int> fib(number);//ряд Фиббоначи
fib[0]=1;
fib[1]=1;
for(int i(2); i<=number; ++i)
fib[i]=fib[i-2]+fib[i-1];
srand(number);
unsigned short num_right( 0 );
unsigned short num_wrong( 0 );
while (b==true){
int k(rand() % (number-2) + 2); //номер угадуемого числа
cout << "Первый:" << fib[k-2] << "\tВторой:" << fib[k-1] << "\tТретий:";
int usr_uns; //ответ пользователя
cin >> usr_uns;
if (usr_uns == fib[k]){
cout << "Ура!\n";
++num_right;
}
else{
switch (++num_wrong)
{
case 1: cout << "Не плохо.. Но.."; break;
case 2: cout << "Можно и лучше.."; break;
case 3: cout << "Ну.."; break;
default: cout << "Увы.."; b=false; break;
}
cout << '\n';
}
}
cout << "Ваш счет: " << num_right << '\n';
}
else
{
cout << "Ну.. Как хочешь..\n";
}
cout << "Ok\n";
return 0;
}


Вот.. Но если соглашаться на "игру", то происходит ошибка времени исполнения или утечка памяти или...(?). Лог в атаче(локаль utf-8). Почему так?
компилятор: g++ (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)
ide: eclipse
Заранее благодарен.


Прикрепленные файлы
Прикрепленный файл  log.txt ( 2.65 килобайт ) Кол-во скачиваний: 275

Автор: volvo 12.06.2008 22:56

		for(int i(2); i<=number; ++i)
fib[i]=fib[i-2]+fib[i-1];
blink.gif Ты вектору сколько элементов выделял? 5? Это от 0 до 4, а попытка обращения к 5-му зачем?

Автор: compiler 12.06.2008 23:03

Цитата(volvo @ 12.06.2008 18:56) *
...а попытка обращения к 5-му зачем?
Упс.. Совсем не смотрел туда.. Спасибо!
А почему это проявляется так позно?(как я понимаю, при освобождении вектора)

Автор: volvo 12.06.2008 23:10

Цитата
The most important issue for the caller is whether these operations perform range checking. Only at() performs range checking. If the index is out of range, it throws an out_of_range exception (see Section 3.3). All other functions do not check. A range error results in undefined behavior.
В твоем случае UB выражается в том, что ты видишь (ошибка при освобождении вектора), в другом - может быть что-то другое...

Автор: compiler 12.06.2008 23:15

Цитата(volvo @ 12.06.2008 19:10) *
в другом - может быть что-то другое...
спасибо.. буду знать..