Помощь - Поиск - Пользователи - Календарь
Полная версия: странное поведение элементарной программы..
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
compiler
Добрый день!
Приступил к изучению 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
Заранее благодарен.
volvo
		for(int i(2); i<=number; ++i)
fib[i]=fib[i-2]+fib[i-1];
blink.gif Ты вектору сколько элементов выделял? 5? Это от 0 до 4, а попытка обращения к 5-му зачем?
compiler
Цитата(volvo @ 12.06.2008 18:56) *
...а попытка обращения к 5-му зачем?
Упс.. Совсем не смотрел туда.. Спасибо!
А почему это проявляется так позно?(как я понимаю, при освобождении вектора)
volvo
Цитата
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
Цитата(volvo @ 12.06.2008 19:10) *
в другом - может быть что-то другое...
спасибо.. буду знать..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.