Изменение данных указателя - PullRequest
1 голос
/ 22 января 2012

Я пытался понять это какое-то время, поэтому любая помощь будет отличной. Я пишу движок для школьного проекта, и данные в одном из моих указателей, похоже, меняются сами по себе. Я объявляю указатель объекта Actor * actor; в Engine.h и инициализируйте его с

void Engine::initActor(Actor* newActor)
{
    actor = newActor;
    std::cout << "Actor imported." << std::endl;
}

, отправив initActor () новый указатель актера со своим собственным указателем позиции общего класса позиции, как показано здесь:

class Position
{
public:
    //vars
    GLfloat x,y,z;
    GLfloat rotx, roty, rotz;

    //constructors
    Position();
    Position(int newx, int newy, int newz);
    Position(int newx, int newy, int newz, int newRotx, int newRoty, int newRotz);

    GLfloat distanceTo(Position pos1);

};

Затем, когда я рисую мир, я обращаюсь к указателю объекта Position класса Actor, и хотя указатель Position указывает на тот же адрес, по которому он был инициализирован, position-> x изменился с 0 на Первоначально он был установлен и теперь читается как -1.07374e + 008. Единственное, о чем я могу думать, это то, что память, на которую указывает указатель положения, изменилась, но я не знаю, почему или как этого избежать. Вот класс actor.h, если он помогает:

class Actor{

public:
    //constructors
    Actor();

    //functions
    Position* position;
    void posCamera();

};

1 Ответ

1 голос
/ 23 января 2012

Всякий раз, когда вы видите сумасшедшие большие +/- числа, подобные этому, появляется верный признак того, что:
A) значение, которое вы передали напрямую или через указатель, никогда не инициализировалось для начала, или
B)значение вышло за пределы области видимости.

Вы указываете, что изначально оно корректно, поэтому, вероятно, оно каким-то образом выходит за рамки.Выделено ли оно изначально куче, а не стеку?Как вы создаете оригинальный указатель?Распространенной ошибкой новичка является неправильное использование адреса & адреса.Вот быстрый пример, если это поможет;он также воспроизводит указанную вами ошибку, первое напечатанное значение для меня было 1606416707, второе - правильное значение 100.

#include <iostream>
#include <vector>

using namespace std; 

vector<int>* CreateVectorPtrIncorrect(); 
vector<int>* CreateVectorPtrCorrect();

int main ()
{
    vector<int>* vec1 = CreateVectorPtrIncorrect(); 
    cout << vec1->at(0) << endl; 

    vector<int>* vec2 = CreateVectorPtrCorrect(); 
    cout << vec2->at(0) << endl; 
    return 0;
}

// Incorrect: 
vector<int>* CreateVectorPtrIncorrect() { 
    vector<int> vec; 
    int index_zero = 100; 
    vec.push_back(index_zero); 
    vector<int>* vec_pointer = &vec; 
    return vec_pointer; 
}

// Correct: 
vector<int>* CreateVectorPtrCorrect() { 
    vector<int>* vec_pointer = new vector<int>; 
    int index_zero = 100; 
    vec_pointer->push_back(index_zero); 
    return vec_pointer; 
}

Надеюсь, это поможет!

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