Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2012, 21:36   #1
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию Как выделить память для структуры посредством new?

Всем привет! Есть такая задачка, там нужно выделить память для массива из трех структур, и, собственно, создать этот массив структур. Всю голову сломал, не получается.
Вот мой нерабочий недокод:
Код:
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;

int main()
{
	struct CandyBar {string name; short weight; unsigned calory;};
	CandyBar *psnack = new CandyBar[3];
	CandyBar psnack[3] = 
	{
		{"Nesquik", 360, 200},
		{"Lubyatovo", 500, 170},      
		{"Cosmosatrs", 450, 230}
	};
	cout << psnack[0]->name;
        delete []psnack;

	getch();
	return 0;
}
Как выделяется место для массива структур? Да хотя бы для одной структуры, как? Помогите советом пожалуйста, а то не усну
ПыСы: В гугле путного ответа не узрел.
Suby вне форума Ответить с цитированием
Старый 07.11.2012, 22:15   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как выделяется место для массива структур?
Ты написал сам: CandyBar *psnack = new CandyBar[3];
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.11.2012, 22:30   #3
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ты написал сам: CandyBar *psnack = new CandyBar[3];
Эмм... Да. Значит получается память я правильно выделяю. Тогда вопрос меняю:
Почему не срабатывает код? Если я правильно выделил память, вроде инициализировал структуру далее тоже правильно. Но не работает, пишет вот эти ошибки:
Код:
1>------ Build started: Project: Project36, Configuration: Debug Win32 ------
1>  Source.cpp
1>d:\windows 7 suby\новая папка (6)\visual studio 2012\projects\project36\project36\source.cpp(10): error C2372: 'psnack' : redefinition; different types of indirection
1>          d:\windows 7 suby\новая папка (6)\visual studio 2012\projects\project36\project36\source.cpp(9) : see declaration of 'psnack'
1>d:\windows 7 suby\новая папка (6)\visual studio 2012\projects\project36\project36\source.cpp(16): error C2819: type 'main::CandyBar' does not have an overloaded member 'operator ->'
1>          d:\windows 7 suby\новая папка (6)\visual studio 2012\projects\project36\project36\source.cpp(8) : see declaration of 'main::CandyBar'
1>          did you intend to use '.' instead?
1>d:\windows 7 suby\новая папка (6)\visual studio 2012\projects\project36\project36\source.cpp(16): error C2232: '->main::CandyBar::name' : left operand has 'struct' type, use '.'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Suby вне форума Ответить с цитированием
Старый 07.11.2012, 22:37   #4
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Даже если упростить задание и выделить память не для массива структур, а только для одной структуры:
Код:
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;

int main()
{
	struct CandyBar {string name; short weight; unsigned calory;};
	CandyBar *psnack = new CandyBar;
	psnack = {"Nesquik", 360, 200};
	cout << psnack->name;
	delete psnack;

	getch();
	return 0;
}
То все-равно не работает, ругается на какие-то синтаксические ошибки и на фигурную скобку (перед "Nesquik"), которые здесь вообще ни к какому месту не пришить:
Код:
1>------ Build started: Project: Project36, Configuration: Debug Win32 ------
1>  Source.cpp
1>d:\windows 7 suby\новая папка (6)\visual studio 2012\projects\project36\project36\source.cpp(10): error C2059: syntax error : '{'
1>d:\windows 7 suby\новая папка (6)\visual studio 2012\projects\project36\project36\source.cpp(10): error C2143: syntax error : missing ';' before '{'
1>d:\windows 7 suby\новая папка (6)\visual studio 2012\projects\project36\project36\source.cpp(10): error C2143: syntax error : missing ';' before '}'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Suby вне форума Ответить с цитированием
Старый 07.11.2012, 22:47   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Потому что компилятор не понимает выражения
Код:
psnack = {"Nesquik", 360, 200};
Более того, Ваше счастье, что не понимает. Потому что если бы понял - попытался бы в переменную psnack размером 4 байта запихнуть блок размером 12 байт.
Корректно - так:
Код:
psnack->name = string("Nesquik");
psnack->weight = 360;
psnack->calory = 200;
Abstraction вне форума Ответить с цитированием
Старый 07.11.2012, 22:47   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Suby
Цитата:
psnack = {"Nesquik", 360, 200};
нельзя так делать
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 07.11.2012, 22:52   #7
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Корректно - так:
Код:
psnack->name = string("Nesquik");
psnack->weight = 360;
psnack->calory = 200;
До этого не доходит даже, ошибка проявляется раньше вывода на экран

Цитата:
Сообщение от pproger Посмотреть сообщение
2Suby

нельзя так делать
А как тогда можно? ведь если не выделять память, а просто записать статически:
Код:
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;

int main()
{
	struct CandyBar {string name; short weight; unsigned calory;};
	CandyBar snack = {"Nesquik", 360, 200};
	cout << snack.name;

	getch();
	return 0;
}
... то всё ОК!
Suby вне форума Ответить с цитированием
Старый 07.11.2012, 22:56   #8
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
опытался бы в переменную psnack размером 4 байта запихнуть блок размером 12 байт.
Аааа, кажется начинает доходить... psnack это ведь у нас указатель на 4х байтовый адрес, а инфу я туда засовываю огромную по размеру.

Последний раз редактировалось Suby; 07.11.2012 в 23:04.
Suby вне форума Ответить с цитированием
Старый 07.11.2012, 23:00   #9
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Блин, но ведь с другой стороны, с помощью NEW я выделяю память, достаточную для хранения структуры. Опять непонятка, опять не доходит
Suby вне форума Ответить с цитированием
Старый 07.11.2012, 23:04   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
с помощью NEW я выделяю адрес, достаточный для хранения структуры.
Верно, но обращаясь вот так:
Цитата:
CandyBar *psnack = new CandyBar;
psnack = {"Nesquik", 360, 200};
Ты по факту не в поля структуры помешаешь инфу а в память занятую указателем. Память занятая указателем это не та память что ты запрашиваешь, а всего лишь 4 байта , которые содержат адрес на выделенную тебе посредством new память
Поэтому пример
Код:
psnack->name = string("Nesquik");
psnack->weight = 360;
psnack->calory = 200;
запомни - он обращается именно в ту память, которая выделена под структуру посредством инструкции "->"
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделить память под структуру. ХреновыйПрогер Общие вопросы C/C++ 9 26.12.2010 19:00
Как выделить память 750mb? VintProg Общие вопросы Delphi 10 29.06.2009 20:30
динамически выделить память под верхний треугольник квадратной матрицы juventine Общие вопросы C/C++ 2 12.04.2009 13:06
как выделить память для указателя (pointer), и сюда же, записать : integer, потом через 4 байта, boolean? bigxman Общие вопросы Delphi 1 02.02.2009 21:17
Не могу выделить память для трёхмерного массива Blister Помощь студентам 3 19.12.2007 07:25