Поиск
 
 

Результаты :
 


Rechercher Расширенный поиск

Кто сейчас на форуме
Сейчас посетителей на форуме: 1, из них зарегистрированных: 0, скрытых: 0 и гостей: 1

Нет

[ Посмотреть весь список ]


Больше всего посетителей (9) здесь было Вс Фев 11, 2018 12:54 pm
Самые активные пользователи за неделю
Ярослав
 


Домашнее задание №16

Перейти вниз

Домашнее задание №16

Сообщение автор Pryanik в Пн Июн 12, 2017 4:37 pm

Не пойму как сделать функцию, которая расширяет динамический массив структур, с вводом данных пользователем. Передаю динамический массив film в функцию через указатель и размер size. Создаю новый массив f[size+1],записываю в f[i] = film[i], потом перенаправляю указатель film на память f. Удаляю указатель f. Ввожу с клавиатуры последний элемент массива структур. film[size]. film[size] распечатывается не понятно как.

Film *f = new Film[size + 1];

for (int i = 0; i < size; i++)
f[i] = film[i];
film = f;
delete f;

cout << "Enter the name of the movie: ";
cin.getline(film[size].movieTitle,50);
cout << endl << "Enter the name of the director: ";
cin.getline(film[size].producer.name, 50);
cout << endl << "Enter the surname of the director: ";
cin.getline(film[size].producer.suname, 50);
cout << endl << "Enter the genre of the movie: " << endl;
cout << " 0-THRLLERS,1- DETECTIVE,2 - COMEDY,3 - CARTOON" << endl;
cout << "4 - MELODRAMA, 5 - FANTASI,6 - HORRORS" << endl;
int g;
cin >> g;
while (g < 0 || g > 6) {
cout << endl << "ERROR. Enter the genre of the movie: ";
cin >> g;
}
switch (g){
case 0:
film[size].gen = THRLLERS;
break;
case 1:
film[size].gen = DETECTIVE;
break;
case 2:
film[size].gen = COMEDY;
break;
case 3:
film[size].gen = CARTOON;
break;
case 4:
film[size].gen = MELODRAMA;
break;
case 5:
film[size].gen = FANTASI;
break;
case 6:
film[size].gen = HORRORS;
break;
default:
break;
}
cout << endl << "Enter movie rating from 0 to 100: ";
cin >> film[size].rating;
cout << endl << "Enter the cost of the movie: ";
cin >> film[size].CostOfADisk;

size++;

Pryanik

Posts : 4
Join date : 2017-02-24

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашнее задание №16

Сообщение автор Ярослав в Вт Июн 13, 2017 7:20 pm

Тут несколько проблем.

Проблема №1:

Плохо
Код:
film = f;
delete f;

Эти строки делают следующее:
1) оба указателя указывают на f; (значение указателя film утеряно)
2) высвобождается память, связанная с f. Теперь оба указателя нелегальны
3) динамическая память, связанная со старым массивом film, никогда не была освобождена

Хорошо
Код:
delete[] film; // сначала высвобождаем старую память
film = f; // теперь они оба указывают на новую память
// поскольку два указателя равнозначны, можно забыть про f и пользоваться только film

Проблема №2:

Если передавать динамический массив в функцию по указателю, то передаётся копия указателя. Как его ни изменяй внутри функции (например: film = f;), изменится только локальная копия; во внешнем мире массив останется без изменений.

Чтобы передавать указатель в функцию, так чтобы он был бы изменяемым, его нужно передавать либо по указателю (на указатель), либо по ссылке (на указатель).

Такие же рассуждения применимы к size: если мы хотим, чтобы size изменялся во внешнем мире, его надо передавать по указателю или ссылке.
avatar
Ярослав
Admin

Posts : 591
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашнее задание №16

Сообщение автор Pryanik в Ср Июн 14, 2017 12:44 pm

По ссылке на указатель получилось. Получается я вообще могу не удалять film? После film = f, память просто потеряется и всё, также как и указатель f после выхода из функции?
size я решил поэкспериментировать с работой с файлами, в этой функции записываю в файл, а в main - читаю. Структуры тоже в файл записываю, только не получается Русские буквы. setlocale только на экран помогает выводить, а вот структуру в файл записать и наоборот не получается на Русском.
void addingAFilm(int size, Film *&film) {
Film *f = new Film[size + 1];

for (int i = 0; i < size; i++)
f[i] = film[i];

enteringAMovieByTheUser(&f[size]);

film = f;
size++;

ofstream fout;
fout.open("size.txt");
fout << size;
fout.close();
saveFilm(film, size);

Pryanik

Posts : 4
Join date : 2017-02-24

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашнее задание №16

Сообщение автор Ярослав в Ср Июн 14, 2017 1:58 pm

Высвобождать память надо до перезаписывания указателя.

size тоже надо передавать по ссылке, мы же его меняем в процессе расширения массива.

Про запись в файл. В C++ запись в файл делается очень похоже на то, как печатаем на экран.

Код:
cout << size;
fout << size;
— работает для встроенных типов данных. Для структуры операция записи в файл целиком не предусмотрена; её придётся собирать вручную из имеющихся деталей. Обычно запись структуры в файл оформляют отдельной функцией:
Код:
fout << size << endl;
fout << film->name << endl;
fout << film->director << endl;
...
avatar
Ярослав
Admin

Posts : 591
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашнее задание №16

Сообщение автор Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения