Форум программистов, компьютерный форум CyberForum.ru

Массив и вектор - C++

Восстановить пароль Регистрация
 
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 322
16.05.2014, 15:46     Массив и вектор #1
Не могу понят почему не работает данный код. Точнее оно работало правильно. Но перестал работать. Ввел малозначительные изменение перестал работать. Убрал все изменение не работает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <conio.h>
#include <vector>
using std::vector;
int main()
{
    setlocale (LC_ALL, "Russian");
    vector<int> num;
    std::cout << " Введите несколько чисел : "  <<std::endl;
    int a;
    char s;
    while (std::cin >> a)
     {   num.push_back(a);
    if(std::cin.get() == '\n')
    {
    int *ar = new int [num.size()];
     for(vector<int>::iterator iter = num.begin(); iter != num.end(); iter++)
     {for(int *q = ar; q != ar + num.size(); q++)
     *ar = *iter;
     std::cout << "Символ массива " << *ar << std::endl;}
     delete [] ar;}
    }
        _getch();
            return 0;
    }
При введение цифр и нажатие энтер выводил след сообщение:
Символ массива ...
Но теперь тот же самый код не чего не делает после нажатие энтер.

Добавлено через 5 минут
В другой теме по другому вопросу посоветовали использовать

C++
1
2
3
....
cin.clear();
while(cin.get() != '\n')
Я не знаю как использовать эту функцию копировать и вставит не получается, не работает код.
А в данной программе оно отменяет инициализацию массива. Не знаю почему но при введение данного кода выдает ошибку типа *ar не инициализирован.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
RamonN
 Аватар для RamonN
32 / 32 / 11
Регистрация: 13.07.2011
Сообщений: 136
16.05.2014, 15:50     Массив и вектор #2
Проверил на Visual Sudio - все работает. Попробуйте перезапустить проект
И еще, зачем еще один цикл вот здесь:
C++
1
2
3
4
5
     for(vector<int>::iterator iter = num.begin(); iter != num.end(); iter++)
    {for(int *q = ar; q != ar + num.size(); q++)
     *ar = *iter;
     std::cout << "Символ массива " << *ar << std::endl;}
     delete [] ar;}
Можно сделать проще:
C++
1
2
 for(vector<int>::iterator iter = num.begin(); iter != num.end(); iter++)
     std::cout << "Символ массива " << *iter << std::endl;
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 322
16.05.2014, 16:01  [ТС]     Массив и вектор #3
Воторой цикл копирует элементы вектора в массив. По крайней мере я так думаю.

1 цикл читает элементы вектора, второй цикл копирует элементы вектора в массив.

Добавлено через 2 минуты
Я как бы там ввел динамический, пустой массив. С размером вектора.
C++
1
int *ar = new int [num.size()];
Добавлено через 1 минуту
RamonN, перезапустил проект несколько раз. Не работает. Пользуюсь VS 2012
RamonN
 Аватар для RamonN
32 / 32 / 11
Регистрация: 13.07.2011
Сообщений: 136
16.05.2014, 16:02     Массив и вектор #4
Altair42, А для чего? в него просто копируются значения вектора и выводятся в поток. Ненужная операция, заменяемая одной строчкой
C++
1
std::cout << *iter << std::endl;
Попробуйте пройтись отладчиком и посмотрите, где у вас программа зависает.
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 322
16.05.2014, 16:40  [ТС]     Массив и вектор #5
RamonN, я знаю что не нужная. Цель использовать знание а не написать просто набор символов. Копирование с вектора на макрос может понадобится в реальной программе. Это задача с книги. Я не программирую я только учусь. И такие супер тупые коды один из способов использовать знание.

Добавлено через 11 минут
RamonN,
Цитата Сообщение от RamonN Посмотреть сообщение
Попробуйте пройтись отладчиком и посмотрите, где у вас программа зависает.
Все я нашел проблему. Я не знаю как вы проверили и как у вас заработало, но код не должен был работать. Символ '\n' не был объявлен.

Правильный код
C++
1
2
3
4
5
6
....int a;
    char s='\n';
    while (std::cin >> a)
     {   num.push_back(a);
    if(std::cin.get() == '\n')
    {.....
Но возникает вопрос. Почему не выдал ошибку про не объявленную переменную, при запуске программы.
Aloir
 Аватар для Aloir
216 / 216 / 13
Регистрация: 17.12.2010
Сообщений: 688
16.05.2014, 16:45     Массив и вектор #6
Altair42, может на не инициализированную?
на них выдаются предупреждения
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 322
16.05.2014, 16:55  [ТС]     Массив и вектор #7
Aloir, спасибо что заметили Но я думал что '\n' в первом коде не объявлен.

Обычно при таком коде программа ругается что b использован без инициализации.
C++
1
2
3
int a;
char b;
while(cin >> a, a != b)
При таком коде ругается компилятор что с не объявлен.
C++
1
2
3
int a;
char b;
while(cin >> a, a != с)
Но почему то на не объявленный, не инициализированный символ новой строки не кто не ругается. И этот символ не работает без объявление.
RamonN
 Аватар для RamonN
32 / 32 / 11
Регистрация: 13.07.2011
Сообщений: 136
16.05.2014, 18:26     Массив и вектор #8
Цитата Сообщение от Altair42 Посмотреть сообщение
RamonN, я знаю что не нужная. Цель использовать знание а не написать просто набор символов. Копирование с вектора на макрос может понадобится в реальной программе. Это задача с книги. Я не программирую я только учусь. И такие супер тупые коды один из способов использовать знание.

Добавлено через 11 минут
RamonN,
Все я нашел проблему. Я не знаю как вы проверили и как у вас заработало, но код не должен был работать. Символ '\n' не был объявлен.

Правильный код
C++
1
2
3
4
5
6
....int a;
    char s='\n';
    while (std::cin >> a)
     {   num.push_back(a);
    if(std::cin.get() == '\n')
    {.....
Но возникает вопрос. Почему не выдал ошибку про не объявленную переменную, при запуске программы.
А он и не должен ругаться, вы переменную s нигде не используете далее, так что ошибка не обоснована. Переменная может быть не инициализирована сколько угодно, пока вы не начнете ее использовать. Символ '\n' не надо нигде инициализировать, это один из управляющих символов, заранее определенных в системе.
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 322
16.05.2014, 18:36  [ТС]     Массив и вектор #9
RamonN, я не про s а про '\n'. Которого раньше не объявил. Если использовать любой символ без объявление компилятор будет ругаться. Но символ новой строки можно использовать сколько угодно без объявление. Компилятор не будет ругаться но программа не будет работать. Как в моем случае. Я там использовал символ новой строки без объявление программа не работало. Объявил символ новой строки программа стало работать. Вот и возник вопрос, почему компилятор не стал ругаться на не объявленный символ?
RamonN
 Аватар для RamonN
32 / 32 / 11
Регистрация: 13.07.2011
Сообщений: 136
16.05.2014, 18:42     Массив и вектор #10
Altair42, Потому что символ '\n' не нужно нигде объявлять, это управляющий символ, заранее объявленный в системе.
Почему же тогда у меня программа работает без нареканий, значит ошибка явно не в этом.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2014, 09:31     Массив и вектор
Еще ссылки по теме:

Двумерный массив через вектор C++
массив bool и вектор) C++
C++ Закрутить массив в вектор

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 322
17.05.2014, 09:31  [ТС]     Массив и вектор #11
RamonN, не знаю как объяснить. Пока не объявлял символ новой строки программа не видел его.
Yandex
Объявления
17.05.2014, 09:31     Массив и вектор
Ответ Создать тему
Опции темы

Текущее время: 20:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru