Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
lone_luke
0 / 0 / 0
Регистрация: 07.12.2016
Сообщений: 2
1

"Используется потенциально неинициализированная локальная переменная - указатель"

19.01.2019, 16:15. Просмотров 462. Ответов 2

Доброго времени суток! Возникла проблема в программе, на 68 строке пишет, что "используется потенциально неинициализированная локальная переменная - указатель iterator". Подскажите, пожалуйста, где исправить, уже голову сломала.
Использовала Visual Studio 2015 и 2017.
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
#include "HashTab.h"
#include <cstdlib>
#include <conio.h>
#include <iostream>
#include <time.h>
using namespace std;
 
void test_rand(int, double);
 
int main(int argc, char *argv[]) {
    setlocale(0, "Rus");
 
    //Переменные
    int n = 3, value;
    double key;
    //Строки
    const char wait_message[] = "Для продолжения нажмите любую клавишу...\n";
    const char iterator_out_error[] = "Ошибка: итератор за пределами коллекции!\n";
    const char key_not_found[] = "Ошибка: введённый ключ отсутствует в коллекции!\n";
 
    HashTab<double, int>::Iterator  *iterator;
 
    // Очистка экрана
    system("cls");
    while (n != 2) {
        cout << "Итератор:\n"
            "1. Тестирование\n"
            "2. Меню\n"
            "0. Выход\n";
        cin >> n;
        switch (n) {
            int sz;
            double a;
        case 1:
            cout << "Введите кол-во элементов:";
            cin >> sz;
            cout << "Введите альфу:";
            cin >> a;
            test_rand(sz, a);
            break;
 
        case 0: return 0;
        }
    }
    system("cls");
    //Запрос размера
    cout << "Количество элементов: ";
    cin >> n;
 
    system("cls");
 
    //Создаём таблицу
    HashTab<double, int> *tab = new HashTab<double, int>(n);
 
 
    //Основной цикл меню
    bool iterator_created = false;
    while (true) {
        //system("cls");
 
        //Отобразить коллекцию
        cout << "----------------------Хэштаблица--------------------------\n";
        tab->print();
 
        //Отобразить итератор
        if (iterator_created) {
            cout << "----------------------Итератор-------------------------\n";
            if (! iterator -> is_off())
                cout << "\tКлюч: " << iterator->get_key() << "\tЗначение: " << **iterator << '\n';
            else
                cout << "\tКлюч: -\tЗначение: -\n";
        }
        cout << "*************************************************\n";
 
        // Меню
        if (iterator_created) {
            cout << "Итератор:\n"
                "1. Сбросить\n"
                "2. Следующий элемент\n"
                "3. Вывести значение\n"
                "4. Изменить значение\n"
                "5. Состояние итератора\n"
                "6. Удалить итератор\n";
        }
        else {
            cout << "Действия:\n"
                "1. Вставить значение\n"
                "2. Удалить значение\n"
                "3. Вывести значение\n"
                "4. Изменить значение\n"
                "5. Количество элементов\n"
                "6. Очистить таблицу\n"
                "7. Проверить на пустоту\n"
                "8. Создать итератор\n"
                "9. Размер таблицы\n";
        }
        cout << "0. Выход\n*************************************************\n";
 
        //Выбор пункта и проверка на корректность
        cin >> n;
        if (n < 0 || (!iterator_created&& n > 11) || (iterator_created&& n > 9))
            continue;
 
        //Кодпунктовменю
        switch (n) {
        case 1: //Вставка | Сброс итератора
            if (iterator_created) {
                iterator->beg();
            }
            else {
                cout << "Введите ключ и значение: ";
                cin >> key >> value;
                if (tab->insert(key, value) == 0) {
                    cout << "Ошибка: коллекция уже содержит идентичный ключ!\n" << wait_message;
                    _getch();
                }
            }
            break;
        case 2: //Удаление по ключу | Итератор - следующее значение
            if (iterator_created) {
                if (!iterator->next()) {
                    cout << iterator_out_error << wait_message;
                    _getch();
                }
            }
            else {
                cout << "Введите ключ удаляемого элемента: ";
                cin >> key;
                if (tab->remove(key) == 0) {
                    cout << key_not_found << wait_message;
                    _getch();
                }
            }
            break;
        case 3: //Получить значение
            if (iterator_created) {
                try {
                    cout << "Значение = " << **iterator << '\n';
                }
                catch (exception) {
                    cout << iterator_out_error;
                }
            }
            else {
                cout << "Введите ключ элемента: ";
                cin >> key;
                try {
                    cout << tab->get_value(key) << '\n' << wait_message;
                }
                catch (exception) {
                    cout << key_not_found << wait_message;
                }
                _getch();
            }
            break;
        case 4: //Изменить значение
            if (iterator_created) {
                try {
                    cout << "Текущее значение = " << **iterator << '\n';
                    cout << "Изменить на ";
                    cin >> value;
                    **iterator = value;
                }
                catch (exception) {
                    cout << iterator_out_error << wait_message;
                    _getch();
                }
            }
            else {
                cout << "Введите ключ элемента и новое значение: ";
                cin >> key >> value;
                try {
                    tab->get_value(key) = value;
                }
                catch (exception) {
                    cout << key_not_found << wait_message;
                    _getch();
                }
            }
            break;
        case 5: //Число элементов | Состояние итератора
            if (iterator_created) {
                if (iterator->is_off())
                    cout << "Итератор вне коллекции\n";
                else
                    cout << "Итератор внутри коллекции\n";
                cout << wait_message;
                _getch();
            }
            else {
                cout << "Числоэлементоввтаблице: " << tab->get_size() << '\n' << wait_message;
                _getch();
            }
            break;
        case 6: //Очистка | Удалить итератор
            if (iterator_created) {
                if (iterator) {
                    delete iterator;
                }
                iterator_created = 0;
            }
            else {
                tab->clear();
            }
            break;
        case 7: //Проверка на пустоту
            if (tab->is_empty()) {
                cout << "Коллекция пуста\n";
            }
            else {
                cout << "Коллекция не пуста\n";
            }
            cout << wait_message;
            _getch();
            break;
        case 8: //Создать итератор
            iterator_created = 1;
            iterator = new HashTab<double, int>::Iterator(*tab);
            break;
        case 9: //Размертаблицы
            if (!iterator_created) {
                cout << "Размертаблицы:" << tab->get_capacity() << endl;
            }
            break;
        case 0: //Выход
            return 0;
            break;
        }
    }
    return 0;
}
 
double lrand() {
    return ((float)rand() * (float)rand()) / 100.0;
}
 
void test_rand(int sz, double a) {
    srand(time (NULL));
    HashTab<double, int> * tab = new HashTab<double, int>(sz);
    cout << "capacity: " << tab->get_capacity() << endl;
    int n = floor(tab->get_capacity()*a);
    double* m = new double[n];
 
    for (int i = 0; i<n; i++)
    {
        m[i] = lrand();
        tab->insert(m[i], 1);
    }
 
 
    double I = 0;
    double D = 0;
    double S = 0;
    double idx;
 
    for (int i = 0; i<n / 2; i++)
        if (i % 10 == 0) {
            idx = lrand();
            tab->remove(idx);
            D += tab->get_counter();
            tab->insert(m[rand() % n], 1);
            I += tab->get_counter();
            try {
                tab->get_value(lrand());
                S += tab->get_counter();
            }
            catch (exception&) { S += tab->get_counter(); }
        }
        else {
            int ind = rand() % n;
            idx = m[ind];
            try {
                tab->get_value(rand() % n);
                S += tab->get_counter();
            }
            catch (exception&) {
                S += tab->get_counter();
            }
 
            tab->remove(idx);
            D += tab->get_counter();
            double key = lrand();
            tab->insert(key, 1);
            I += tab->get_counter();
            m[ind] = key;
 
 
        }
 
 
        cout << "items count: " << tab->get_size() << endl;
        cout << "Count insert: " << I / (n / 2) << endl;
        cout << "Count delete: " << D / (n / 2) << endl;
        cout << "Count search: " << S / (n / 2) << endl;
 
        delete[] m;
}
Файл HashTab.h
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
#ifndef HASHTAB_H
#define HASHTAB_H
 
#include <iostream>
#include <cmath>
 
using namespace std;
 
 
template<class K, class V>
class  HashTab{
 
    // Элемент списка, который содержится в хэш-таблице
    struct Element {
    K key; // Ключ
    V value; // Значение
    Element *next; // Следующий элемент списка
};
 
// Массив
Element **array;
// Размер хэш-таблицы
int capacity;
// Количество элементов в таблице
int size;
 
// Функция хэширования
int hash(K key);
 
int counter;
 
// Поиск элемента по ключу
Element *find(K key);
int closest_pow2(int x);
 
public:
 
    // Конструктор
    HashTab(int capacity = 8);
    // Деструктор
    ~HashTab();
 
    // Добавляетэлемент
    bool insert(K key, V value);
    // Удаляет элемент
    bool remove(K key);
 
    // Возвращает значение
    V&get_value(K key);
 
    // Возвращает количество элементов
    int get_size();
    // Возвращает размер хэш-таблицы
    int get_capacity();
    // Определяет пуста ли хэш-таблица
    bool is_empty();
    // Очищает хэш-таблицу
    void clear();
    int get_counter();
 
    //Класс итератора
    class Iterator {
        HashTab<K, V> *table;
        bool off;
        int index;
        Element *pointer;
    public:
        Iterator(HashTab<K, V>&table);
        V& operator*();
        bool beg();
        bool is_off();
        bool next();
        K get_key();
    };
 
    // Вывод хэш таблицы на экран
    void print();
};
 
int round(int x) {
    return (int)floor(x + 0.5);
}
 
template<class K, class V>
int HashTab<K, V>::get_counter() {
    return counter;
}
template<class K, class V>
int HashTab<K, V>::hash(K key)
{
    double A = (sqrt(5.0) - 1) / 2;
    double tmp;
    double fract_part = modf(round(((key * 100)) + 1000000) * A, &tmp);
    return (int)floor(capacity * fract_part);
}
 
template<class K, class V>
typename HashTab<K, V>::Element* HashTab<K, V>::find(K key)
{
    counter = 1;
    Element *cur = array[hash(key)];
    while (cur) {
        ++counter;
        if (cur->key == key) {
            return cur;
        }
        cur = cur->next;
    }
    return NULL;
}
template<class K, class V>
int HashTab<K, V>::closest_pow2(int x)
{
    int power = 1;
    while ((power) <= x)
        power = power << 1;
    return power >> 1;
}
template<class K, class V>
HashTab<K, V>::HashTab(int capacity)
{
    this->capacity = closest_pow2(capacity / 2);
    if (this->capacity == 0)
        this->capacity = 1;
 
    this->size = 0;
 
    //Создаём массив элементов
    array = new Element*[this->capacity];
 
    // Обнуляем массив
    memset(array, NULL, sizeof(Element *)* this->capacity);
}
 
template<class K, class V>
HashTab<K, V>::~HashTab()
{
    clear();
    delete[]array;
}
 
template<class K, class V>
bool HashTab<K, V>::insert(K key, V value)
{
    if (!find(key)) {
        int index = hash(key);
 
        Element *new_element = new Element();
        new_element->key = key;
        new_element->value = value;
        new_element->next = array[index];
        array[index] = new_element;
 
        ++size;
        return true;
    }
    return false;
}
 
template<class K, class V>
bool HashTab<K, V>::remove(K key)
{
    int index = hash(key);
    counter = 1;
 
    // Ищем элемент, который надо удалить
    Element *prev = 0;
    Element *cur = array[index];
    while (cur != 0) {
        ++counter;
        if (cur->key == key)
            break;
        prev = cur;
        cur = cur->next;
 
    }
    if (!cur) {
        return false;
    }
 
    if (array[index] == cur) {
        //Удаляемый элемент первый в списке
        array[index] = cur->next;
    }
    else {
        //Удаляемый не первый элемент
        prev->next = cur->next;
    }
    delete cur;
    --size;
    return true;
}
 
template<class K, class V>
V&HashTab<K, V>::get_value(K key)
{
    Element *ptr = find(key);
    if (ptr) {
        return ptr->value;
    }
    else {
        throw exception("There is no such element!");
    }
}
 
template<class K, class V>
int HashTab<K, V>::get_size()
{
    return size;
}
 
template<class K, class V>
int HashTab<K, V>::get_capacity()
{
    return capacity;
}
 
template<class K, class V>
bool HashTab<K, V>::is_empty()
{
    return size == 0;
}
 
template<class K, class V>
void HashTab<K, V>::clear()
{
    for (int i = 0; i< capacity; ++i) {
        Element *cur = array[i];
        while (cur) {
            Element *next = cur->next;
            delete cur;
            cur = next;
        }
        array[i] = NULL;
    }
    size = NULL;
}
 
template<class K, class V>
void HashTab<K, V>::print()
{
    Element *cur;
    for (int i = 0; i< capacity; ++i) {
        cout << i << ". ";
        cur = array[i];
        while (cur) {
            cout << cur->key << " ";
            cur = cur->next;
        }
        cout << '\n';
    }
}
 
// Итератор
 
template<class K, class V>
HashTab<K, V>::Iterator::Iterator(HashTab<K, V>&table)
{
    this->table = &table;
    beg();
}
 
template<class K, class V>
V&HashTab<K, V>::Iterator::operator*()
{
    if (off) {
        throw exception("The iterator is off!");
    }
    return pointer->value;
}
 
template<class K, class V>
bool HashTab<K, V>::Iterator::beg()
{
    //Если в таблице нет элементов - указатель не установлен
    if (table->size == 0) {
        off = true;
        return false;
    }
 
    //Ищем первый элемент
    off = false;
    index = 0;
    while (table->array[index] == 0) {
        ++index;
    }
    pointer = table->array[index];
    return true;
}
 
template<class K, class V>
bool HashTab<K, V>::Iterator::is_off()
{
    return off;
}
 
template<class K, class V>
bool HashTab<K, V>::Iterator::next()
{
    //Проверка на нахождение в коллекции
    if (off) {
        return false;
    }
 
    //Ищем следующий элемент в списке
    if (pointer->next) {
        pointer = pointer->next;
        return true;
    }
 
    //Ищем следующий список
    ++index;
    while (index != table->capacity && table->array[index] == 0) {
        ++index;
    }
 
    //Вышли за пределы
    if (index == table->capacity) {
        off = true;
        return true;
    }
 
    //Список найден
    pointer = table->array[index];
    return true;
}
 
template<class K, class V>
K HashTab<K, V>::Iterator::get_key()
{
    if (off) {
        throw exception("The iterator is off!");
    }
    return pointer->key;
}
 
#endif // HASHTAB_
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2019, 16:15
Ответы с готовыми решениями:

Ошибка C4703 используется потенциально неинициализированная локальная переменная-указатель "A"
Помогите не могу понять, что не так то, уже многое перепробовал #include &quot;stdafx.h&quot; #include...

Исправить ошибку: "C4703: используется потенциально неинициализированная локальная переменная-указатель"
Вообщем выдает одну ошибку в функции добавления в 76 строке, а именно &quot;Ошибка 1 error C4703:...

Выдает ошибку C4703: используется потенциально неинициализированная локальная переменная-указатель "a"
Выдает ошибку C4703: используется потенциально неинициализированная локальная переменная-указатель...

Используется потенциально неинициализированная локальная переменная-указатель
// ex4.cpp: определяет точку входа для консольного приложения. // ...

Error C4703: используется потенциально неинициализированная локальная переменная-указатель
// prog8.cpp: определяет точку входа для консольного приложения. #include &lt;stdio.h&gt; #include...

2
Pavell
23 / 22 / 4
Регистрация: 13.11.2012
Сообщений: 49
19.01.2019, 21:13 2
У меня ошибок нет

"Используется потенциально неинициализированная локальная переменная - указатель"
0
0x10
2641 / 1794 / 299
Регистрация: 24.11.2012
Сообщений: 4,456
20.01.2019, 11:15 3
lone_luke, в строке 21 указатель на итератор объявлен, но не инициализирован. Быстрый способ решения — инициализировать его nullptr.

Код переусложнен. Вы общим циклом пытаетесь обрабатывать два разных меню, поэтому на каждый пункт приходится делать проверку, создан ли итератор. Если разнести обработку разных меню по отдельным функциям, станет проще. Еще проще было бы написать юнит-тесты, но, вероятно, это выходит за рамки задания.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2019, 11:15

Ошибка: Используется потенциально неинициализированная локальная переменная
Ошибка: Используется потенциально неинициализированная локальная переменная prev - 48 строчка,...

Потенциально неинициализированная локальная переменная-указатель (Ошибка C4703) - Как исправить?
Здравствуйте, как можно исправить вот эти ошибки: Ошибка C4703 используется потенциально...

Выдается ошибка использована неинициализированная локальная переменная "H" и "V"
#include&lt;conio.h&gt; #include&lt;iostream&gt; using namespace std; int main(){ double S,T,H,U;...


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

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

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