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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Kiyoshi
0 / 0 / 0
Регистрация: 04.11.2013
Сообщений: 6
#1

Динамическое выделение памяти new - C++

04.11.2013, 14:01. Просмотров 466. Ответов 10
Метки нет (Все метки)

Доброго времени всем
Недавно начал вникать в прелести c++, однако встретился с неприступной холодностью его и непониманием моих желаний, а так же отсутствием эмпатии и телепатических способностей, что и привело меня на этот форум.
http://cs419530.vk.me/v419530398/9dfe/r2pcPSY2Sog.jpg
Задания 5,6 и 7 я выполнил.
Проблемы возникли с 8 и 9.
В 8 не даёт ввести название компании.
код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
using namespace std;
 
struct pizza{
    string name_compani;
    double diametr;
    double ves;
};
 
int main()
{
    pizza * one = new pizza;
    cout << "Diametr: ";
    cin >> (*one).diametr;
    cout << "Name_compani: ";
    getline(cin, one->name_compani);
    cout << "Ves: ";
    cin >> one->ves;
    cout << "Name_compani: " << one->name_compani << ", diametr: " << one->diametr << ", ves: " << one->ves;
    return 0;
}
вывод:
Diametr: 12.1
Name_compani: Ves: 3
Name_compani: , diametr: 12.1, ves: 3
В 7 не получается инициализировать динамический массив.
код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
include <iostream>
#include <string>
#include <cstring>
struct CandyBar {
    std::string name;
    double ves;
    int kall;
};
 
int main(void)
{
    using namespace std;
    CandyBar * snack = new CandyBar [3];                
    snack = {{"Mocha Munch", 2.3, 350}, {"Name2", 4.3, 470}, {"Name3", 1.7, 390}};
         cout << "Name: " << snack[0].name << ", ves: " << snack[0].ves << ", kall: " << snack[0].kall << endl;
        cout << "Name: " << snack[1].name << ", ves: " << snack[1].ves << ", kall: " << snack[1].kall << endl;
        cout << "Name: " << snack[2].name << ", ves: " << snack[2].ves << ", kall: " << snack[2].kall << endl; 
    return 0;
}
geany сообщает:
g++ -Wall -o "myfirst0" "myfirst0.cpp" (в каталоге: /home/ego/Рабочий стол)
myfirst0.cpp: В функции «int main()»:
myfirst0.cpp:46:78: предупреждение: extended initializer lists only available with -std=c++11 or -std=gnu++11 [по умолчанию включена]
myfirst0.cpp:46:78: ошибка: cannot convert «<brace-enclosed initializer list>» to «CandyBar*» in assignment
Сборка завершилась с ошибкой.
---------------
Также меня волнует невозможность создавать массивы array
Использую g++, geany, ubuntu
что ещё нужно?
---------------
p.s. я тут впервые, здесь не предусмотрено темы для совсем лёгких вопросов, как мои?
создавать каждый раз тему под такое не моветон ли?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2013, 14:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамическое выделение памяти new (C++):

Распределение памяти. Динамическое выделение памяти - C++
an-1 an-2 ... a2

Динамическое выделение памяти - C++
Есть следующее объявление #include&lt;iostream&gt; #define MAX 1000 //======================= int arr; int arr2; int arr3; ...

Динамическое выделение памяти - C++
Здравствуйте! Помогите пожалуйста, мне задали сделать чтобы в выделенном (выделить не удалось, оставил теги B, там где идёт &quot;объявляем и...

Динамическое выделение памяти - C++
Использовать динамическое выделение памяти для программы : #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include...

Динамическое выделение памяти - C++
У меня есть двумерный булевый квадратный массив. После запуска программы, я получаю переменную size, это то, сколько элементов должно быть...

Динамическое выделение памяти - C++
Уважаемые программисты!!!! Подскажите как выделить память для двумерного массива. Заранее спасибо!!!

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
04.11.2013, 14:10 #2
C++
1
getline(cin, one->name_compani);
А так не пробывали
C++
1
 cin >> (*one).name_compani;
0
Kiyoshi
0 / 0 / 0
Регистрация: 04.11.2013
Сообщений: 6
04.11.2013, 14:14  [ТС] #3
Цитата Сообщение от egor2116 Посмотреть сообщение
А так не пробывали
C++
1
 cin >> (*one).name_compani;
Так более одного слова не воспринимает, увы.
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
04.11.2013, 14:28 #4
Просто оператор >> и функция getline не очень предназначены для того, чтобы их смешивали. Обычно стоит выбрать что-то одно.
Оператор >> оставляет в потоке перевод строки, который считывается последующим getline().
Поставьте непосредственно перед getlline() вызов cin.get().
0
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
04.11.2013, 14:32 #5
Так более одного слова не воспринимает, увы.
Попробуйте так
C++
1
2
3
4
5
6
7
8
pizza * one = new pizza;
    cout << "Diametr: ";
    cin >> (*one).diametr; cin.get();
    cout << "Name_compani: ";
    getline(cin,(*one).name_compani); 
    cout << "Ves: ";
    cin >> one->ves; cin.get();
    cout << "Name_compani: " << one->name_compani << ", diametr: " << one->diametr << ", ves: " << one->ves;
Если помогло то проблема было во входном потоке остовался завершающий символ строки '\0' и его нужно было дополнительно считать ну или как то так.
0
Kiyoshi
0 / 0 / 0
Регистрация: 04.11.2013
Сообщений: 6
04.11.2013, 14:35  [ТС] #6
Цитата Сообщение от grizlik78 Посмотреть сообщение
Просто оператор >> и функция getline не очень предназначены для того, чтобы их смешивали. Обычно стоит выбрать что-то одно.
Оператор >> оставляет в потоке перевод строки, который считывается последующим getline().
Поставьте непосредственно перед getlline() вызов cin.get().
Теперь ves не спрашивает =(
вывод:
Diametr: 12.3 // я ввел
Name_compani: nameone nametwo // я ввел
Ves: Name_compani: nameone, diametr: 12.3, ves: 0 // выдало
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
04.11.2013, 14:35 #7
Ну а по поводу динамического выделения — инициализировать можно лишь в момент выделения, а не после.
C++
1
CandyBar * snack = new CandyBar [3]{{"Mocha Munch", 2.3, 350}, {"Name2", 4.3, 470}, {"Name3", 1.7, 390}};
0
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
04.11.2013, 14:38 #8
А по поводу этого
В 7 не получается инициализировать динамический массив.
если я не ошибаюсь, списковая инициализация была введена только в стандарте с++11, а у вас старый с++98

предлагаю как то так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 CandyBar1 * snack = new CandyBar1[3];  
             
for(int i=0;i>3;++i)
{
    cout << "NAME: "; cin >> snack[i].name; cout << endl;
    cout << "VES: "; cin >> snack[i].ves; cout << endl;
    cout << "KALL: "; cin >> snack[i].kall; cout << endl;
}
 
for(int i=0;i>3;++i)
{
    cout << "NAME: " << snack[i].name << endl;
    cout << "VES: " << snack[i].ves << endl;
    cout << "KALL: " << snack[i].kall << endl;
}
1
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
04.11.2013, 14:40 #9
Цитата Сообщение от Kiyoshi Посмотреть сообщение
Теперь ves не спрашивает =(
А там точно getline() остался? Или на >> изменилось? С getline() и get() перед ним всё должно работать.
0
Kiyoshi
0 / 0 / 0
Регистрация: 04.11.2013
Сообщений: 6
04.11.2013, 14:50  [ТС] #10
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну а по поводу динамического выделения — инициализировать можно лишь в момент выделения, а не после.
C++
1
CandyBar * snack = new CandyBar [3]{{"Mocha Munch", 2.3, 350}, {"Name2", 4.3, 470}, {"Name3", 1.7, 390}};
Собралось. работает
но.. что означает эта строка:
myfirst0.cpp:45:36: предупреждение: extended initializer lists only available with -std=c++11 or -std=gnu++11 [по умолчанию включена]
Цитата Сообщение от grizlik78 Посмотреть сообщение
А там точно getline() остался? Или на >> изменилось? С getline() и get() перед ним всё должно работать.
С getline() заработало, благодарю ^_^
---------------------------
Цитата Сообщение от egor2116 Посмотреть сообщение
если я не ошибаюсь, списковая инициализация была введена только в стандарте с++11, а у вас старый с++98
У меня c++11 по идее. Фор только в следующей главе, которую я как раз и собираюсь начать.
Но все равно спасибо
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
04.11.2013, 14:52 #11
Цитата Сообщение от Kiyoshi Посмотреть сообщение
но.. что означает эта строка:
Ну оно и значит, что компилятор видит код C++11 и предупреждает об этом. Стоит явно добавить в ключи компиляции -std=c++11 или -std=gnu++11
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2013, 14:52
Привет! Вот еще темы с ответами:

Динамическое выделение памяти - C++
Подскажите как выделить динамически память мод двумерный массив... Спасибо. ... int *mass = new int ; //int *mass = new int ; ) Не...

Динамическое выделение памяти - C++
Всем здрасти.Если выделять динамически память,например: char *p=new char; и при этом не перегружать оператор new.То верны ли следующие...

Динамическое выделение памяти! - C++
Программа должна читать с клавы число и имя(до 15 символов). Данные должны вводится в одной функции а выводится во второй. Сохранять данные...

Динамическое выделение памяти - C++
Имеется: #define Index 1000 typedef int BaseType; typedef BaseType TMemList; typedef unsigned ptrel; typedef struct List...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.11.2013, 14:52
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru