Неопределенная ссылка во внешних массивах, которые инициализируются в другом файле - PullRequest
0 голосов
/ 08 октября 2019

Я довольно новичок в C ++ и не могу понять, как объявлять переменные, существующие в области действия всего приложения.

Итак, я объявляю массив extern, а затем делегирую егоинициализация в соответствующий файл cpp (trigonometry.cpp). Следуя логике, когда я вызываю эту функцию инициализации, эти внешние массивы должны существовать везде и иметь значения. Но, очевидно, это не то, что происходит.

Ниже приведен соответствующий код.


Вывод ошибки:

player.o: In function `Player::yDirection() const':
player.cpp:(.text+0x97): undefined reference to `Trigonometry::fSinTable'

Заголовочный файл, в котором я объявляю переменную extern.

// trigonometry.hpp

namespace Trigonometry
{

extern double fSinTable[Config::ANGLE360 + 1];

bool load();
}; // namespace Trigonometry

Функция, в которой я init значения fSinTable

// trigonometry.cpp

bool Trigonometry::load()
{
    for (int i = 0; i != (Config::ANGLE360 + 1); ++i)
    {
        double radian = arcToRad(i) + (0.0001); // Add 0.0001 to avoid division by zero
        double fSinTable[i] = {std::sin(radian)};
    }
    return 0;
}

Класс, в котором я пытаюсь получить доступ к массиву

// player.cpp

#include "trigonometry.hpp"
#include "player.hpp"

const double &Player::yDirection() const
{
    return Trigonometry::fSinTable[_rotation];
}

И мой основной класс, где я пытаюсь вызвать функцию инициализации перед всем остальным.

// main.cpp

#include "config.hpp"
#include "trigonometry.hpp"
#include "player.hpp"

// ...

// This executes before &Player::yDirection(), so I would expect Trigonometry::fSinTable to be initialized
bool loaded = Trigonometry::load();

Player *player;

int main(int argc, char *argv[])
{
   player = new Player();
}

Редактировать:

Вот как япостроить приложение:

g++    -c -o trigonometry.o trigonometry.cpp
g++    -c -o player.o player.cpp
g++    -c -o main.o main.cpp
g++ -o App trigonometry.o player.o main.o

1 Ответ

0 голосов
/ 08 октября 2019

Я вижу, что моя ошибка нигде не определяла fSinTable.

Я неправильно определял каждого дочернего элемента массива вместо всего массива.

Итак, из этого:

// trigonometry.cpp

#include "trigonometry.hpp"

bool Trigonometry::load()
{
    for (int i = 0; i != (Config::ANGLE360 + 1); ++i)
    {
        double radian = arcToRad(i) + (0.0001); // Add 0.0001 to avoid division by zero
        double fSinTable[i] = {std::sin(radian)};
    }
    return 0;
}

К этому:

// trigonometry.cpp

#include "trigonometry.hpp"

double Trigonometry::fSinTable[Config::ANGLE360 + 1];

bool Trigonometry::load()
{
    for (int i = 0; i != (Config::ANGLE360 + 1); ++i)
    {
        double radian = arcToRad(i) + (0.0001); // Add 0.0001 to avoid division by zero
        fSinTable[i] = std::sin(radian);
    }

    return true;
}

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