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

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

Восстановить пароль Регистрация
 
Kiyoshi
 Аватар для Kiyoshi
0 / 0 / 0
Регистрация: 04.11.2013
Сообщений: 6
04.11.2013, 14:01     динамическое выделение памяти new #1
Доброго времени всем
Недавно начал вникать в прелести 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. я тут впервые, здесь не предусмотрено темы для совсем лёгких вопросов, как мои?
создавать каждый раз тему под такое не моветон ли?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
04.11.2013, 14:10     динамическое выделение памяти new #2
C++
1
getline(cin, one->name_compani);
А так не пробывали
C++
1
 cin >> (*one).name_compani;
Kiyoshi
 Аватар для Kiyoshi
0 / 0 / 0
Регистрация: 04.11.2013
Сообщений: 6
04.11.2013, 14:14  [ТС]     динамическое выделение памяти new #3
Цитата Сообщение от egor2116 Посмотреть сообщение
А так не пробывали
C++
1
 cin >> (*one).name_compani;
Так более одного слова не воспринимает, увы.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
04.11.2013, 14:28     динамическое выделение памяти new #4
Просто оператор >> и функция getline не очень предназначены для того, чтобы их смешивали. Обычно стоит выбрать что-то одно.
Оператор >> оставляет в потоке перевод строки, который считывается последующим getline().
Поставьте непосредственно перед getlline() вызов cin.get().
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
04.11.2013, 14:32     динамическое выделение памяти new #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' и его нужно было дополнительно считать ну или как то так.
Kiyoshi
 Аватар для Kiyoshi
0 / 0 / 0
Регистрация: 04.11.2013
Сообщений: 6
04.11.2013, 14:35  [ТС]     динамическое выделение памяти new #6
Цитата Сообщение от grizlik78 Посмотреть сообщение
Просто оператор >> и функция getline не очень предназначены для того, чтобы их смешивали. Обычно стоит выбрать что-то одно.
Оператор >> оставляет в потоке перевод строки, который считывается последующим getline().
Поставьте непосредственно перед getlline() вызов cin.get().
Теперь ves не спрашивает =(
вывод:
Diametr: 12.3 // я ввел
Name_compani: nameone nametwo // я ввел
Ves: Name_compani: nameone, diametr: 12.3, ves: 0 // выдало
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
04.11.2013, 14:35     динамическое выделение памяти new #7
Ну а по поводу динамического выделения — инициализировать можно лишь в момент выделения, а не после.
C++
1
CandyBar * snack = new CandyBar [3]{{"Mocha Munch", 2.3, 350}, {"Name2", 4.3, 470}, {"Name3", 1.7, 390}};
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
04.11.2013, 14:38     динамическое выделение памяти new #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;
}
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
04.11.2013, 14:40     динамическое выделение памяти new #9
Цитата Сообщение от Kiyoshi Посмотреть сообщение
Теперь ves не спрашивает =(
А там точно getline() остался? Или на >> изменилось? С getline() и get() перед ним всё должно работать.
Kiyoshi
 Аватар для Kiyoshi
0 / 0 / 0
Регистрация: 04.11.2013
Сообщений: 6
04.11.2013, 14:50  [ТС]     динамическое выделение памяти new #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 по идее. Фор только в следующей главе, которую я как раз и собираюсь начать.
Но все равно спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2013, 14:52     динамическое выделение памяти new
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
04.11.2013, 14:52     динамическое выделение памяти new #11
Цитата Сообщение от Kiyoshi Посмотреть сообщение
но.. что означает эта строка:
Ну оно и значит, что компилятор видит код C++11 и предупреждает об этом. Стоит явно добавить в ключи компиляции -std=c++11 или -std=gnu++11
Yandex
Объявления
04.11.2013, 14:52     динамическое выделение памяти new
Ответ Создать тему
Опции темы

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