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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2010, 12:30   #1
Tirendus
Форумчанин
 
Аватар для Tirendus
 
Регистрация: 20.03.2009
Сообщений: 272
По умолчанию массивы структур

Здравствуйте, по учебе поставили задание

Создать структуру ВИДЕОМАГАЗИН со следующими полями:

Название фильма
Режиссер
Жанр
Рейтинг популярности
Цена диска

Реализовать следующие возможности:
Поиск по названию
Поиск по жанру
Поиск по режиссеру
Самый популярный фильм в жанре
Показ всех записей и добавление



Сейчас работаю над той частью, где нужно добавлять записи (по сути, в самом начале), что-то не получается, но что, понять не могу, вот мои наработки.

Код:
#include <iostream>
struct videoShop {
	char fn[100];  // film name
	char pr[100];  // producer
	char gr[100];   // genre
	double popr;   // popularity rating
	double price;  // price
};
void add(videoShop* vs, int& size);

void main()
{
	int size_of_vs = 1, index = 0;
	videoShop* vs = new videoShop;
	add(vs, size_of_vs); //тут все проходит гладко
	add(vs, size_of_vs); // НА ЭТОЙ ОПЕРАЦИИ ПРОГРАММА ВЫЛЕТАЕТ
}

void add(videoShop* vs, int& size)
{
	size++;
	videoShop* temp = new videoShop[size];

	for (int i = 0; i < size-1; i++)
	{
		for (int j = 0; j < 100; j++)
		{
			temp[i].fn[j] = vs[i].fn[j];
			temp[i].pr[j] = vs[i].pr[j];
			temp[i].gr[j] = vs[i].gr[j];
		}

		temp[i].popr = vs[i].popr;
		temp[i].price = vs[i].price;
	}
	
	std::cout << "New film name?\n";
	std::cin.getline(temp[size-1].fn, 100);
	system("cls");
	std::cout << "Producer\'s name?\n";
	std::cin.getline(temp[size-1].pr, 100);
	system("cls");
	std::cout << "Genre?\n";
	std::cin.getline(temp[size-1].gr, 100);
	system("cls");
	std::cout << "Popularity rating?\n";
	std::cin >> temp[size-1].popr;
	system("cls");
	std::cout << "Price?\n";
	std::cin >> temp[size-1].gr;
	system("cls");
	std::cout << "New record added\n";

	delete [] vs;
	vs = temp;
	delete [] temp;
}
я закоментировал место с ошибкой крупным шрифтом.

Буду очень благодарен за любые советы.
Tirendus вне форума Ответить с цитированием
Старый 24.05.2010, 12:39   #2
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
videoShop* vs = new videoShop;
тут ты не создаешь массив. Сделай так:
Код:
videoShop* vs = new videoShop[size_of_vs];
А тут советую
Код:
		for (int j = 0; j < 100; j++)
		{
			temp[i].fn[j] = vs[i].fn[j];
			temp[i].pr[j] = vs[i].pr[j];
			temp[i].gr[j] = vs[i].gr[j];
		}
копировать массив символов с помощью функции strcpy:
Код:
			strcpy(temp[i].fn, vs[i].fn);
			strcpy(temp[i].pr, vs[i].pr);
			strcpy(temp[i].gr, vs[i].gr);

Последний раз редактировалось profi; 24.05.2010 в 12:45.
profi вне форума Ответить с цитированием
Старый 24.05.2010, 13:07   #3
Tirendus
Форумчанин
 
Аватар для Tirendus
 
Регистрация: 20.03.2009
Сообщений: 272
По умолчанию

В функции strcpy используется strlen, мои строки изначально пусты, потому использование strcpy не православно.

Цитата:
тут ты не создаешь массив. Сделай так:
Код:

videoShop* vs = new videoShop[size_of_vs];
сделал, не помогло, есть еще варианты?
Tirendus вне форума Ответить с цитированием
Старый 24.05.2010, 13:10   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

тогда можно memcpy
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.05.2010, 13:21   #5
Tirendus
Форумчанин
 
Аватар для Tirendus
 
Регистрация: 20.03.2009
Сообщений: 272
По умолчанию

Спасибо за совет, а есть какие-то мысли почему не работает программа?
Tirendus вне форума Ответить с цитированием
Старый 24.05.2010, 13:25   #6
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Ты же при выходе из функции вызываешь операторы delete
Код:
	delete [] vs;
	delete [] temp;
которые уничтожают память, а потом снова пытаешь записать в уже не существующий массив данные. Попробуй убрать эти два оператора.
profi вне форума Ответить с цитированием
Старый 24.05.2010, 13:40   #7
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Тебе надо для начала определиться в каком виде мудут храниться данные: в виде списка или массива, если массива, тогда в главной функции
Код:
videoShop* vs = new videoShop[count_vs];
где count_vs максимальное количество элементов массива, после его уже нельзя менять. Если count_vs не изменяется ДО тогда лучше будет вообще объявить так
Код:
videoShop vs[count_vs];
где count_vs константа.
PS. В случае динамического выделения памяти лучше хранить данные в виде списка
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.

Последний раз редактировалось mrChester; 24.05.2010 в 13:43.
mrChester вне форума Ответить с цитированием
Старый 24.05.2010, 14:03   #8
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Код:
add(vs, size_of_vs);
если вы передаете ссылку, то передавайте ссылку, а не копию.
Код:
add(vs, &size_of_vs);
У вас не изменяется размер структуры, хотя должен. Следовательно вы присваиваете данные в непредназначенные для этого места.
MaTBeu вне форума Ответить с цитированием
Старый 24.05.2010, 14:34   #9
Tirendus
Форумчанин
 
Аватар для Tirendus
 
Регистрация: 20.03.2009
Сообщений: 272
По умолчанию

Большое спасибо за советы, со списками я еще не работал, задачу так поставили, хотя не говорили про то, что память нужно выделять динамически, попробую константный массив структур, а потом буду насиловать преподавателя с динамикой
Tirendus вне форума Ответить с цитированием
Старый 24.05.2010, 14:35   #10
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Вот, что быстренько набросал:
Код:
#include <iostream.h>
#include <windows.h>

struct videoShop {
	char fn[100];  // film name
	char pr[100];  // producer
	char gr[100];   // genre
	double popr;   // popularity rating
	double price;  // price
};

void add(videoShop* vs, int i);
void printShop(videoShop* vs, int i);

void main()
{
	int size_of_vs = 2, index = 0;
	videoShop* vs = new videoShop[size_of_vs];

	for (int i = 0; i < size_of_vs; i++)
		add(vs, i); 

	for (int j = 0; j < size_of_vs; j++)
		printShop(vs, j); 

	delete []vs;
}

void add(videoShop* vs, int i)
{
		cout << "New film name?\n";
		cin.get(vs[i].fn, 100).get();

		cout << "Producer\'s name?\n";
		cin.get(vs[i].pr, 100).get();

		cout << "Genre?\n";
		cin.get(vs[i].gr, 100).get();

		cout << "Popularity rating?\n";
		cin >> vs[i].popr;
		cin.get();

		cout << "Price?\n";
		cin >> vs[i].gr;
		cin.get();
		system("cls");

}

void printShop(videoShop* vs, int i){

		cout << "New film name: " << vs[i].fn << "\n";
		cout << "Producer\'s name: " << vs[i].pr << "\n";
		cout << "Genre: " << vs[i].gr << "\n";
		cout << "Popularity rating: " << vs[i].popr << "\n";
		cout << "Price: " << vs[i].gr << "\n\n";
}
profi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Assembler] Массивы структур Opiym Помощь студентам 4 26.02.2010 18:52
массив структур Help_me_please Помощь студентам 3 16.01.2010 02:19
C++,структуры,NEW,массивы из структур -ushёl- Помощь студентам 2 15.11.2009 20:18
массивы структур vasek123 Общие вопросы C/C++ 25 07.03.2009 20:13
Массивы структур.СИ под ДОС. Zid@ne Общие вопросы C/C++ 2 12.12.2008 18:16