или C ++: оператор умножения VS2010 ошибочно принят за нулевой указатель - PullRequest
0 голосов
/ 19 августа 2011

У меня в основном exp>=level*10 в выражении else if, где уровень - переменная, а 10 - постоянное число. Код компилируется полностью без ошибок, и до недавнего времени он работал даже после компиляции. теперь, всякий раз, когда он компилируется и выполняется, он выдает мне сообщение «недопустимый нулевой указатель» и удобно сообщает, что проблема связана с включенным файлом xstring (VS2010 включает его в новые проекты) в строке 930. Есть ли способ заставить программу читать ее как оператор умножения вместо нулевого указателя? РЕДАКТИРОВАТЬ: Вот мой полный код, пожалуйста, обратите внимание, что это прототип, созданный, чтобы убедиться, что он будет работать и был сделан до того, как я понял, что я могу использовать производные классы для этого. также обратите внимание, что я попытался удалить using namespace std, чтобы проверить, не в этом ли проблема.

#include "stdafx.h"
#include <iostream>
#include <sstream>

class player {
public:
    std::string name;
    int hp;
    int attack;
    int strength;
    int defense;
    void reward(int gold, int exp) {
        player::gold += gold; 
        player::exp += exp;
        player::levelHandler();
    }
    int dataQuery(std::string query) {
        if (query == "equipment")
            return helm, armour, greaves;
        else if (query == "gold")
            return gold;
        else if (query == "exp")
            return exp;
        else if (query == "level")
            return level;
        else return 0;
    }
private:
    int helm;
    int armour;
    int greaves;
    int level;
    int gold;
    int exp;
    std::string levelHandler() {
        if (level==0) { 
            level=1;
        }
        else if (exp>=(10*level)) { //causes problem due to * being mistaken as a 
                    //null pointer.
        int previousLevel = level;
        level += 1;
        levelHandler();
        return 0;
        };
        return 0;
    };
} hero;

class enemy {
public:
    std::string name;
    int hp;
    int attack;
    int strength;
    int defense;
private:
    int helm;
    int armour;
    int greaves;
    int level;
    int goldReward;
    int expReward;
    int dataQuery(std::string query) {
        if (query == "equipment")
            return helm, armour, greaves;
        else if (query == "gold")
            return goldReward;
        else if (query == "exp")
            return expReward;
        else if (query == "level")
            return level;
        else return 0;
    }
};

int main()
{
    std::cout << "Please enter your character's name..." << std::endl;
    std::cin >> hero.name;
    std::cout << "Welcome to RPG Battle Simulation, " << hero.name << "!" << std::endl;
    hero.reward(100, 0); //problem is either this line, or the function's call to levelHandler, as this is where the program terminates.
    std::cout << "You are beginning your journey as a level " << hero.dataQuery("level") << " character." << std::endl;
    std::cout << "Here is " << hero.dataQuery("gold") << " gold to get you started." << std::endl;
    return 0;
};

Ниже приведен отрывок xstring, вызывающий проблему. проблема возникает из _DEBUG_POINTER(_Ptr); (строка 930)

_Myt& assign(const _Elem *_Ptr)
        {// assign [_Ptr, <null>)
 _DEBUG_POINTER(_Ptr);
 return (assign(_Ptr, _Traits::length(_Ptr)));
       }

1 Ответ

4 голосов
/ 19 августа 2011

Эта программа воспроизводит вашу проблему (при компиляции с MSVC со средой выполнения, которая поддерживает отладку):

#include <string>
#include <iostream>

int main()
{
    using namespace std;

    string  s = 0;
    cout << s << endl;
}

Проблема в том, что std::string инициализируется нулевым указателем.

РЕДАКТИРОВАТЬ : о, забыл упомянуть, решение - просто не делайте этого.

Приветствия & hth.,

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