Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Век живи - век тупи
 Аватар для tankoman228
2 / 2 / 2
Регистрация: 12.05.2022
Сообщений: 83
Записей в блоге: 1

Передача массива через указатель на указатель объекту

21.05.2022, 11:30. Показов 1760. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Итак, проблема. Мне необходимо передать объекту ссылку на конкретный элемент в одном массивов, чтобы далее сам объект мог работать именно с этим элементом нужного мне массива. Однако, вместо передачи ссылки на необходимый мне элемент, программа творит какую-то дичь.
Т.е. дверь будет проверять, переключена ли какая-то кнопка, которая через этот же элемент массива и скажет о своём состоянии.

Сам объект:
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
struct Door : public Block {
 
    int group; bool reversed; bool& target = dmode[0];
 
    void init(int _x, int _y, int _id, int rotation, bool& target_) {
 
        x = _x; y = _y; id = _id; target = target_;
 
        block.setTextureRect(IntRect(0, 0, 128, 128));
 
        switch (id) {
 
        case 2: box.setTexture(door); reversed = false; break;
        case 3: box.setTexture(door); reversed = true; box.setTextureRect(IntRect(128, 0, 128, 128)); break;
 
        }
 
        box.setRotation(rotation);
 
    }
 
    void cycle() {
        if (target) {
            if (reversed) {
                box.setTextureRect(IntRect(0, 0, 128, 128));
            }
            else {
                box.setTextureRect(IntRect(128, 0, 128, 128));
                if_collide();
            }
        }
        else {
            if (reversed) {
                box.setTextureRect(IntRect(128, 0, 128, 128));
                if_collide();
            }
            else {
                box.setTextureRect(IntRect(0, 0, 128, 128));
            }
        }
    }
 
};
 
vector <Block*> map_basic;
void cycle() выполняется каждый тик

Вот так добавляется элемент в карту (в добавлении багов нет, если я не передаю никаких ссылок или другой нечисти)
C++
1
2
3
4
5
6
7
8
Door* add = new Door[1];
 
add[0].init(i * 128, j * 128, level[i][j][1][0], level[i][j][1][1], dmode[level[i][j][1][2]]);
add[0].box.setOrigin(64, 64);
 
map_basic.push_back(&add[0]);
 
continue;
Если нужно, массивы заданы так:
C++
1
2
3
4
bool *dmode = new bool[1];
bool *crystal = new bool[1];
bool *lmode = new bool[1]; 
bool *barmode = new bool[1];
P.S. во время постройки уровня я их также переопределяю через new
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.05.2022, 11:30
Ответы с готовыми решениями:

Можно ли, используя указатель, а не указатель на указатель, обработать все элементы двумерного массива?
Можно ли, используя указатель, а не указатель на указатель, обработать все элементы двумерного массива?

Передача массива через указатель
Надо передать массив в функцию через указатель, я сделал, так но что то программа долго думаете #include &lt;iostream&gt; #include ...

Передача массива в функцию через указатель
В каких случаях массив обязательно передается в качестве указателя в функцию?

23
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
21.05.2022, 19:45
Студворк — интернет-сервис помощи студентам
tankoman228, Харош оправдываться. В чём проблема-то была?
Выложи рабочий код и ошибки расскажи.

Не в обиду, но тебя читать - эт телепатом над быть, чесслово.
0
Век живи - век тупи
 Аватар для tankoman228
2 / 2 / 2
Регистрация: 12.05.2022
Сообщений: 83
Записей в блоге: 1
21.05.2022, 20:01  [ТС]
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
struct Door : public Block {
 
    int group; bool reversed; bool* target; //Обратите внимание на этот указатель
 
    void init(int _x, int _y, int _id, int rotation, bool* target_, int _group) {
 
        x = _x; y = _y; id = _id; target = target_; group = _group; // Я не задал значение group и от этого программа не знала, к какому элементу массива нужно обращаться. Единственная ошибка
 
        block.setTextureRect(IntRect(0, 0, 128, 128));
 
        switch (id) {
 
        case 2: box.setTexture(door); reversed = false; break;
        case 3: box.setTexture(door); reversed = true; box.setTextureRect(IntRect(128, 0, 128, 128)); break;
 
        }
 
        box.setRotation(rotation);
 
    }
 
    void cycle() {
        if (target[group]) {
            if (reversed) {
                box.setTextureRect(IntRect(0, 0, 128, 128));
            }
            else {
                box.setTextureRect(IntRect(128, 0, 128, 128));
                if_collide();
            }
        }
        else {
            if (reversed) {
                box.setTextureRect(IntRect(128, 0, 128, 128));
                if_collide();
            }
            else {
                box.setTextureRect(IntRect(0, 0, 128, 128));
            }
        }
    }
 
};
Добавлено через 1 минуту
Ошибка только одна. Всё было написано верно, за исключением того, что я не заметил, что хоть в функию init() и передавался как аргумент номер элемента в массиве, он не записывался в объект (то ли стёр случайно этот кусочек кода, то ли пропустил)

Добавлено через 1 минуту
Из-за этого когда программа начинала работать (вернее запускалась функция для итерации одного цикла), она обращалась к массиву по адресу не 1, 3 или т.п., а обращалась к адресу по неинициализированной переменной. Оттуда и вылеты

Добавлено через 3 минуты
Ну, ещё пара моментов с синтаксисом. В аргументе надо было записать bool* _target, а как часть самого объекта bool* target. Это указатели на массивы. Осталось только задать значение одного (аргумента) другому
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
21.05.2022, 20:12
Цитата Сообщение от tankoman228 Посмотреть сообщение
и передавался как аргумент номер элемента в массиве, он не записывался в объект (то ли стёр случайно этот кусочек кода, то ли пропустил)
Ну тут я добавлю
C++
1
2
3
4
5
int x;
void foo(int x)
{
    //тут внешний Х не виден совсем, один из твоих кодов так делал
}
там где про int group было
0
Век живи - век тупи
 Аватар для tankoman228
2 / 2 / 2
Регистрация: 12.05.2022
Сообщений: 83
Записей в блоге: 1
21.05.2022, 20:17  [ТС]
Кстати да, такая очепятка имела место быть
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.05.2022, 20:17

Передача массива через указатель в шаблонную функцию
Здравствуйте. В общем есть шаблонный класс List, который является двусвязным списком: template &lt;class Type&gt; class List ...

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

Передача массива структур в функцию через указатель
вот пример куска кода, не могу понять почему ругается на: void Add(student *ptr) { for(int i = 0; i&lt;lim; i++) { ...

Передача умного указателя в функцию принимающую указатель на указатель
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); В случае, когда создаём обычный...

Указатель типа void. Использование косвенного связывания через универсальный указатель
Необходимо использовать косвенного связывания через универсальный указатель, примерный вид: struct обобщение{ключ; void* на что угодно}...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru