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

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

Войти
Регистрация
Восстановить пароль
 
Mag992
0 / 0 / 0
Регистрация: 27.03.2010
Сообщений: 7
#1

Ошибки в выполнении программы при динамическом создании структуры - C++

18.05.2013, 09:51. Просмотров 344. Ответов 3
Метки нет (Все метки)

Всем привет!
В с++ не силен, только постигаю азы.
Имеется задание (во вложении).
Смахивает на самописный SVN.
При выполнении, выбирая 2й пункт (добавить данные), первый проход работает, данные добавляются и просматриваются.
Если же второй раз попытаться добавить, то программа как бы проскакивает через строчку
C++
1
2
    printf("Введите ключ:");
    scanf_s("%d",&temp_item.key);
и выполняется сама далее, зацикливаясь. Проблема, по-моему в указателях и temp_item, но как правильно будет, не понимаю.

Код. ms vs 2010 c++
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <conio.h>
 
using namespace std;
 
typedef struct Item{    // тип - элемент таблицы;
    int index;
    int key;
    int release;
    char *info;
    Item *next;//
 
} Item;
 
int const rows_count = 10;
 
    vector<Item> items;
    int index = 0;
 
int check_release(int key)
{
    /*
    функция служит для присвоения каждый раз новой версии релиза
    в отдельно взятой ветке 
    */
    int max = key;
    if (items.size() > 0)
    {
    for (vector<Item>::iterator i = items.begin(); i != items.end(); ++i)
        if (i->key = key)
            if (max < i->release)
                max = i->release;
    } else max +=1;
 
return max;
}
 
int add(void)
{
//создаем временную "строку"
    Item temp_item;
 
    temp_item.index = items.size()+1;
    temp_item.key = 0;
    temp_item.release = 0;
    temp_item.info;// = "sss";
    
    printf("Введите ключ:");
    scanf_s("%d",&temp_item.key);
    
    printf("Версия ставится автоматически по ключу: %d", temp_item.key,"\n");
    int temp_key = temp_item.key;
 
    temp_item.release = check_release(temp_key);
    
    printf("\nПоставленная версия: %d", temp_item.release, "\n");
 
    //if (temp_item.info == "0")
    //{
        printf("\nВведите информацию (пустая не катит :-)): ");
        scanf_s("%d",temp_item.info);
    //}
    
    items.push_back(temp_item);//заносим в вектор заполненную структуру
//как понимаю, здесь должно быть освобождение памяти.
 
    return 0;
}
 
int search_versions(int key)
{
    return 0;
}
 
int optimize_table(void)
{
    return 0;
}
 
int display(void)
{
    printf("+---+-------------+-------------|-------------------------------------------+\n");
    printf("| № |     key     |   release   |                  info                     |\n");
    printf("|---|-------------|-------------|-------------------------------------------+\n");
    
    for (vector<Item>::iterator i = items.begin(); i != items.end(); ++i)
    {
        printf("| %d",i->index);
        printf("| %d",i->key);
        printf("| %d",i->release);
        printf("| %s", &i->info); 
        printf("|\n");
    }
    return 0;
}
 
 
void del(int index)
{
    for (int i = index; i < rows_count; ++i)
        items[i] = items[i + 1];
}
 
int menu(void)
{
    char menu_key;
    bool enabled = true;
 
    while (enabled){
    //for (int i=1; i<10; i++){
        printf("\nГлавное меню:\n");
        printf("Для просмотра таблицы нажмите - 1\n");
        printf("Для добавления записи в таблицу нажмите - 2\n");
        printf("Чтобы оптимизировать таблицу, удалив старые версии записей - нажмите - 3\n");
        printf("Чтобы выполнить поиск по ключу, нажмите - 4\n");
        printf("Чтобы выполнить удаление по ключу, нажмите - 5\n");
        printf("Для выхода нажмите - ESC\n");
    switch (menu_key = _getch())
    {
    case '1':
        printf("Просмотр таблицы...\n");
        display();
        break;
    case '2':
        printf("Добавить данные...\n");
        add();
        break;
    case '3':
        printf("Оптимизировать таблицу...\n");
        //optimize
        break;
    case '4':
        printf("Удалить данные по ключу...\n");
        //del
        //index - нужный индекс
        scanf_s("%d",&index);
        del(index);
        break;
    case '5':
        //search
        break;
    case 27:
            enabled = false;
            cout<<"Закрытие программы...\n";
            break;
    default:
        printf("\nВыберите пункт меню от 1 до 5\n");
        break;
 
    }
 
    }
    return 0;
}
 
int _tmain(void)
{
    printf("o_O\n");
    setlocale( LC_ALL,"Russian" );
    
    menu();
 
    //scanf_s("%d",&menu_key);
    
    //menu(menu_key);
 
    system("pause");
    return 0;
}
0
Миниатюры
Ошибки в выполнении программы при динамическом создании структуры  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2013, 09:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибки в выполнении программы при динамическом создании структуры (C++):

Ошибка LNK2019 При динамическом создании объекта - C++
Это хидер который я создал #include&lt;math.h&gt; #define PI 3.14 class Figure { public: Figure(); virtual ~Figure();

Ошибка памяти при выполнении, при компиляции не выводит ошибки - C++
ПОмогите плс программа вводит строку символов до точки, а после вычисляет процент согласных в этой строке и выводит их в обратном порядке....

Ошибки при выполнении поиска - C++
Ребят помогите,почему не выполняются поиски? #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;locale.h&gt; #include &lt;time.h&gt; ...

Структуры. Ошибки в работе программы - C++
Компиляция проходит успешно. После запуска происходят различные ошибки. Наиболее частая- та, что на скриншоте. Подозрение падает на 37-ю...

Что будет выведено на экран при выполнении следующей программы при n = 5 ? - C++
Пожалуйста, очень прошу помогите с тестами(( 3)Что будет выведено на экран при выполнении следующей программы при n = 5 ? ...

Ошибки при создании окна - C++
Здравствуйте, не могли бы вы опять мне(Иванушке Дурачку) помочь? У меня есть библиотека на C++ которая называется Engine в ней есть класс...

3
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 13:09 #2
Зачем эта смесь С и С++?
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
int add(void)
{
//создаем временную "строку"
    Item temp_item;
 
    temp_item.index = items.size() + 1;
    temp_item.key = 0;
    temp_item.release = 0;
    temp_item.info = new char[10];// = "sss";
    temp_item.info = (char*)malloc(10);// = "sss";
    
    printf("Введите ключ:");
    scanf_s("%d", &temp_item.key);
    
    printf("Версия ставится автоматически по ключу: %d", temp_item.key,"\n");
    int temp_key = temp_item.key;
 
    temp_item.release = check_release(temp_key);
    
    printf("\nПоставленная версия: %d", temp_item.release, "\n");
 
    //if (temp_item.info == "0")
    //{
        printf("\nВведите информацию (не более 9 символов, пустая не катит :-)): ");
        scanf_s("%9s", temp_item.info, 10);
    //}
    
    items.push_back(temp_item);//заносим в вектор заполненную структуру
//как понимаю, здесь должно быть освобождение памяти.
    free(temp_item.info);
 
    return 0;
}
0
Mag992
0 / 0 / 0
Регистрация: 27.03.2010
Сообщений: 7
18.05.2013, 14:16  [ТС] #3
C++
1
temp_item.info = (char*)malloc(10);
не обязательно, и
C++
1
free(temp_item.info);
соответсвенно тоже,
оказалось достаточно
C++
1
temp_item.info = new char[10];
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 14:25 #4
Цитата Сообщение от Mag992 Посмотреть сообщение
оказалось достаточно
Для кого? Повторю вопрос:
Цитата Сообщение от alsav22 Посмотреть сообщение
Зачем эта смесь С и С++?
Я написал выделение памяти в стиле С, только и всего. Можно и через new (стиль С++).
Цитата Сообщение от Mag992 Посмотреть сообщение
не обязательно, и
C++
1
free(temp_item.info);
Без этого - утечка памяти. Так же как new без delete.
1
18.05.2013, 14:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2013, 14:25
Привет! Вот еще темы с ответами:

Ошибки при создании шаблона - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &quot;time.h&quot; #include &lt;math.h&gt; #include &lt;stdio.h&gt; using namespace std; ...

Ошибки при создании .dll - C++
Решил попробывать создать .dll. Столкнулся с проблемами. DLLTEST.h #ifndef _DLLTEST_H_ #define _DLLTEST_H_ #include...

no appropriate default constructor available при создании новой структуры - C++
Пытаюсь сделать список студентов. Есть класс Student, в него заносятся возраст, имя и фамилия. Далее методом списка хочу его занести в...

При создании объекта структуры не вызываются конструкторы - C++
Есть класс Время. У него есть два конструктора. Создал структуру struct List { Time a; List *next; }; При создании объекта...


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

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

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