Форум программистов, компьютерный форум CyberForum.ru

Инициализация переменной в пространстве имён - C++

Восстановить пароль Регистрация
 
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
08.09.2013, 22:54     Инициализация переменной в пространстве имён #1
в моём пространстве имён d3d есть 2 переменные, которые я определяю в самом пространстве
C++
1
2
HWND m_hwnd = 0;
HINSTANCE m_hinst = 0;
в дальнейшем при вызове функции InitD3D() они инициализируются другими значениями
InitD3D()
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
bool d3d::InitD3D(
        HINSTANCE hinstance,
        int width, int height,
        bool windowed,
        D3DDEVTYPE deviceType,
        IDirect3DDevice9** device)
{
    m_hinst = hinstance;//здесь
 
    WNDCLASSEX wc;
    ZeroMemory(&wc, sizeof(wc));
 
    wc.cbSize           = sizeof(WNDCLASSEX);
    wc.style            = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc      = (WNDPROC)d3d::WndProc;
    wc.cbClsExtra       = 0;
    wc.cbWndExtra       = 0;
    wc.hInstance        = m_hinst;
    wc.hIcon            = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor          = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground    = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName     = 0;
    wc.lpszClassName    = L"Direct3D9App";
 
    if(!RegisterClassEx(&wc))
    {
        d3d::FailMsg(L"RegisterClass()");
        return false;
    }
 
    HWND hwnd = 0;
    hwnd = CreateWindow(
            L"Direct3D9App",
            L"Direct3D9App",
            WS_EX_TOPMOST,
            CW_USEDEFAULT, CW_USEDEFAULT,
            width, height,
            NULL,NULL,
            m_hinst, NULL
        );
    
    m_hwnd = hwnd; //и здесь
 
    if(!m_hwnd)
    {
        d3d::FailMsg(L"CreateWindow");
        return false;
    }
 
    ShowWindow(m_hwnd, SW_SHOW);
    UpdateWindow(m_hwnd);
 
    HRESULT hr = 0;
 
    IDirect3D9* pd3d = 0;
    pd3d = Direct3DCreate9(D3D_SDK_VERSION);
 
    if(!pd3d)
    {
        d3d::FailMsg(L"Direct3Dcreate9()");
        return false;
    }
 
    D3DCAPS9 caps;
    pd3d->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);
 
    int vp = 0;
 
    if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
        vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
    else
        vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
 
    D3DPRESENT_PARAMETERS d3dpp;
    D3DDISPLAYMODE d3ddm;
 
    pd3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
 
 
    d3dpp.BackBufferWidth           = width;
    d3dpp.BackBufferHeight          = height;
    d3dpp.BackBufferFormat          = d3ddm.Format;
    d3dpp.BackBufferCount           = 1;
    d3dpp.MultiSampleType           = D3DMULTISAMPLE_NONE;
    d3dpp.MultiSampleQuality        = 0;
    d3dpp.SwapEffect                = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow             = m_hwnd;
    d3dpp.Windowed                  = windowed;
    d3dpp.EnableAutoDepthStencil    = true;
    d3dpp.AutoDepthStencilFormat    = D3DFMT_D24S8;
    d3dpp.Flags                     = 0;
    d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    d3dpp.PresentationInterval      = D3DPRESENT_INTERVAL_IMMEDIATE;
    
 
    hr = pd3d->CreateDevice(
            D3DADAPTER_DEFAULT,
            deviceType,
            m_hwnd,
            vp,
            &d3dpp,
            device
        );
 
    if(FAILED(hr))
    {
        pd3d->Release();
        d3d::FailMsg(L"CreateDevice()");
        return false;
    }
 
    pd3d->Release();
 
    return true;
}

также я добавляю заголовочный файл D3DUtility.h к 2 другим хэдерам, где вызываются функции из этого пространства и возникает следующая ошибка
C++
1
2
3
4
5
1>Terrain.obj : error LNK2005: "struct HINSTANCE__ * d3d::m_hinst" (?m_hinst@d3d@@3PAUHINSTANCE__@@A) уже определен в D3DUtility.obj
1>Terrain.obj : error LNK2005: "struct HWND__ * d3d::m_hwnd" (?m_hwnd@d3d@@3PAUHWND__@@A) уже определен в D3DUtility.obj
1>TerrainExample.obj : error LNK2005: "struct HINSTANCE__ * d3d::m_hinst" (?m_hinst@d3d@@3PAUHINSTANCE__@@A) уже определен в D3DUtility.obj
1>TerrainExample.obj : error LNK2005: "struct HWND__ * d3d::m_hwnd" (?m_hwnd@d3d@@3PAUHWND__@@A) уже определен в D3DUtility.obj
1>D:\Projects\D3D_Lessons\Debug\D3D_Lessons.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2013, 22:54     Инициализация переменной в пространстве имён
Посмотрите здесь:

Инициализация переменной C++
C++ Инициализация переменной
Инициализация переменной C++
C++ Инициализация static переменной
C++ Определить функцию в пространстве имён.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
08.09.2013, 23:37     Инициализация переменной в пространстве имён #2
В заголовочном файле объявление:
C++
1
2
extern HWND m_hwnd;
extern HINSTANCE m_hinst;
В исходнике определение:
C++
1
2
HWND m_hwnd = 0;
HINSTANCE m_hinst = 0;
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
08.09.2013, 23:50  [ТС]     Инициализация переменной в пространстве имён #3
gray_fox, вне пространства имён?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
08.09.2013, 23:52     Инициализация переменной в пространстве имён #4
Цитата Сообщение от alexey31415 Посмотреть сообщение
gray_fox, вне пространства имён?
В пространстве.
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
09.09.2013, 00:13  [ТС]     Инициализация переменной в пространстве имён #5
gray_fox, функция InitDI в которой вызывается DirectInput8Create с m_hinst возвращает ошибку, может ли моя переменная впоследствии менять своё значение при вызове функции InitD3D?
C++
1
2
3
4
5
6
7
8
bool d3d::InitD3D(
        HINSTANCE hinstance,
        int width, int height,
        bool windowed,
        D3DDEVTYPE deviceType,
        IDirect3DDevice9** device)
{
    m_hinst = hinstance;//здесь
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
09.09.2013, 00:16     Инициализация переменной в пространстве имён #6
Цитата Сообщение от alexey31415 Посмотреть сообщение
может ли моя переменная впоследствии менять своё значение при вызове функции InitD3D?
Может.
Проблема была в том, что ты определил переменные в заг. файле, соответственно в каждом модуле будет по определению, в то время как определение должно быть только одно.
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
09.09.2013, 00:20  [ТС]     Инициализация переменной в пространстве имён #7
а разве
C++
1
2
3
4
#ifndef D3DUTILITY_H
#define D3DUTILITY_H
 
#endif D3DUTILITY_H
не предотвратят повторное определение?
переменные эти в пространстве имён и как я понимаю определяются лишь раз, как исправить проблему я пока не имею понятия
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
09.09.2013, 00:23     Инициализация переменной в пространстве имён #8
Цитата Сообщение от alexey31415 Посмотреть сообщение
не предотвратят повторное определение?
Только в один исходник, раздельная компиляция же.

Добавлено через 1 минуту
Поэтому и ругается компановщик, а не компилятор.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2013, 00:37     Инициализация переменной в пространстве имён
Еще ссылки по теме:

C++ Инициализация переменной в классе
Объявление класса в пространстве имён C++
Инициализация переменной C++

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

Или воспользуйтесь поиском по форуму:
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
09.09.2013, 00:37  [ТС]     Инициализация переменной в пространстве имён #9
у меня эти переменные определяются только в файле TerrainExample.cpp, функция DirectInput8Create возвращает ошибку лишь из-за неправильного m_hinst, значит он почему-то не инициализируется в функции InitD3D
Yandex
Объявления
09.09.2013, 00:37     Инициализация переменной в пространстве имён
Ответ Создать тему
Опции темы

Текущее время: 04:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru