Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 10.12.2019
Сообщений: 69

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

05.06.2020, 13:48. Показов 2593. Ответов 1

Студворк — интернет-сервис помощи студентам
Задание:

Кликните здесь для просмотра всего текста

Реализация сигналов и обработчиков

Для организации взаимодействия объектов вне схемы взаимосвязи используется механизм сигналов и обработчиков. Вместе с передачей сигнала еще передаются определенное множество данных. Механизм сигналов и обработчиков реализует схему взаимодействия объектов один ко многим.

Реализовать механизм взаимодействия объектов с использованием сигналов и обработчиков, с передачей вместе сигналом текстового сообщения (строковой переменной).

Для организации взаимосвязи по механизму сигналов и обработчиков в базовый класс добавить три метода:
1. Установления связи между сигналом текущего объекта и обработчиком целевого объекта;
2. Удаления (разрыва) связи между сигналом текущего объекта и обработчиком целевого объекта;
3. Выдачи сигнала от текущего объекта с передачей строковой переменной.

Методу выдачи сигнала передать указатель на метод сигнала и строковую переменную. Реализовать алгоритм:
1. Вызов метода сигнала с передачей строковой переменной по ссылке.
2. Цикл по всем связям сигнал-обработчик текущего объекта.
2.1. Если в очередной связи сигнал-обработчик участвует метод сигнала, переданный по параметру, то вызвать метод
обработчика очередного целевого объекта и передав в качестве аргумента строковую переменную по значению.
3. Конец цикла.

Для приведения указателя на метод сигнала и на метод обработчика использовать макроопределение с параметром препроцессора.

Система содержит объекты трех классов с номерами: 1,2,3. Классу корневого объекта соответствует номер 1. В каждом классе реализован один метод сигнала и один метод обработчика.

Реализовать алгоритм работы системы:

1. В методе построения дерева иерархи объектов
1.1. Построение иерархии объектов согласно вводу.
1.2. Ввод и построение множества связей сигнал-обработчик для заданных пар объектов.
2. В методе отработки программы
2.1. Цикл до признака завершения ввода.
2.1.1. Ввод наименования объекта и текста сообщения.
2.1.2. Вызов сигнала заданного объекта и передача в качестве аргумента строковой переменной содержащей текст
сообщения.
2.2. Конец цикла.


Допускаем, что все входные данные вводятся корректно, контроль корректности входных данных можно реализовать для самоконтроля работы программы.

Входные данные
Множество объектов, их характеристики и расположение на дереве иерархии.
Структура данных для ввода согласно изложенному в фрагменте методического указания в контрольной работе № 1.

После ввода состава дерева иерархии построчно вводится:
«уникальный номер связи» «наименование объекта выдающей сигнал» «наименование целевого объекта»
Уникальный номер связи – натуральное число.
Ввод информации для построения связей завершается строкой, которая содержит 0.

После завершения ввода связей построчно вводиться:
«наименование объекта выдающей сигнал» «текст сообщения из одного слова без пробелов»
Последняя строка ввода содержит слово:
endsignals

Выходные данные
Первая строка:
Object tree

Со второй строки вывести иерархию построенного дерева.
Следующая после вывода дерева объектов строка содержит:
Set connects

Далее, построчно:
«уникальный номер связи» «наименование объекта выдающей сигнал» «наименование целевого объекта»
Последовательность вывода совпадает с последовательностью ввода связей.
Разделитель один пробель.

Следующая после вывода информации о связях объектов строка содержит:
Emit signals

Далее, построчно:
Signal to «наименование целевого объекта» Text: «наименование объекта выдающей сигнал» -> «текст сообщения из одного слова без пробелов»
Разделитель один пробель.


Код представлен ниже. Не компилируется, выдает в cl_base.cpp строчка 65, ошибку:использована неинициализированная локальная переменная "base_prev". В чем ошибка?

main.cpp
C++
1
2
3
4
5
6
7
8
#include "cl_base.h"
#include "cl_app.h"
 
int main() {
    cl_app app;
    app.start();
    return app.exe_app();
}
cl_base.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
#ifndef INC_3_1_TRY_1_CL_BASE_H
#define INC_3_1_TRY_1_CL_BASE_H
 
#include <vector>
#include <string>
using namespace std;
 
class cl_base;
typedef void (*s_signal)(string&);
typedef void (*s_slot)(cl_base*, string& s);
#define SIGNAL(ssignal) ((s_signal) (&ssignal))
#define SLOT(slt) ((s_slot) (&slt))
 
 
class cl_base {
private:
    string name;
    cl_base* obj;
    vector<cl_base*> childs;
    int state;
 
    struct connect {
        cl_base* base;
        s_signal sig;
        s_slot slt;
    };
    vector<connect> connects;
 
public:
    cl_base(cl_base* head = nullptr);
    cl_base(cl_base* head, string name);
    cl_base* find(string);
    void setName(string);
    void print_tree(string);
    void print_state(bool temp = 1);
    void setState(int);
    string getName();
    string get_path(string, int);
    cl_base* get_root();
    cl_base* get_obj(string);
    void set_connect(s_signal, s_slot, cl_base*);
    void del_connect(s_signal, s_slot, cl_base*);
    void emit_signal(s_signal, string&);
};
 
#endif
cl_base.cpp
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
#include <iostream>
#include <string>
#include "cl_base.h"
using namespace std;
 
cl_base::cl_base(cl_base* head) { 
    this->obj = head;
}
 
cl_base::cl_base(cl_base* head, string name) {
    setName(name);
    if (head != nullptr) {
        this->obj = head;
        head->childs.push_back(this);
    }
}
 
cl_base* cl_base::find(string name) {
    if (this->name == name) return this;
    for (auto i : childs) {
        if (i->find(name) != nullptr) return i->find(name);
    }
    return nullptr;
}
 
void cl_base::setName(string name) { this->name = name; }
void cl_base::setState(int state) { this->state = state; }
string cl_base::getName() { return this->name; }
 
void cl_base::print_tree(string space) {
    cout << space << name;
    space += "    ";
    for (auto i : childs) {
        cout << endl;
        i->print_tree(space);
    }
}
 
void cl_base::print_state(bool temp) {
    if (temp) cout << "\nTest result\n";
    cout << "The object " << this->name;
    if (state > 0) cout << " is ready";
    else cout << " is not ready";
 
    for (auto i : childs) {
        cout << endl;
        i->print_state(0);
    }
}
 
string cl_base::get_path(string path, int i_lvl) {
    int i_item_start = 1, i_item_end, i_lc = 1;
    while (i_item_start) {
        i_item_end = path.find('/', i_item_start);
        if (i_lc == i_lvl) return path.substr(i_item_start, i_item_end - i_item_start);
        i_lc++;
        i_item_start = i_item_end + 1;
    }
    return "";
}
 
cl_base* cl_base::get_root() {
    if (this->obj == nullptr) return this;
    cl_base* base_prev;
    while (base_prev->obj) {
        base_prev = base_prev->obj;
    }
    return base_prev;
}
 
cl_base* cl_base::get_obj(string path) {
    int i_lvl_next = 2; // уровень в программе
    cl_base* base_next = get_root(); // получил указатель на рут
    string temp = get_path(path, 1);
    if (temp != get_root()->getName()) return NULL; // проверка на ошибки
    temp = get_path(path, i_lvl_next);
    while (!temp.empty()) {
        cl_base* base_prev = base_next->find(temp);
        if (base_prev) {
            base_next = base_prev;
            i_lvl_next++;
            temp = get_path(path, i_lvl_next);
        }
        else { return NULL; }
    }
    return base_next;
}
 
void cl_base::set_connect(s_signal sig, s_slot slt, cl_base* ptr) {
    for (connect c : connects) {
        if (c.sig == sig && c.slt == slt && c.base == ptr) return;
    }
    connect c = { ptr, sig, slt };
    connects.push_back(c);
}
 
void cl_base::del_connect(s_signal sig, s_slot slt, cl_base* ptr) {
    for (auto it = connects.begin(); it != connects.end(); it++) {
        if (it->sig == sig && it->slt == slt && it->base == ptr) {
            connects.erase(it);
            return;
        }
    }
}
 
void cl_base::emit_signal(s_signal sig, string& mes) {
    for (connect c : connects) {
        if (connects.empty()) return;
        if (c.sig == sig) {
            c.slt(c.base, this->name);
            sig(mes);
        }
    }
}
cl_app.h
C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef INC_3_1_TRY_1_CL_APP_H
#define INC_3_1_TRY_1_CL_APP_H
#include "cl_base.h"
class cl_app : public cl_base {
public:
    using cl_base::cl_base;
    void printPath();
    void start();
    int exe_app();
};
#endif
cl_app.cpp
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
#include <iostream>
#include "cl_app.h"
#include "cl_2.h"
#include "cl_3.h"
using namespace std;
 
void cl_app::start() {
    string obj0, obj1;
    int cls, state;
    cin >> obj0;
    this->setName(obj0);
    this->setState(1);
 
    while ((cin >> obj0) && (obj0 != "endtree")) {
        cin >> obj1 >> cls >> state;
        cl_base* base = this->find(obj0);
        if (cls == 2) {
            cl_2* cls_2 = new cl_2(base, obj1);
            cls_2->setState(state);
        }
        if (cls == 3) {
            cl_3* cls_3 = new cl_3(base, obj1);
            cls_3->setState(state);
        }
    }
    cout << "Object tree\n";
    print_tree("");
    cout << "\nSet connects";
    string number, first, second, message;
    cl_base* from = nullptr;
    cl_base* to = nullptr;
    while ((cin >> number) && (number != "0")) {
        cin >> first >> second;
        cout << "\n" << number << " " << first << " " << second;
        from = get_root()->find(first);
        to = get_root()->find(second);
        from->set_connect(SIGNAL(cl_2::signal), SLOT(cl_3::slot), to);
    }
}
 
int cl_app::exe_app() {
    cout << "\nEmit signals";
    string sender, message;
    cl_base* from = nullptr;
    while ((cin >> sender) && (sender != "endsignals")) {
        cin >> message;
        from = get_root()->find(sender);
        from->emit_signal(SIGNAL(cl_2::signal), message);
    }
    return 1;
}
 
void cl_app::printPath() {
    string obj0;
    while ((cin >> obj0) && (obj0 != "//")) {
        cout << endl << obj0 << "     ";
        cl_base* base;
        if (obj0 == "/root" || obj0 == "//root")
            base = this;
        else
            base = this->get_obj(obj0);
        if (base == nullptr)
            cout << "Object not found";
        else
            cout << "Object name: " << base->getName();
    }
}
cl_2.h
C++
1
2
3
4
5
6
7
8
9
10
#ifndef INC_3_1_CL_2_H
#define INC_3_1_CL_2_H
#include "cl_base.h"
#include <string>
class cl_2 : public cl_base {
public:
    using cl_base::cl_base;
    static void signal(string& mes);
};
#endif
cl_2.cpp
C++
1
2
3
4
5
6
7
8
#include "cl_2.h"
#include <string>
#include <iostream>
using namespace std;
 
void cl_2::signal(string& mes) {
    cout << " -> " << mes;
}
cl_3.h
C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef INC_3_1_CL_3_H
#define INC_3_1_CL_3_H
#include "cl_base.h"
#include <string>
using namespace std;
class cl_3 : public cl_base {
public:
    using cl_base::cl_base;
    static void slot(cl_base*, string&);
};
#endif
cl_3.h
C++
1
2
3
4
5
6
7
8
#include "cl_3.h"
#include <string>
#include <iostream>
using namespace std;
 
void cl_3::slot(cl_base* ptr, string& mes) {
    cout << "\nSignal to " << ptr->getName() << " Text: " << mes;
}
Добавлено через 10 минут
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.06.2020, 13:48
Ответы с готовыми решениями:

Использована неинициализированная локальная переменная
Использована неинициализированная локальная переменная &quot;list&quot; . #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; ...

Использована неинициализированная локальная переменная
Здравствуйте. Подскажите, пожалуйста, в чем тут ошибка? Вроде бы все правильно. Создаются переменная и указатель на адрес, где хранится...

Использована неинициализированная локальная переменная
error C4700: использована неинициализированная локальная переменная &quot;w&quot;. Даже если w объявлять как глобальную переменную то прога все равно...

1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
05.06.2020, 14:00
Цитата Сообщение от Astreemonter Посмотреть сообщение
Код представлен ниже. Не компилируется, выдает в cl_base.cpp строчка 65, ошибку:использована неинициализированная локальная переменная "base_prev". В чем ошибка?
Вроде ясно сказано - base_prev не проинициализирована. Наверное, надо что-то типа
C++
1
2
3
4
5
6
7
8
cl_base* cl_base::get_root() {
    if (this->obj == nullptr) return this;
    cl_base* base_prev = this->obj;
    while (base_prev->obj) {
        base_prev = base_prev->obj;
    }
    return base_prev;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.06.2020, 14:00
Помогаю со студенческими работами здесь

Использована неинициализированная локальная переменная
что не так???? #include &lt;iostream&gt; using namespace std; int main() { int k, i, j, temp, n; int arr;

Использована неинициализированная локальная переменная
Почему не работает программа #include &lt;iostream&gt; #include &lt;cstring&gt; using std::cin; using std::cout; using std::endl; int...

Использована неинициализированная локальная переменная
Помогите, пожалуйста, избавиться от ошибки &quot;использована неинициализированная локальная переменная &quot;l&quot;&quot; #pragma hdrstop ...

Использована неинициализированная локальная переменная
Друзья, подскажите пожалуйста в чём проблема? Пишу программу, где среди трёх заданных чисел необходимо найти минимальное и...

Использована неинициализированная локальная переменная
#include &lt;math.h&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru