Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
vadim09
6 / 6 / 1
Регистрация: 04.08.2012
Сообщений: 62
#1

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

08.04.2013, 19:48. Просмотров 854. Ответов 24
Метки нет (Все метки)

Добрый день!
Такая проблема :
Есть структура данных, данные заполняю с клавиатуры. Потом хочу эти же данные вывести на экран, но, тут вылетает ошибка.
Потом, думаю, буду выводить на экран сразу после заполнения одной строки - всё нормально выводиться, но перед этим данные я записываю в буферный массив, и потом их копирую в саму структуру. Пред удалением буферного массива всё нормально, но после его удаления, на экране появляются странные символы, и они одинаковые при разных значениях строк. Вот сам код :
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;
 
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2013, 19:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не присваиваеться переменная (C++):

Как вывести на экран переменную из функции, которой присваиваеться значение через указатель? - C++
Только начал изучать С++. И не могу понять, как вывести на экран переменную pdLocalVar из функции child(), которой присваивается значение в...

Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз - C++
Исходники: /* main.cpp */ #include &quot;hider.h&quot; int main(void) { return 0; } /* foo.cpp */

Переменная или переменная и условие - C++
Привет всем. Стало интересно. Есть предположим функция. В ней ссылкой передается аргумент Status; Как лучше сделать? ...

переменная - C++
#include &lt;iostream&gt; using namespace std; void func1(); void func2(); int count; // Это голобальная переменная int main()...

Переменная - C++
Мне нужная переменная(ые) в 1 байт. Где её можно взять?

Переменная=Документ.имя. Сделать выборку всех документов с именем Переменная - 1С
Привет всем. У меня есть проблема и варианты решения, но они не работают. Проблема вот такая: Есть переменная Документ1 в...

24
castaway
Эксперт С++
4919 / 3027 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
08.04.2013, 19:54 #2
В 14-й строке данные не копируются, а просто присваивается указатель, данные по которому освобождаются в следующей строке.
Для копирования есть функция strcpy().
В других строках аналогичная проблема.
1
vadim09
6 / 6 / 1
Регистрация: 04.08.2012
Сообщений: 62
08.04.2013, 20:31  [ТС] #3
Спасибо, помогло.
А без использования каких-либо функций? Только поэлементное присвоение?
0
castaway
Эксперт С++
4919 / 3027 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
08.04.2013, 22:49 #4
Да. По-другому никак.
1
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 строки.
0
taras atavin
3571 / 1755 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
09.04.2013, 06:05 #6
Цитата Сообщение от vadim09 Посмотреть сообщение
А без использования каких-либо функций? Только поэлементное присвоение?
Конечно, это же массив, его нельзя скопировать, можно скопировать или его элементы, или его байты, байты можно копировать целыми блоками (парами, четвёрками...), представив его, как union с массивом другого базового типа с элементами-"сырыми" блоками байт и скопировав поэлементно уже его. Другого способа нет по сути массива, но поэлементное копирование можно спрятать в реализацию копирующего присваивания всего массива, как сделано на турбопаскале и часто делается для массивов-объектов на c++. Для массива на явном указателе на элемент поэлементное копирование может быть спрятано только в функцию.
1
alsav22
5429 / 4824 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 07:28 #7
57:
C++
1
VideoShop **arr = new VideoShop* [17]
Тут память выделена только под массив указателей. А под то, на что они указывать должны? И зачем указатель на указатель? Двумерный массив?
0
taras atavin
3571 / 1755 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
09.04.2013, 07:30 #8
Цитата Сообщение от alsav22 Посмотреть сообщение
И зачем указатель на указатель? Двумерный массив?
А может лес, или массив линейных списков? Кстати, указатель на указатель называется кратным указателем, в частности указатель на указатель на данное/функцию двойным указателем, указатель на указатель на указатель на данное/функцию тройным и так далее. Сколько указателей надо пройти, чтоб добраться до данного не указательного типа/функцию, такова кратность.
0
vadim09
6 / 6 / 1
Регистрация: 04.08.2012
Сообщений: 62
09.04.2013, 13:33  [ТС] #9
Цитата Сообщение от alsav22 Посмотреть сообщение
57:
C++
1
VideoShop **arr = new VideoShop* [17]
Тут память выделена только под массив указателей. А под то, на что они указывать должны? И зачем указатель на указатель? Двумерный массив?
Я создал массив указателей для того, что б элементам этого массива присвоить адреса нужных структур.
0
alsav22
5429 / 4824 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 13:48 #10
Цитата Сообщение от vadim09 Посмотреть сообщение
Я создал массив указателей для того, что б элементам этого массива присвоить адреса нужных структур.
Понятно. И в чём тогда вопрос?

Добавлено через 2 минуты
Цитата Сообщение от vadim09 Посмотреть сообщение
Как в новый массив структур присваивать элементы другого массива структур?
Если это, то где у вас новый массив структур? Массив указателей вижу, новый массив структур нет.
1
vadim09
6 / 6 / 1
Регистрация: 04.08.2012
Сообщений: 62
09.04.2013, 14:03  [ТС] #11
Параметр функции а - это указатель на массив структур, а (a+i) - адреса элемента массива структур.
Вот и я и присваиваю arr[k]=(a+i). То есть присваиваю адреса всех структур, которые имеют поле с одинаковым жанром.
0
alsav22
5429 / 4824 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 14:08 #12
Цитата Сообщение от vadim09 Посмотреть сообщение
То есть присваиваю адреса всех структур
Вот и я говорю, что адреса... Но адреса - это не структуры. Присвоить структуру другой структуре - это одно, а присвоить адрес структуры - другое. Вопрос в чём?
1
vadim09
6 / 6 / 1
Регистрация: 04.08.2012
Сообщений: 62
09.04.2013, 14:11  [ТС] #13
В том, что при последующем разименовании этих указателей, которым присвоены адреса структур, вылетает ошибка.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13565 / 7716 / 873
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 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)
                                    }
                                }
1
alsav22
5429 / 4824 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 14:20 #15
Цитата Сообщение от vadim09 Посмотреть сообщение
В том, что при последующем разименовании этих указателей, которым присвоены адреса структур, вылетает ошибка.
Вот в таких строчках?
C++
1
cout<<(*arr+k)->genre;
1
09.04.2013, 14:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2013, 14:20
Привет! Вот еще темы с ответами:

Модульная переменная или блочная статическая переменная: что лучше - Visual Basic .NET
Переменная (тип String) нужна на всем протяжении работы программы. Нужен совет опытных - что предпочтительнее: модульная переменная или...

Проблема с Adodc: 'Переменная объекта или переменная блока With не задана' - Visual Basic
В свойствах самого контрола (MS ADO Data Control) проверка подключения к атблице (подключаюсь через ODBC) проходит нормально. Когда же...

Public переменная, или private переменная и функции get/set - C++ Builder
Пишу свой класс, который потом будет много где использоваться и пытаюсь осознать, как правильнее и, что самое главное, почему. Вариант 1:...

Какое значение примет переменная после выполнения фрагмента алгоритма, если переменная а имела значение 'ИНФОРМАТИКА' - Turbo Pascal
Имеется фрагмент алгоритма, записанный на алгоритмическом языке: m := 10 b := Извлечь(а, m) нц для k от 4 до 5 с := Извлечь(а,...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.