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

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

Восстановить пароль Регистрация
 
Mag992
 Аватар для Mag992
0 / 0 / 0
Регистрация: 27.03.2010
Сообщений: 7
18.05.2013, 09:51     Ошибки в выполнении программы при динамическом создании структуры #1
Всем привет!
В с++ не силен, только постигаю азы.
Имеется задание (во вложении).
Смахивает на самописный 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;
}
Миниатюры
Ошибки в выполнении программы при динамическом создании структуры  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2013, 09:51     Ошибки в выполнении программы при динамическом создании структуры
Посмотрите здесь:

C++ Ошибка при выполнении программы.
C++ Ошибки при создании .dll
ошибка при выполнении программы! C++
Ошибка при выполнении программы C++
Что будет выведено на экран при выполнении следующей программы при n = 5 ? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 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;
}
Mag992
 Аватар для 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];
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 14:25     Ошибки в выполнении программы при динамическом создании структуры #4
Цитата Сообщение от Mag992 Посмотреть сообщение
оказалось достаточно
Для кого? Повторю вопрос:
Цитата Сообщение от alsav22 Посмотреть сообщение
Зачем эта смесь С и С++?
Я написал выделение памяти в стиле С, только и всего. Можно и через new (стиль С++).
Цитата Сообщение от Mag992 Посмотреть сообщение
не обязательно, и
C++
1
free(temp_item.info);
Без этого - утечка памяти. Так же как new без delete.
Yandex
Объявления
18.05.2013, 14:25     Ошибки в выполнении программы при динамическом создании структуры
Ответ Создать тему
Опции темы

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