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

Не присваиваеться переменная - C++

Восстановить пароль Регистрация
 
 
vadim09
6 / 6 / 1
Регистрация: 04.08.2012
Сообщений: 62
08.04.2013, 19:48     Не присваиваеться переменная #1
Добрый день!
Такая проблема :
Есть структура данных, данные заполняю с клавиатуры. Потом хочу эти же данные вывести на экран, но, тут вылетает ошибка.
Потом, думаю, буду выводить на экран сразу после заполнения одной строки - всё нормально выводиться, но перед этим данные я записываю в буферный массив, и потом их копирую в саму структуру. Пред удалением буферного массива всё нормально, но после его удаления, на экране появляются странные символы, и они одинаковые при разных значениях строк. Вот сам код :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void Init(VideoShop *a, int n)
{
    setlocale(LC_ALL, "russian");
    char *buff;//Создаю буферный массив
    a = new VideoShop [n];//Создаю массив структур
    cout<<"Заполнение стркутуры.\n";
    for( int i=0; i<n; i++)
    {
        buff = new char[100];//Выделяю память, что б мало не казалось
        cout<<"\tВведите назване фильма : ";
        fflush(stdin);//Очищаю буфер потока
        gets(buff);//записываю вводимую строку в буферный массив
        (a+i)->name = new char [strlen(buff)+1];//Выделяю память под элемент структуры столько,                 сколько символов содержиться в вводимой строке
        (a+i)->name = buff;//копирую данные с буферного массива в элемент поле структуры
        delete[] buff;//удаляю буферный массив
        cout<<a->name;//вывожу на экран (Если delete[] buff; закоментировать, то выводиться то что и ввели)
        buff = new char[100];//Дальше делаем тоже самое для каждого поля.
        cout<<"\tРежиссер : ";
        fflush(stdin);
        gets(buff);
        (a+i)->director = new char [strlen(buff)+1];
        (a+i)->director = buff;
        delete[] buff;
 
        buff = new char[100];
        cout<<"\tЖанр : ";
        fflush(stdin);
        gets(buff);
        (a+i)->genre = new char [strlen(buff)+1];
        (a+i)->genre = buff;
        delete[] buff;
 
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2013, 19:48     Не присваиваеться переменная
Посмотрите здесь:

C++ переменная
Как вывести на экран переменную из функции, которой присваиваеться значение через указатель? C++
C++ Переменная
Переменная-счетчик C++
Мультитипная переменная C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
08.04.2013, 19:54     Не присваиваеться переменная #2
В 14-й строке данные не копируются, а просто присваивается указатель, данные по которому освобождаются в следующей строке.
Для копирования есть функция strcpy().
В других строках аналогичная проблема.
vadim09
6 / 6 / 1
Регистрация: 04.08.2012
Сообщений: 62
08.04.2013, 20:31  [ТС]     Не присваиваеться переменная #3
Спасибо, помогло.
А без использования каких-либо функций? Только поэлементное присвоение?
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
08.04.2013, 22:49     Не присваиваеться переменная #4
Да. По-другому никак.
vadim09
6 / 6 / 1
Регистрация: 04.08.2012
Сообщений: 62
09.04.2013, 02:15  [ТС]     Не присваиваеться переменная #5
Вот опять не пойму в чем дело.
Как в новый массив структур присваивать элементы другого массива структур?
Вот Код :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
void Search(VideoShop *a, int n)
{
        cout<<"Поиск по : \n";
        cout<<"1)Названию фильма.\n";
        cout<<"2)Режиссеру.\n";
        cout<<"3)Жанру. : \n";
        cout<<"4)Самый популярный фильм по : \n";
        cout<<"5)Показ всех записей и добавление.\n";
        short int key=0;
        char *Buff = new char[100];
        cin>>key;
            switch (key)
            {
            case 1 :
                    for(int i=0; i<n; i++)
                    {
                        fflush(stdin);
                        gets(Buff);
                        if(strstr((a+i)->name, Buff))
                            Show(a);
                    }
                    break;
 
                case 2 :
                    for(int i=0; i<n; i++)
                    {
                        fflush(stdin);
                        gets(Buff);
                        if(strstr((a+i)->director, Buff))
                            Show(a);
                    }
                    break;
 
                case 3 :
                    for(int i=0; i<n; i++)
                    {
                        fflush(stdin);
                        gets(Buff);
                        if(strstr((a+i)->genre, Buff))
                            Show(a);
                    }
                    break;
 
                case 4 :
                    cout<<"\n\t1)Жанру : ";
                    cout<<"\n\t2)Режиссеру : ";
                    cout<<"\n\t3)Названию : ";
                    cout<<"\n";
                    cin>>key;
 
                    switch (key)
                    {
                        case 1 ://Жанр
                            {
                                int k=0;
                                VideoShop **arr = new VideoShop* [17];//[17] потому что такое приблизительное количество                                    жанров [url]http://ru.wikipedia.org/wiki/Жанры_киноискусства[/url]
 
                                VideoShop *Max;//Создаем указатель для максимального значения
                                fflush(stdin);//Очищаем буффер
                                gets(Buff);//Вводим название жанра
                                for(int i=0; i<n; i++)
                                {
                                    if(strstr((a+i)->genre, Buff))//Если вводимое название совпадает то
                                    {
                                        arr[k]=(a+i);//В массив записываем все структуры, с одинаковым жанром
                                        k++;//счетчик
                                        cout<<(*arr+k)->genre;
                                    }
                                }
                                for(int i = 0; i < k; i++)//Поиск структуры с наибольшей популярностью
                                {
                                    for(int j = 0; j < k; k++)
                                    {                                       
                                        if((*arr+i)->rating > (*arr+j)->rating)
                                            Max = arr[i];//Наибольшая структура по популярности и жанру
                                    }
                                }
                                Show(Max);//Вывод на экран
                                break;
                            }
 
                        //case 2 ://Режисер
                        //  {
                        //      int k=0;
                        //      VideoShop *arr = new VideoShop [17];//[
 
                        //      VideoShop *Max;//Создаем указатель для максимального значения
                        //      fflush(stdin);//Очищаем буффер
                        //      gets(Buff);//Вводим название жанра
                        //      for(int i=0; i<n; i++)
                        //      {
                        //          if(strstr((a+i)->director, Buff))//Если вводимое название совпадает то
                        //          {
                        //              k++;//счетчик
                        //              arr[k]=a[i];//В массив записываем все структуры, с одинаковым жанром
                        //          }
                        //      }
                        //      for(int i = 0; i < k; i++)//Поиск структуры с наибольшей популярностью
                        //      {
                        //          for(int j =0; j < k; k++)
                        //          {                                       
                        //              if((arr+i)->rating < (arr+j)->rating)
                        //                  Max = (arr+j);//Наибольшая структура по популярности 
                        //          }
                        //      }
                        //      Show(Max);//Вывод на экран
                        //      break;
                        //  }
 
                        //case 3 ://Название
                        //  {
                        //      int k=0;
                        //      VideoShop *arr = new VideoShop [17];//[
 
                        //      VideoShop *Max;//Создаем указатель для максимального значения
                        //      fflush(stdin);//Очищаем буффер
                        //      gets(Buff);//Вводим название жанра
                        //      for(int i=0; i<n; i++)
                        //      {
                        //          if(strstr((a+i)->name, Buff))//Если вводимое название совпадает то
                        //          {
                        //              k++;//счетчик
                        //              arr[k]=a[i];//В массив записываем все структуры, с одинаковым жанром
                        //          }
                        //      }
                        //      for(int i = 0; i < k; i++)//Поиск структуры с наибольшей популярностью
                        //      {
                        //          for(int j =0; j < k; k++)
                        //          {                                       
                        //              if((arr+i)->rating < (arr+j)->rating)
                        //                  Max = (arr+j);//Наибольшая структура по популярности 
                        //          }
                        //      }
                        //      Show(Max);//Вывод на экран
                        //      break;
                        //  }
                    }
                    /*break;
 
                case 5 :
                    break;*/
            }
}
Конкретно интересует всё то что начинается с 53 строки.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.04.2013, 06:05     Не присваиваеться переменная #6
Цитата Сообщение от vadim09 Посмотреть сообщение
А без использования каких-либо функций? Только поэлементное присвоение?
Конечно, это же массив, его нельзя скопировать, можно скопировать или его элементы, или его байты, байты можно копировать целыми блоками (парами, четвёрками...), представив его, как union с массивом другого базового типа с элементами-"сырыми" блоками байт и скопировав поэлементно уже его. Другого способа нет по сути массива, но поэлементное копирование можно спрятать в реализацию копирующего присваивания всего массива, как сделано на турбопаскале и часто делается для массивов-объектов на c++. Для массива на явном указателе на элемент поэлементное копирование может быть спрятано только в функцию.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 07:28     Не присваиваеться переменная #7
57:
C++
1
VideoShop **arr = new VideoShop* [17]
Тут память выделена только под массив указателей. А под то, на что они указывать должны? И зачем указатель на указатель? Двумерный массив?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.04.2013, 07:30     Не присваиваеться переменная #8
Цитата Сообщение от alsav22 Посмотреть сообщение
И зачем указатель на указатель? Двумерный массив?
А может лес, или массив линейных списков? Кстати, указатель на указатель называется кратным указателем, в частности указатель на указатель на данное/функцию двойным указателем, указатель на указатель на указатель на данное/функцию тройным и так далее. Сколько указателей надо пройти, чтоб добраться до данного не указательного типа/функцию, такова кратность.
vadim09
6 / 6 / 1
Регистрация: 04.08.2012
Сообщений: 62
09.04.2013, 13:33  [ТС]     Не присваиваеться переменная #9
Цитата Сообщение от alsav22 Посмотреть сообщение
57:
C++
1
VideoShop **arr = new VideoShop* [17]
Тут память выделена только под массив указателей. А под то, на что они указывать должны? И зачем указатель на указатель? Двумерный массив?
Я создал массив указателей для того, что б элементам этого массива присвоить адреса нужных структур.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 13:48     Не присваиваеться переменная #10
Цитата Сообщение от vadim09 Посмотреть сообщение
Я создал массив указателей для того, что б элементам этого массива присвоить адреса нужных структур.
Понятно. И в чём тогда вопрос?

Добавлено через 2 минуты
Цитата Сообщение от vadim09 Посмотреть сообщение
Как в новый массив структур присваивать элементы другого массива структур?
Если это, то где у вас новый массив структур? Массив указателей вижу, новый массив структур нет.
vadim09
6 / 6 / 1
Регистрация: 04.08.2012
Сообщений: 62
09.04.2013, 14:03  [ТС]     Не присваиваеться переменная #11
Параметр функции а - это указатель на массив структур, а (a+i) - адреса элемента массива структур.
Вот и я и присваиваю arr[k]=(a+i). То есть присваиваю адреса всех структур, которые имеют поле с одинаковым жанром.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 14:08     Не присваиваеться переменная #12
Цитата Сообщение от vadim09 Посмотреть сообщение
То есть присваиваю адреса всех структур
Вот и я говорю, что адреса... Но адреса - это не структуры. Присвоить структуру другой структуре - это одно, а присвоить адрес структуры - другое. Вопрос в чём?
vadim09
6 / 6 / 1
Регистрация: 04.08.2012
Сообщений: 62
09.04.2013, 14:11  [ТС]     Не присваиваеться переменная #13
В том, что при последующем разименовании этих указателей, которым присвоены адреса структур, вылетает ошибка.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
09.04.2013, 14:19     Не присваиваеться переменная #14
C++
1
2
3
4
5
6
7
8
9
                                for(int i=0; i<n; i++)
                                {
                                    if(strstr((a+i)->genre, Buff))//Если вводимое название совпадает то
                                    {
                                        arr[k]=(a+i);
                                        k++;//УВЕЛИЧИЛИ!!!! счетчик
                                        cout<<(*arr+k)->genre;//Обращаемся к еще не инициализированному элементу (*arr+k+1)
                                    }
                                }
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 14:20     Не присваиваеться переменная #15
Цитата Сообщение от vadim09 Посмотреть сообщение
В том, что при последующем разименовании этих указателей, которым присвоены адреса структур, вылетает ошибка.
Вот в таких строчках?
C++
1
cout<<(*arr+k)->genre;
vadim09
6 / 6 / 1
Регистрация: 04.08.2012
Сообщений: 62
09.04.2013, 14:21  [ТС]     Не присваиваеться переменная #16
И вот еще вопрос:
Есть функция, которая выводит выводит на экран структуру. Вот её прототип void Show(VideoShop *a);
Вроде ж должно всё работать, а нет, не работает
Вот кусок кода:
C++
1
2
3
4
5
6
7
8
9
fflush(stdin);//Очистка буффера
                    gets(Buff);//Ввод данных
                    for(int i=0; i<n; i++)
                    {
                        if(strstr((a+i)->name, Buff))//если данные совпали с названием фильма
                        {
                            Show((a+i));//вывод структуры на экран
                        }
                    }
С Show((a+i)) ничего не выводит, кидает на участок ассемблерного кода, а так Show(a) всё нормально, выводится первая структура. Что я не правильно делаю?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
09.04.2013, 14:24     Не присваиваеться переменная #17
C++
1
VideoShop **arr = new VideoShop* [17];
И это объявлено в секции case, так что локально для этой секции
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 14:30     Не присваиваеться переменная #18
Цитата Сообщение от alsav22 Посмотреть сообщение
cout<<(*arr+k)->genre;
Здесь у вас значение указателю ещё не присвоено, а идёт обращение к полю. Сначала вывод делайте, а потом ++k.
vadim09
6 / 6 / 1
Регистрация: 04.08.2012
Сообщений: 62
09.04.2013, 14:32  [ТС]     Не присваиваеться переменная #19
Croessmah, кстати да, вы правы. Но это была проверочная строка.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2013, 14:32     Не присваиваеться переменная
Еще ссылки по теме:

C++ Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз
C++ Неинициализированная переменная
C++ Междупроектная переменная

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 14:32     Не присваиваеться переменная #20
И покажите весь код. Ничего не видно.
Yandex
Объявления
09.04.2013, 14:32     Не присваиваеться переменная
Ответ Создать тему
Опции темы

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