Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226

Адреса указателей

31.03.2023, 04:05. Показов 2902. Ответов 42
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Все здравствуйте. У меня такой вопрос, объявляю переменную, глобально(в классе)
C++
1
Vector m_vVictimPos;
из одной функции, этого-же класса, получаю адрес (&) этой переменной
C++
1
Msg("SET [%d]\n", &m_vVictimPos);
результат получаю такой SET [207224512]

из другой функции, этого-же класса, получаю адрес (&) этой-же переменной
C++
1
Msg("GET [%d]\n", &m_vVictimPos);
результат получаю такой GET [207226304]

Т.е. один и тот же адрес получается разный из разных функций. Так и должно быть?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.03.2023, 04:05
Ответы с готовыми решениями:

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей?
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты, для чего используются указатели на...

Почему массив указателей на строки не указывает на адреса?
Почему в этом примере указатель типа char не указывает адрес, а хранит в себе строки? Пример: #include<iostream> using...

Почему адреса у указателей разные, несмотря на то, что они указывают на одну и ту же переменную?
Почему адреса у указателей разные, они же указывают на одну и туже переменную int main() { setlocale(LC_ALL, "Russian"); ...

42
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.04.2023, 20:37
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
все работает
Для одного танка ? Разве это "работает" ?
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
14.04.2023, 07:16  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Потому как проблема на ясна.
Я уже все, в полном смысле слова, разжевал, куда еще больше то?
Может быть тебя в заблуждение вводит название темы, так это название было сначала, когда я даже сам не мог определить как правильно вопрос сформулировать, но по ходу я уже давно определился с сутью вопроса, мы уже давно ушли от начального вопроса, а ты видимо все-еще там остался, я прошу прощения тогда, видимо я так увлекся что уже ничего не замечаю. У тебя есть опыт работы в игрострое? Хотя это не особенно важно сейчас.

Основной вопрос на сейчас - нужен объект-противник(цель).
Из функции управления пушкой танка я не могу получить этот объект, а мне он крайне важен, на нем все управление завязано. Сегодняшний код(кое-что там конечно-же поменялось, честно, я уже и не помню что):
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
// Global 
CBaseEntity* Victime;
bool   m_bTowerEnemy;
bool   g_bTowerRotationCompleted;
bool   g_bBarelRotationCompleted;
 
//-----------------------------------------------------------------------------
// ТЕЛО ТАНКА
//-----------------------------------------------------------------------------
class CNPC_t80u : public CAI_BaseNPC         // CAI_BaseNPC - это основной класс из которого создаются все остальные подклассы
{
    DECLARE_CLASS(CNPC_t80u, CAI_BaseNPC);  
 
    DECLARE_DATADESC();
public:
    CNPC_t80u();
    ~CNPC_t80u();
    Class_T         Classify(void) { return CLASS_MILITARY; };
    void            Precache();
    void            Spawn();
    void            Activate();
 
    CBaseEntity*    Tower;
    CBaseEntity*    Barrel;
 
    void            CameraVision();
    void            TowerRotation(CBaseEntity *pEnemy, bool &centering);
    void            BarrelCameraVision();
    void            BarrelMovement(bool &centering);
 
    void            ShotBarrel(CBaseEntity* Enemy);
    void            Explode(CBaseEntity* Enemy);
    void            BarelKillSpriteGlow();
    void            Attack(CBaseEntity* Victime, float distance, float damage, QAngle &viewPunch, Vector &shove);
    void            CreateExplosion(CBaseEntity* Victime);
 
    //bool            AllowDamage(CBaseEntity *pVictim, const CTakeDamageInfo &info);
 
    /*Луч для тестирования*/
    void            CreateTestBeam(const Vector &StartPos, const Vector &EndPos, const int &r, const int &g, const int &b, const float &width, const int &type);    // для моих проверок (влево-вправо)
 
    float           MaxYawSpeed(void);
    void            Event_Killed(const CTakeDamageInfo &info);
    float           NormalizeAngles(float flAngle);
 
    virtual float   GetIdealSpeed() const;
    virtual float   GetSequenceGroundSpeed(CStudioHdr *pStudioHdr, int iSequence);
 
    virtual void    DeathSound(const CTakeDamageInfo &info);
    virtual void    AlertSound(void);
    virtual void    IdleSound(void);
    virtual void    PainSound(const CTakeDamageInfo &info);
 
    virtual void    HandleAnimEvent(animevent_t *pEvent);
 
 
    //void            Scan();
    //void            ProjectBeam(const Vector &vecStart, const Vector &vecDir, int width, int brightness, float duration);
 
private:
    EHANDLE            m_hVictim;
    Vector             m_vecLastTargetPosition;
    float              m_fBarrelNextShot;
    float              m_flTimeNextPing;
    EHANDLE            m_hParticleEffect;
    float              m_fYaw, m_fPitch;
    bool               m_bBarrelEnemy;
 
};
LINK_ENTITY_TO_CLASS(npc_t80u, CNPC_t80u);
 
BEGIN_DATADESC(CNPC_t80u)
DEFINE_FIELD(m_hParticleEffect, FIELD_EHANDLE),
DEFINE_FIELD(m_fBarrelNextShot, FIELD_TIME),
DEFINE_FIELD(m_flTimeNextPing, FIELD_TIME),
DEFINE_FIELD(m_hVictim, FIELD_EHANDLE),
 
DEFINE_FIELD(m_fYaw, FIELD_FLOAT),
DEFINE_FIELD(m_fPitch, FIELD_FLOAT),
 
DEFINE_THINKFUNC(CameraVision),
DEFINE_THINKFUNC(BarrelCameraVision),
 
END_DATADESC()
 
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
CNPC_t80u::CNPC_t80u() {
    m_fYaw = 0.0;
    m_fPitch = 0.0;
    m_bTowerEnemy = false;
    g_bTowerRotationCompleted = false;
    g_bBarelRotationCompleted = false;
    m_bBarrelEnemy = false;
    Victime = nullptr;
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
CNPC_t80u::~CNPC_t80u() {
    m_fYaw = 0.0;
    m_fPitch = 0.0;
    m_bTowerEnemy = false;
    g_bTowerRotationCompleted = false;
    g_bBarelRotationCompleted = false;
    m_bBarrelEnemy = false;
    Victime = nullptr;
}
 
//-----------------------------------------------------------------------------
// Создание: 
//-----------------------------------------------------------------------------
void CNPC_t80u::Spawn() {
    BaseClass::Spawn();
 
    Precache();
    SetModel(MODEL_T80U_BODY);
    SetHullType(HULL_164_378_134);  //определён в hull.h
    SetNavType(NAV_GROUND);
    m_NPCState = NPC_STATE_NONE;
 
    SetClassname("t80u_Body");
 
    m_iHealth = m_iMaxHealth = sk_t80u_health.GetInt();
    m_flFieldOfView = 0.2;
 
    SetSolid(SOLID_BBOX);
    AddSolidFlags(FSOLID_NOT_STANDABLE);
    SetMoveType(MOVETYPE_STEP);
    SetBloodColor(DONT_BLEED);
    AddEFlags(EFL_NO_DISSOLVE);
 
    CapabilitiesClear();
    //CapabilitiesAdd(bits_CAP_MOVE_GROUND); // NPC может пермещаться по земле
 
    Tower = (CNPC_t80u*)CreateEntityByName("prop_dynamic_override");  //Башня
    if (Tower) {
        Vector TowerPos; QAngle TowerAngle;
        GetAttachment(ATTACHMENT_TOWER, TowerPos, TowerAngle);
        Tower->KeyValue("model", MODEL_T80U_TOWER);
        Tower->SetClassname("t80u_Tower");
        Tower->SetAbsOrigin(TowerPos);
        Tower->SetParent(this);
        DispatchSpawn(Tower);
        Tower->Activate();
        Tower->SetThink(&CNPC_t80u::CameraVision);   // Функция Сканер для Башни
        Tower->SetNextThink(gpGlobals->curtime + 0.1);
 
        
        Barrel = (CNPC_t80u*)CreateEntityByName("prop_dynamic_override");  // Пушка
        if (Barrel) {
            Vector  BarrelPos; QAngle   BarrelAngle;
            GetAttachment(ATTACHMENT_BARREL, BarrelPos, BarrelAngle);
            Barrel->KeyValue("model", MODEL_T80U_BARREL);
            Barrel->SetClassname("t80u_Barrel");
            Barrel->SetAbsOrigin(BarrelPos);
            Barrel->SetParent(Tower);
            DispatchSpawn(Barrel);
            Barrel->Activate();
            Barrel->SetName(GetEntityName());
            Barrel->SetThink(&CNPC_t80u::BarrelCameraVision);   // Функция Сканер для Пушки. Вот из этой функции переменные класса CNPC_t80u не видны вообще, никакие.
            Barrel->SetNextThink(gpGlobals->curtime + 0.01);
        }
 
        m_fBarrelNextShot = gpGlobals->curtime;
        m_flTimeNextPing = gpGlobals->curtime;
        NPCInit();
    }
}
Добавлено через 18 минут
Мне нужно получить из функции BarrelCameraVision противника Victime, который у меня сейчас в глобале.

Если я его объявляю внутри класса, его не видно из этой функции, я уже не буду приводить примеры как там я его пытался получить, но возвращалось всегда.... не буду выражаться. Соответственно игра просто ломалась с вылетом на раб. стол, молчком.
Поэтому я пока остановился на глобальных, с ними да, все работает, все отлично, это как переходный вариант, что бы отладить все остальное и не зависать на этом кусочке кода(хотя если я с ним разберусь, а я разберусь - масса проблем решится сама собой, но это нужно время или рабочие примеры - образец, в Source движке(HL2) таких нет, я не вижу, там вообще нет танков и пушек, если и есть - сделаны по другому принципу - на контроллерах 3Dмодели).
Но вот сейчас я уже вижу ошибку, связанную с таким вариантом, все отлично пока танк один, но как только их будет > 1 проблем станет просто куча, все эти танки будут пытаться использовать глобальные переменные и объект-противник, со всеми вытекающими.
Нужно как то привязать эти переменные и этот объект к классу(для примера Victime[CNPC_t80u] ("Pawn")).
Конечно, проще всего объявить внутри класса, но тогда их не видно из функции управления пушкой, в этом моя основная проблема.

Повторюсь - сейчас, пока танк один, все работает просто на отлично, даже намного лучше чем на pawn.

Добавлено через 23 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
Для одного танка ? Разве это "работает" ?
А почему не работает?
Я ведь все-равно разберусь с этой проблемой, никуда она не денется - поломается, поломается и отдастся, она не первая, и не таких уламывал.
Помимо нее еще много что нужно протестировать, да и просто проверить, а я завис на этой беде.
К ней я в любом случае вернусь, придётся вернуться.

Ты бы лучше что нибудь конкретное предложил, а то я пока, кроме как индексацию, ничего от тебя не вижу.
Индексация, конечно, оптимальнейший вариант, но мне до этого как до Парижа, сам понимаешь.

Предложений типа "нужно в школу, 7 класс геометрии" и т.д. и т.п. не пиши больше, есть предложения, примеры - пожалуйста, пиши. Форум то для чего вообще нужен? Себя показать, поумничать - конечно нет, не для этого.
Давай советы, жду, надеюсь.

Добавлено через 22 минуты
Кстати, самое главное! Продолжение моего монолога c самим собой:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        Barrel = (CNPC_t80u*)CreateEntityByName("prop_dynamic_override");
        if (Barrel) {
            Vector  BarrelPos; QAngle   BarrelAngle;
            GetAttachment(ATTACHMENT_BARREL, BarrelPos, BarrelAngle);
            Barrel->KeyValue("model", MODEL_T80U_BARREL);
            Barrel->SetClassname("t80u_Barrel");
            Barrel->SetAbsOrigin(BarrelPos);
            Barrel->SetParent(Tower);
            DispatchSpawn(Barrel);
            Barrel->Activate();
            Barrel->SetName(GetEntityName());
            Barrel->SetThink(&CNPC_t80u::BarrelCameraVision);   // Сканер работает с центра пушки
            Barrel->SetNextThink(gpGlobals->curtime + 0.01);
        }
Если я не назначаю пушке(SetParent) родителя башню, или вообще не назначаю родителя, или же родителем будет Body(гусеницы) - все становится нормально, но пушка же, по идее, не может валяться на земле(может конечно, даже стрелять будет).

Что-то из-за дерева аттачей, я думаю.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.04.2023, 08:44

Не по теме:

Цитата Сообщение от tonline_kms65 Посмотреть сообщение
мы уже давно ушли от начального вопроса, а ты видимо все-еще там остался, я прошу прощения тогда, видимо я так увлекся что уже ничего не замечаю.
Тут надо было тему новую создать, если изначальный вопрос был решен или стал неактуален. Правила форума все-таки не надо нарушать. Тогда и ситуаций таких не будет. Людям за разбор многостраничных текстов и выделения из них сути дела платят нормальные деньги, а тут бесплатно все как бы. Так что не ждите от людей этого. Кто-то может и делает это здесь все равно, но вы не ждите. Просто следуйте правилам форума и правилам (хорошего тона) при создании тем и меньше будет проблем и конфликтов и для вас и для остальных.



Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Нужно как то привязать эти переменные и этот объект к классу(для примера Victime[CNPC_t80u] ("Pawn")).
Можно не заниматься такой привязкой вообще. Потому что это сильно снижает гибкость кода, танк же не одну цель в идеале поражает, а разные. Можно конечно каждый раз перепривязывать танк к другой цели, но это же лишнее состояние. Чем больше состояний, чем труднее их держать в согласованном виде. Так что можно вообще вынести эту логику во внешнюю сущность. В смысле везде у танка, где требуется взаимодействие танка и цели, просто передавать цель как параметр соответствующего метода. А заведовать передачей туда цели будет некий контроллер или арбитр, у которого есть и список целей и список танков, и написана логика, которая позволяет устраивать им "очную ставку" в определенных ситуациях. Это общий подход.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.04.2023, 08:44

Как создать массив указателей на объекты базового класса, которым присвоить адреса объектов производных классов?
Я вас категорически приветствую!) НА повестке дня вот такая задача по наследованию: "Создать базовый класс ПЕЧАТНАЯ ПРОДУКЦИЯ...

Создать массив указателей базового класса и присвоить ему адреса каждого из екземпляров класса
Всем привет. Есть условие задачи: Дан базовый класс Base у которого есть метод my_name, метод выводит сообщение This is Base class. От...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си)
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе указателя на int нужна звёздочка (*), а...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей. Эта специализация...


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

Или воспользуйтесь поиском по форуму:
43
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru