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

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

31.03.2023, 04:05. Показов 2905. Ответов 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
99 / 74 / 28
Регистрация: 30.03.2023
Сообщений: 206
31.03.2023, 10:46
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от leproza Посмотреть сообщение
В классе CNPC_t80u заводишь поле (и сеттеры с геттерами)
Сам себя процитирую. Или мне надо было написать:
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
//-----------------------------------------------------------------------------
// ТЕЛО ТАНКА
//-----------------------------------------------------------------------------
class CNPC_t80u : public CAI_BaseNPC         //CAI_BaseActor
{
    DECLARE_CLASS(CNPC_t80u, CAI_BaseNPC);  // CAI_BaseActor);
    DECLARE_DATADESC();
public:
    CNPC_t80u();
    ~CNPC_t80u();
    Class_T         Classify(void) { return CLASS_MILITARY; };
    void            Precache();
    void            Spawn();
    void            Activate();
 
    void            CameraVision(void);                           // поиск противников
    void            TowerRotation(CBaseEntity *pEnemy); // поворот башни танка
    void            BarrelMovement(void);                       // подъём ствола(пушки танка)
 
    void            ShotBarrel(CBaseEntity *pEnemy, const Vector ShotPos);
    void            Explode(CBaseEntity *pEnemy, const Vector ShotPos);
 
                                /*Тестирование*/
    void            CreateTestBeam(const Vector &StartPos, const Vector &EndPos, const int &r, const int &g, const int &b, const float &width, const int &type);    // для моих проверок (влево-вправо)
 
    float           NormalizeAngles(float flAngle);
 
    
    Vector          m_vVictimPos;   
 
private:
    Vector   m_vecLastTargetPosition;
    float    m_fBarrelNextShot;
    float    m_flTimeNextPing;
    int      m_iAttackLayer;
    EHANDLE  m_hParticleEffect;
    float    fYaw, fPitch;
    
 
protected:
    float    m_flSensingDist;
    Vector   m_vecLightOffset;
    CBaseEntity *m_pNearestEnemy;
 
 
};
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_THINKFUNC(CameraVision),
    DEFINE_THINKFUNC(BarrelMovement),
    //DEFINE_ENTITYFUNC(CameraVision),
    //DEFINE_ENTITYFUNC(BarrelMovement),
 
END_DATADESC()
 
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
CNPC_t80u::CNPC_t80u() {
    fYaw   = 0.0;
    fPitch = 0.0;
    m_pNearestEnemy = nullptr;
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
CNPC_t80u::~CNPC_t80u() {}
 
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CNPC_t80u::Precache(){
    BaseClass::Precache();
    PrecacheModel(MODEL_T80U_BODY);
    PrecacheModel(MODEL_T80U_TOWER);
    PrecacheModel(MODEL_T80U_BARREL);
 
    // Activities
    //ADD_CUSTOM_ACTIVITY(CNPC_t80u, ACT_T80U_OPEN);
 
    PrecacheScriptSound("CNPC_t80u.ShotBarrel");
    PrecacheScriptSound("CNPC_t80u.ShotBarrelExplode");
    PrecacheScriptSound("NPC_FloorTurret.Ping");
 
    PrecacheParticleSystem(PARTICLE_GAS);
    PrecacheParticleSystem(PARTICLE_STEAM);
    PrecacheParticleSystem(PARTICLE_EXP);
    PrecacheParticleSystem(PARTICLE_EXP_SMOKE);
 
    PrecacheModel(GROUNDTURRET_BEAM_SPRITE);
    PrecacheModel("sprites/laser.vmt");
}
 
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
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);
 
    CBaseEntity *pTower = CreateEntityByName("prop_dynamic_override");
    if (pTower) {
        Vector TowerPos; QAngle TowerAngle;
        GetAttachment(ATTACHMENT_TOWER, TowerPos, TowerAngle);
        pTower->KeyValue("model", MODEL_T80U_TOWER);
        pTower->SetClassname("t80u_Tower");
        pTower->SetAbsOrigin(TowerPos);
        pTower->SetParent(this);
        DispatchSpawn(pTower);
        pTower->Activate();
        pTower->SetThink(&CNPC_t80u::CameraVision);   // Сканер работает с Башни
        pTower->SetNextThink(gpGlobals->curtime + 0.1);
 
    CBaseAnimating *pBarrel = (CBaseAnimating *)CreateEntityByName("prop_dynamic_override");
    if (pBarrel) {
        Vector  BarrelPos; QAngle   BarrelAngle;
        GetAttachment(ATTACHMENT_BARREL, BarrelPos, BarrelAngle);
        pBarrel->KeyValue("model", MODEL_T80U_BARREL);
        pBarrel->SetClassname("t80u_Barrel");
        //pBarrel->SetOwnerEntity(this);
        pBarrel->SetAbsOrigin(BarrelPos);
        pBarrel->SetParent(pTower);
        DispatchSpawn(pBarrel);
        pBarrel->Activate();
        pBarrel->SetName(GetEntityName());
        pBarrel->SetThink(&CNPC_t80u::BarrelMovement);   // Сканер работает с центра пушки
        pBarrel->SetNextThink(gpGlobals->curtime + 0.1);
    }
 
    m_fBarrelNextShot = gpGlobals->curtime;
    m_flTimeNextPing = gpGlobals->curtime;
    NPCInit();
    }
}
 
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CNPC_t80u::Activate() {
    BaseClass::Activate();
}
 
//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
float CNPC_t80u::NormalizeAngles(float flAngle) {
    while (flAngle > 180.0) flAngle -= 360.0;
    while (flAngle < -180.0) flAngle += 360.0;
    return flAngle;
}
 
//-----------------------------------------------------------------------------
// Purpose: Сканер для танка(вправо-влево) с башни танка
//-----------------------------------------------------------------------------
void CNPC_t80u::CameraVision(void) {
    SetNextThink(gpGlobals->curtime + 0.1);
    
    if (gpGlobals->curtime >= m_flTimeNextPing) {
        EmitSound("NPC_FloorTurret.Ping");
        m_flTimeNextPing = gpGlobals->curtime + 1.0f;
        //Scan();   
    }
 
    Vector  barrelDir;
    AngleVectors(GetAbsAngles(), &barrelDir);
 
    CBaseEntity *pList[64];
    CBaseEntity *pNearestEnemy = NULL;
 
    Vector range(2000, 2000, 600);
    int count = UTIL_EntitiesInBox(pList, ARRAYSIZE(pList), GetAbsOrigin() - range, GetAbsOrigin() + range, FL_NPC|FL_CLIENT);
 
    float fClosestDistance = 10000.0, fEnemyDistance;
    Vector center_pos, enemy_pos, targetDir;
    
    //Выполнить итерацию по всем возможным целям   
    for (int i = 0; i < count; i++) {   
        if (pList[i]->Classify() != CLASS_MILITARY) {
            if ((pList[i] != this) && (pList[i]->GetMoveType() == MOVETYPE_STEP)) {
                //CBaseEntity *pPlayer = UTIL_PlayerByIndex(i);
                //CBaseEntity* index = UTIL_EntityByIndex(pList[i]);
 
                enemy_pos = pList[i]->GetAbsOrigin();                    // позиция противника
                enemy_pos.z += 50.0;
                fEnemyDistance = (GetAbsOrigin() - enemy_pos).Length();  // дистанция до противника
                center_pos = GetAbsOrigin();  // 
                targetDir = enemy_pos - center_pos;                      // вектор направления выстрела
                VectorNormalize(targetDir);
                 /*Получение ближайшего противника*/
.........
.....
...
.
    
    if (pNearestEnemy) {  // Если ближайший противник(pNearestEnemy) найден
        //Msg("ENEMY %s\n", pNearestEnemy->GetClassname());
        Vector nearest_enemy_pos = pNearestEnemy->GetAbsOrigin();
        nearest_enemy_pos.z += 50.0;
        
        Vector *SetVictimPos = &m_vVictimPos;  //  
        *SetVictimPos = nearest_enemy_pos;
        Msg("SET X %0.02f Y %0.02f [%d]\n", m_vVictimPos.x, m_vVictimPos.y, &m_vVictimPos);
        
        //SetEnemy(pNearestEnemy);
        TowerRotation(pNearestEnemy);
        CreateTestBeam(center_pos, nearest_enemy_pos, 255, 145 + random->RandomInt(-16, 16), 0, 0.5, 0);
    } else pNearestEnemy = NULL;
  m_pNearestEnemy = pNearestEnemy;
}
 
//------------------------------------------------------------------------------
// Purpose : Поворот башни в направлении противника
// Input   :
// Output  :
//------------------------------------------------------------------------------
void CNPC_t80u::TowerRotation(CBaseEntity *pEnemy) {
    if (pEnemy) {
        float speed_rotate = sk_t80u_speed_turn_Yaw.GetFloat();
        Vector  towerDir;
        AngleVectors(GetAbsAngles(), &towerDir);
        VectorNormalize(towerDir);
        
        //Vector enemy_pos = pEnemy->GetAbsOrigin();  // позиция цели
        Vector enemy_pos = pEnemy->GetAbsOrigin();  // позиция цели
        Vector center_pos = GetAbsOrigin();         // позиция центра поворота башни
 
        Vector targetDir = enemy_pos - center_pos;  // вектор направления выстрела
        VectorNormalize(targetDir);
 
        float yaw_delta = (towerDir.y - targetDir.y);    // разница углов   'ПРАВО-ЛЕВО(горизонталь)
 
        float compare;
        if (yaw_delta < 0) compare = yaw_delta * -1.0;
        else               compare = yaw_delta;
        if (compare <= 0.005) return;
 
        if      (yaw_delta < 0)  fYaw += (yaw_delta / 360) *gpGlobals->curtime + speed_rotate;   // отрицательный
        else if (yaw_delta > 0)  fYaw -= (yaw_delta / -360)*gpGlobals->curtime + speed_rotate;   // положительный
 
        QAngle rotate = this->GetAbsAngles();
        rotate.x = 0.0;
        rotate.y = fYaw;
        rotate.z = 0.0;
        SetAbsAngles(rotate);
 
        CreateTestBeam(center_pos, enemy_pos, 0, 250 + random->RandomInt(-100, 100), 0, 0.5, 1);
        //SetEnemy(pEnemy);
    } else {
        //Msg("Error Rotate Tower!\n");
    }
}
 
//------------------------------------------------------------------------------
// Purpose : Поворот пушки в направлении противника
// Input   :
// Output  :
//------------------------------------------------------------------------------
void CNPC_t80u::BarrelMovement(void) {
    //TODO: use m_pNearestEnemy here
    SetNextThink(gpGlobals->curtime + 0.1);
    float speed_rotate = sk_t80u_speed_turn_Pitch.GetFloat();   
    
    //CBaseEntity*pE = GetVictim();
    Vector center_pos = GetAbsOrigin(); // позиция центра подъёма пушки
 
    QAngle GunAnsles = GetAbsAngles();
    Vector GunDir;
    AngleVectors(GetAbsAngles(), &GunDir);
    VectorNormalize(GunDir);    
    
    Vector *vGetVictimPos = &m_vVictimPos; // * возвращает адрес в памяти, извлекает данные   & - узнаёт её адрес в памяти
    Vector enemy_pos = *vGetVictimPos;
    
    //Vector enemy_pos = m_vVictimPos;
    Msg("GET X %0.02f Y %0.02f [%d]\n", m_vVictimPos.x, m_vVictimPos.y, &m_vVictimPos);
 
    Vector targetDir = enemy_pos - center_pos; // вектор направления выстрела
    VectorNormalize(targetDir);
 
    float pitch_delta = NormalizeAngles(GunDir.x - targetDir.x); // разница углов   'ПРАВО-ЛЕВО(горизонталь)
    //Msg("Delta %f\n", yaw_delta);
 
 
    float compare;
    if (pitch_delta < 0) compare = pitch_delta * -1.0;
    else compare = pitch_delta;
    
    Vector end_pos;
    if (compare <= 0.005) { //
        //Msg("Stop %f", yaw_delta);
        if (m_fBarrelNextShot < gpGlobals->curtime) {
            trace_t tr;
            UTIL_TraceLine(center_pos, (center_pos - enemy_pos * 3000.0), MASK_SOLID_BRUSHONLY, this, COLLISION_GROUP_NONE, &tr);
            if (tr.fraction != 1.0) end_pos = tr.endpos;
            //ShotBarrel(pEnemy, end_pos);
        }
        return;
    }
    if      (pitch_delta > 0) fPitch += (pitch_delta / 360)  * gpGlobals->curtime + speed_rotate; // отрицательный
    else if (pitch_delta < 0) fPitch -= (pitch_delta / -360) * gpGlobals->curtime + speed_rotate; // положительный
 
    GunAnsles.x = fPitch;
    //rotate.y = 0.0;
    //rotate.z = 0.0;
    SetAbsAngles(GunAnsles);
 
    CreateTestBeam(center_pos, enemy_pos, 20, 145 + random->RandomInt(-16, 16), 255, 1.0, 2);
}
?
Ну, считай дифф
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
31.03.2023, 10:52  [ТС]
Но это внутри функции, я его передаю по ссылке в функцию поворота башни, проблем нет и все работает.
Пушка это другая функция, в которую я не могу передать, не позволяет SetThink (подобие updater или timer в Pawn'е)

Вот и получаю головняк.

Добавлено через 1 минуту
Ща, погодь, обмозгую. Пока не соображу.
0
99 / 74 / 28
Регистрация: 30.03.2023
Сообщений: 206
31.03.2023, 10:54
Блин, дружище, ты чего?
m_vVictimPos ты же умудрился, как ты выражаешься, "передать"? В чем проблема по аналогии сделать еще одно поле? Я же все в коде написал. Посмотри на строчку 43 и дальше ищи использование поля с таким именем.
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
31.03.2023, 10:56  [ТС]
Все, вижу. Ты его в конструктор запихал.
А почему в защищенном?

Координаты это хорошо конечно, но сам противник, полностью, куда лучше, я с него могу получить все что мне нужно, в том числе и координаты.
0
99 / 74 / 28
Регистрация: 30.03.2023
Сообщений: 206
31.03.2023, 11:00
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Все, вижу. Ты его в конструктор запихал.
нет, я положил его в описание класса. А в конструкторе нулем инициализировал, только и всего.

Цитата Сообщение от tonline_kms65 Посмотреть сообщение
А почему в защищенном?
Ну, в публичном ему точно делать нечего - для этого сеттеры и геттеры делают. А приват - ... Ну, кто его знает, какую ты цепочку наследований будешь собирать, protected в этом плане большую вариативность дает. А если никакого наследования не будет - то и разницы между private и protected тоже
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
31.03.2023, 14:31  [ТС]
leproza,

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

Добавлено через 3 часа 28 минут
leproza,

Посмотрел, нет, не то, игра просто вылетает на раб. стол без ошибок.
Я, кстати, с этого и начинал, так же игра вылетала, поэтому и переключился на указатели, а дальше пошло-поехало.....

У меня появилась такая мысль, может быть ну его на... эти родные, хайфловские функции, сделать простую рекрусию своей функции CameraVision и тогда точно не должно быть проблем.
Правда возникает вопрос, как на плюсах правильно запустить функцией саму себя, главное с передачей переменных в саму себя, интересно, возможно такое или нет.
Такая конструкция будет работать или нет? Как её правильно соорудить?

C++
1
2
3
4
5
6
7
8
9
//-----------------------------------------------------------------------------
// Purpose: Сканер для танка(Yaw вправо-влево)
//-----------------------------------------------------------------------------
void CNPC_t80u::CameraVision(CBaseEntity *pTower, CBaseAnimating *pBarrel) {
    if (gpGlobals->curtime >= m_flTimeNextPing) {
        CNPC_t80u::CameraVision(pTower, pBarrel);
        Msg("%0.02f", m_flTimeNextPing);
        m_flTimeNextPing = gpGlobals->curtime + 1.0f;
}
0
99 / 74 / 28
Регистрация: 30.03.2023
Сообщений: 206
31.03.2023, 14:42
Ну, рекурсию-то можно:
C++
1
2
3
4
void f( int x )
{
  if( x > 2 ) f( x - 1 );
}
Но я не понимаю, что в твоем случае должно происходить в ней. Код, что ты показал - просто загонит m_flTimeNextPing... И чего ты этим добьешься?

Цитата Сообщение от tonline_kms65 Посмотреть сообщение
игра просто вылетает на раб. стол без ошибок.
Надо добавлять лог, отключать поэлементно изменения и смотреть, из-за чего падает.
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
31.03.2023, 16:26  [ТС]
leproza, Это же, как-бы, шаблон рекрусии.
Внутри будет то же самое что и в основной ф-ии.
Что там загонится, сделаю обнуление, это не есть проблема, главное чтобы заработала.
Рекрусии это как независимый вариант.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
31.03.2023, 17:29
tonline_kms65, кажется мне, что вы лечите симптомы.

Вы говорили что работали с неким игровым движком ?
В нем игровые объекты имели собственный ID (идентификатор).
Если вы пишите в том же архитектурном стиле, то логично создать регистратор таких объектов.
И через него и получать доступ к ним.
Это не будет разрушать привычный вам способ программирования игрового процесса, а другие приемы можно освоить по ходу.
На самом деле это не так сложно, как вам кажется.
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
01.04.2023, 06:59  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
На самом деле это не так сложно, как вам кажется.
Так как я плюсы знаю только на "ВЫ", об этом не может быть и речи. Я такого могу наворотить.....

Цитата Сообщение от leproza Посмотреть сообщение
Но я не понимаю, что в твоем случае должно происходить в ней. Код, что ты показал - просто загонит m_flTimeNextPing... И чего ты этим добьешься?
Твоя правда, а я по привычке, уже и забыл что там были таймеры, и на таймерах была некая пародия на рекрусию, таймер отдельным потоком. Так что здесь рекрусия, в полном её виде, отменяется напрочь.

Вот что я точно заметил, сама ошибка с вылетом игры случается только в тот момент, когда я пытаюсь обратиться к переменной
C++
1
2
3
4
5
6
7
protected:
....... 
        float    m_flSensingDist;
    Vector   m_vecLightOffset;
    CBaseEntity* m_pNearestEnemy;  //  <- к этой переменной
};
LINK_ENTITY_TO_CLASS(npc_t80u, CNPC_t80u);
из функции управления пушкой
C++
1
2
3
4
5
6
7
8
void CNPC_t80u::BarrelMovement(void) {
    SetNextThink(gpGlobals->curtime + 0.1);
    float speed_rotate = sk_t80u_speed_turn_Pitch.GetFloat();   
    
    CBaseEntity*Victime = m_pNearestEnemy;  // Вот здесь ошибка
.....
...
.
И эта ошибка не из-за твоего кода, здесь хоть как меняй - вылет игры на раб стол 100%.
Такое чувство что не прекешены файлы модели, точно так же вылетает, но при отсутствии прекеша хоть сообщение есть.
А здесь молчком.
Кстати, к моему стыду, я не могу вывести ошибку в логи, никогда этого не делал, не было такой необходимости, я никогда так не зависал, как сейчас в этих плюсах.

Добавлено через 19 минут
SmallEvil,
По большому счету, проблема возникает только в таком случае как этот, запись и получение данных из "глобальной переменной"(не знаю как её правильно назвать), все остальное работает отлично и без проблем, принцип программирования один и тот-же, везде.
Мне нужно понять как можно создать доступную переменную, которая доступна из всех нужных мне функций, хоть и слышу что это не лучший вариант, но пока, для себя, я вижу проблему именно в этом.

В самом движке, HL2, управление моделью построено на контроллерах 3d модели(не нужно внутри класса создавать подклассы что бы потом думать как ими управлять, то что у меня сейчас и получилось), но меня такой вариант мало устраивает, это сложность в компилировании самой 3D модели(создании контроллеров), ограниченность в использовании анимаций(нужно постоянно что-то с чем-то блендить), я уже давно пошел по пути разделения модели на независимые части, склеить их в коде можно либо на аттачах, либо просто слиянием костей, управляемость намного лучше, анимации самостоятельны.
Но это только то, что не касается "характеров", с ними уже отдельная тема, если делать по моему варианту - получится "смех и грех".

Добавлено через 1 час 20 минут
А может быть переменная CBaseEntity* m_pNearestEnemy; просто "затирается" из какой то другой ф-ии?
Такое же может быть?
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
05.04.2023, 16:34  [ТС]
Прошла масса времени но я так и не разобрался, точно, как решить эту проблему.
Зато я узнал для себя, какие возникают ошибки.

- Сначала я думал, что создавая башню танка я создаю класс, создавая пушку тоже самое, но сейчас я практически уверен, что создавая башню я создаю не класс а обект, то же самое с пушкой, создаю не класс а объект объекта башня(наверно подобект).
- Из объекта башня видно все перенные, так как я их передаю по ссылке.
А вот из объекта пушка не видно вообще никаких переменных, возвращает нули, пушка существует сама по себе, просто держится на аатаче к башне. Что бы я ни делал результат нулевой, прихожу к уверенности что что то неверно с созданием пушки.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
05.04.2023, 16:54
tonline_kms65,

Может нарушено правило Трех ?
Это зависит от структуры вашего класса и то как он создается и используется.
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
11.04.2023, 08:59  [ТС]
Прошло еще больше времени, нигде ни ответа ни привета, странно, ездил в наш политен - никто, ничего не понял. Тишина.

Я, пока, все нужные мне параметры передаю через глобальные переменные. Понимаю что это ни есть хорошо, но мне нужно дальше идти, делать свой npc_танк, а так я могу сидеть над этой проблемой как кащей еще год.

Всё больше прихожу к убеждению - насколько лучше, надежнее и понятнее передача значений из функций в функции по ссылкам.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Может нарушено правило Трех ?
Честно сказать - ничего не понял из сказанного, а времени углублённо вчитываться просто нет.
Пока буду делать так как мне понятно, по ходу что нибудь да родится, возможно и понимание придёт, от чего такая проблема возникла.
Я думаю что проблема возникла именно из-за дерева приаттачивания, "родитель"->"ребенок"->"внук"(как-то так).
У меня на Pawn'е такая проблема в начале появлялась, но как-то я её решил, давно это было, уже и не вспомню.
Сейчас же ситуация такая - "родитель" отлично управляем, "ребенок" так-же всё без проблем, а вот с "внуком" проблема есть, он ничего не видит, вообще ничего, кроме глобальных.

У меня есть еще сомнения насчет самой 3d модели "внука"(пушки), может быть что-то не так с углами(костями), будет время я проверю эту версию, обязательно, потому что сейчас дельту я получаю неточную, соответственно пушка наводится либо чуть выше, либо чуть ниже цели. Если вектора направлений не нормализовать - там вообще, получается, туши свет.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.04.2023, 12:04
tonline_kms65, я включился независимо и в самом конце. Я не политеновец но тоже не пойму. А они будучи:
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
политене люди глупее тебя
не поняли в прямом контакте... Ищите проблему не во внешнем мире.
Я попробую разобрать, но вообще, это вряд ли поможет так как вы пишете кучу кода не имея понятия о языке. Это общиц подход и его нужно менять. Но к теме. Вот объект, адрес которого вы определяете:
C++
1
Vector m_vVictimPos;
это поле объекта класса CNPC_t80u. Однако метода Msg (const char*, const Vector &) [или около того] я не нашёл. Где он, - покажите как вы его объявили.

И ещё. Это высокоуровневый вопрос. Он не по С++, но может оказаться существеннее. Почему не отслеживать объект врага захваченный прицелом? Зачем отрывать координаты и хранить и обрабатывать их отдельно, создавая параллельные сущности, которые проблемно будет синхронизировать?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
11.04.2023, 14:51
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Всё больше прихожу к убеждению - насколько лучше, надежнее и понятнее передача значений из функций в функции по ссылкам.
В классах все тоже самое, те же функции, ничего нового нет.
Кроме того что каждый класс может владеть своими ресурсами, а функции нет.

Цитата Сообщение от tonline_kms65 Посмотреть сообщение
никто, ничего не понял. Тишина.
Ночь И Тишина, Данная Навек.
Дождь, А Может Быть Падает Снег.
Всё Равно, Бесконечной Надеждой Согрет,
Я Вдали Вижу Город, Которого Нет
Что то сильно напомнило эту песню, все так же грустно и необратимо.

Начинайте сначала. Вы пытаетесь использовать ООП не зная что это такое.

И наконец, каждый класс, модуль, нужно тестировать отдельно. Если есть такая возможность.
Или с минимальным набором необходимых классов.
Вы это делали ?
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
13.04.2023, 05:10  [ТС]
Вроде разобрался с тем что мне нужно. Пока оставлю глобальные переменные, а там "будет день - будет пища".

https://youtu.be/Xg9S0nZAM6g

IGPIGP, SmallEvil,

Большое спасибо за ответы по сути, без балабольства.

IGPIGP,
Цитата Сообщение от IGPIGP Посмотреть сообщение
это поле объекта класса CNPC_t80u. Однако метода Msg (const char*, const Vector &) [или около того] я не нашёл. Где он, - покажите как вы его объявили.
И ещё. Это высокоуровневый вопрос. Он не по С++, но может оказаться существеннее. Почему не отслеживать объект врага захваченный прицелом? Зачем отрывать координаты и хранить и обрабатывать их отдельно, создавая параллельные сущности, которые проблемно будет синхронизировать?
Особенно заинтересовало это "Почему не отслеживать объект врага захваченный прицелом?"
Я это и пытаюсь делать - но не могу, сам объект найден(pNearestEnemy, в глобале он же Victime), но как его использовать - непонятно. Хоть я и слабо знаком с плюсами, но я прекрасно понимаю цель которая мне нужна.
Согласен что мой начальный язык меня здесь сильно путает.

Сейчас я остановился на самом начальном варианте(понимаю, что может быть и тупо, но это работает и работает отлично), это глобальная переменная - противник(Victime):
до описания класса
C++
1
CBaseEntity*    Victime;
функция получения ближайшего противника записываю его в эту пременную, что бы не потерять
C++
1
2
3
4
5
6
    if (pNearestEnemy) {  // если есть ближайший к танку противник(pNearestEnemy - это и есть то, что нужно куда то записать)
        m_bTowerEnemy = true;
        Vector nearest_enemy_pos = pNearestEnemy->GetAbsOrigin();
        nearest_enemy_pos.z += 50.0;
        CreateTestBeam(center_pos, nearest_enemy_pos, 255, 0, 0, 2.5, 0); // Красный - Указатель Башни на ближайшего противника
        Victime = pNearestEnemy; // ВОТ ЭТО ТО, ЧТО МНЕ НУЖНО
И уже после я могу получать этот объект-противника(Victime) из любой функции, из него уже могу получить всё что угодно, координаты, углы, скорость, и т.д. и т.п.
Вот это то, что мне и нужно было.


Кстати, я же не зря создал тему в этом разделе.
Я очень даже неплохо знаком с игростроем(всем что с этим связано), но разница в знании языков вынуждает создавать тему здесь.
Это как приехать в другую страну, с другим языком - говорим, вроде, об одном и том же, но не понимаем друг друга.


Добавлено через 7 минут
Цитата Сообщение от SmallEvil Посмотреть сообщение
И наконец, каждый класс, модуль, нужно тестировать отдельно. Если есть такая возможность.
Или с минимальным набором необходимых классов.
Вы это делали ?
Ты всерьёз думаешь что у меня есть столько времени?
Бесполезное и в данный момент, для меня, бессмысленное занятие, я и так почти 2 недели потерял, вот если бы я занимался изучением этого языка всерьёз, тогда конечно, но сейчас мне это не нужно, не получится так - сделаю по другому.
А по ходу будет видно что мне нужно а что нет.
Насчет ООП - мне это очень и очень не нравится, но это моё, личное мнение.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.04.2023, 08:36
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Бесполезное и в данный момент, для меня, бессмысленное занятие, я и так почти 2 недели потерял
Вы не правильно все понимаете, без тестирования, вот именно так все и будет.
Будете в пустую отлаживать нерабочие программы.
Как вы себе представляете программирование без тестирования ?

"Написали и оно сразу работает ?"
Так бывает лишь в простых задачах, и даже в них есть ошибки.
Без тестирования ничего не будет работать, никогда.

Добавлено через 2 минуты
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Насчет ООП - мне это очень и очень не нравится, но это моё, личное мнение.
Так зачем же вы его мучаете ?
Есть же другие концепции (в игрострое в том числе).
Один из них ECS, Entity component system
Есть неплохие статьи по нем.

Добавлено через 1 минуту
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Бесполезное и в данный момент, для меня, бессмысленное занятие, я и так почти 2 недели потерял
Писать на С++ такие вещи без знания ЯП и то как в нем реализован ООП :
Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Бесполезное и в данный момент, бессмысленное занятие
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
13.04.2023, 12:11  [ТС]
Все коды давным давно мною отработаны, это же всё мои функции, причем тестировал их в мультиплеере, в сингле намного проще, а это сингл.
Родные, хайфловские я так и не понял как работают, поэтому отказался от них.
Те задачи, которые мне сейчас нужны, в них возможны какие то ошибки в перспективе, как например глобальные переменные, но пока я не вижу повод для особого беспокойства.
Насчёт ООП - мне все равно в чем работать, есть задача, есть движек, если движек на c++ буду работать в нем, вообще по барабану, будет Шарп, lua(главное что бы сидобный язык был) - буду в них.

Если реально нужно будет изучить что то для этой задачи - придется изучать, хотя нет никого желания ковыряться во всяких API - жизни не хватит.

Добавлено через 2 часа 26 минут
Между прочим, никто не заметил вероятной ошибки, касаемо этой переменной(Victime) в глобале.
До меня только дошло, это хорошо сейчас работает, пока танк один, но если этих танков будет 2 или больше, они все будут использовать одну и ту же(т.е. одного и того же противника).
Надо будет проверить, хотя мне уже и так видно. Придется как то привязать эту переменную к создаваемому классу. Если это будет так, то получится замкнутый круг, я опять вернулся туда же.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.04.2023, 16:34
Цитата Сообщение от SmallEvil Посмотреть сообщение
Есть же другие концепции (в игрострое в том числе).
Один из них ECS, Entity component system
В любом случаи это вам сейчас не поможет, без знаний ЯП и алгоритмики (организация ООП, работа с памятью, время жизни объектов, структуры данных, их свойства и ассимптотику).
Не верю я что вы с опытом по геймдеву (не знаю на чем), вообще без понятия что все это значит и как оно работает.

Цитата Сообщение от tonline_kms65 Посмотреть сообщение
Насчёт ООП - мне все равно в чем работать, есть задача, есть движек, если движек на c++ буду работать в нем
Без знания С++ - очень наивный и провальный подход.
Может вы и сделаете то что хотите, но это займет слишком много времени, а кодить на С++ и освоить используемый движок у вас так и не получится.
Это кривая дорога в темный лес.
Но раз ТС так хочет, кто мы что бы ему мешать.
Счастливого пути.

Добавлено через 14 минут
tonline_kms65,
Вообще, я так и не понял задачи. Сути проблемы.
Не работает, ошибка, крешится - это все ни о чем.
Вы должны, как разработчик, уметь выделять проблему, только после этого с ней можно справится, когда ее четко видно.

Вот дальше ничего не могу посоветовать. Потому как проблема на ясна.
Не ясно также окружение и концепт в котором все это должно крутиться.

Но даже если бы было, как вам можно что-то посоветовать, если вы не знаете ЯП С++ ?
Скажете : "слишком сложно", как раньше и на этом все.
0
 Аватар для tonline_kms65
-16 / 0 / 0
Регистрация: 17.09.2016
Сообщений: 226
13.04.2023, 17:13  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Не работает, ошибка, крешится - это все ни о чем.
Уже ничего не крашится, все работает, я же написал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.04.2023, 17:13

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла 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