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

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

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

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

08.04.2013, 19:48. Просмотров 819. Ответов 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;
 
    }
}
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 в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,228
Записей в блоге: 3
Завершенные тесты: 1
09.04.2013, 14:24 #17
C++
1
VideoShop **arr = new VideoShop* [17];
И это объявлено в секции case, так что локально для этой секции
alsav22
5417 / 4813 / 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, кстати да, вы правы. Но это была проверочная строка.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 14:32 #20
И покажите весь код. Ничего не видно.
vadim09
6 / 6 / 1
Регистрация: 04.08.2012
Сообщений: 62
09.04.2013, 14:51  [ТС] #21
Вот та функция, с которой проблемы:
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
144
145
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 ://Название фильма
                    fflush(stdin);//Очистка буффера
                    gets(Buff);//Ввод данных
                    for(int i=0; i<n; i++)
                    {
                        if(strstr((a+i)->name, Buff))//если данные совпали с названием фильма
                        {
                            Show((a+i));//вывод структуры на экран
                        }
                    }               //И так далее
                    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=-1;
                                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))//Если вводимое название совпадает то
                                    {
                                        k++;//счетчик
                                        arr[k]=(a+i);//В массив записываем все структуры, с одинаковым жанром
                                        //cout<<(*arr+k)->genre;//Проверка
                                    }
                                }
                                for(int i = 0; i <= k; i++)//Поиск структуры с наибольшей популярностью
                                {
                                    for(int j = i; j <= k; j++)
                                    {                                       
                                        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;*/
            }
}
Добавлено через 6 минут
Ну так вот, почему не хочет работать 21-я строка? Что не так?
kelos
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 3
09.04.2013, 20:26 #22
C++ (Qt)
1
cout<<(*arr+k)->genre;
приоритеты операций учим

Добавлено через 7 минут
C++ (Qt)
1
Show((a+i));//вывод структуры на экран
согласно прототипу
C++ (Qt)
1
void Show(VideoShop a);
функция Show принимает в качестве параметра экземпляр структуры по значению, функция же
C++ (Qt)
1
void Search(VideoShop *a, int n);
принимает указатель на структуру, который вы и хотите передать в функцию Show в качестве параметра, то бишь, имеет место несоответствие типов
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 20:32 #23
Цитата Сообщение от vadim09 Посмотреть сообщение
Есть функция, которая выводит выводит на экран структуру. Вот её прототип void Show(VideoShop *a);
Несоответсвие типов компилятор покажет.
kelos
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 3
09.04.2013, 21:03 #24
vadim09, обновите код в шапке до актуального в данный момент

Добавлено через 24 минуты
C++ (Qt)
1
    VideoShop shop, a;
дорогой, а где, собственно, выделение памяти под сам масив? вижу обявление одного экземпляра, который вы затем
C++ (Qt)
1
    a = Init(&shop, n);//Заполнение структуры
заполняете, что, впрочем, не мешает вам обращаться к нему
C++ (Qt)
1
2
3
4
5
6
7
                    for(int i=0; i<n; i++)
                    {
                        if(strstr((ar+i)->name, Buff))//если данные совпали с названием фильма
                        {
                            Show(ar+i*sizeof(ar));//вывод структуры на экран
                        }
                    }
как к массиву.
Если бы вы воспользовалмсь дебаггером, вы бы увидели, что он выдает ошибку "cannot evaluate..." и бла бла бла
vadim09
6 / 6 / 1
Регистрация: 04.08.2012
Сообщений: 62
11.04.2013, 00:31  [ТС] #25
Ребята, всем спасибо! Уже со всем разобрался.
Тему можно закрывать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2013, 00:31
Привет! Вот еще темы с ответами:

Модульная переменная или блочная статическая переменная: что лучше - 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 с := Извлечь(а,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.04.2013, 00:31
Ответ Создать тему
Опции темы

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