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

Укажите на ошибку - C++

Войти
Регистрация
Восстановить пароль
 
tdo22
10 / 10 / 1
Регистрация: 14.02.2013
Сообщений: 728
06.01.2014, 02:56     Укажите на ошибку #1
Привет, есть проект, в нем был только один файл core.cpp
в нем было и объявления функций и их описания, короче говоря все было в одном файле.
Я решил привести это дело в порядок, получилась такая структура:
Заголовочные файлы:
Код
core.h
Файлы исходного кода:
Код
_close.cpp
_loadMedia.cpp
core.cpp
_init.cpp
Код core.cpp
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
/*This source code copyrighted by Lazy Foo' Productions (2004-2013)
and may not be redistributed without written permission.*/
 
//Using SDL and standard IO
#include "core.h"
 
int main( int argc, char* args[] )
{
    //Start up SDL and create window
    if( !init() )
        {
            printf( "Failed to initialize!\n" );
        }
    else
    {
        //Load media
        if( !loadMedia() )
            {
                printf( "Failed to load media!\n" );
            }
        else
            {
                //Apply the image
                SDL_BlitSurface( gHelloWorld, NULL, gScreenSurface, NULL );
            
                //Update the surface
                SDL_UpdateWindowSurface( gWindow );
 
                //Wait two seconds
                SDL_Delay( 2000 );
            }
    }
 
    //Free resources and close SDL
    close();
 
    return 0;
}
в core.h объявил все функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <SDL.h>
#include <stdio.h>
//==============================================================================
    //Розширення
    const int SCREEN_WIDTH = 640;
    const int SCREEN_HEIGHT = 480;
    const char WindowTitle[] = "My Game";
//==============================================================================
    //Запуск SDL2 і створення вікон
    bool init();
    //Завантаження медіа
    bool loadMedia();
    //Очишчення медіа та вимкнення SDL
    void close();
    //The window we'll be rendering to
    SDL_Window* gWindow = NULL; 
    //The surface contained by the window
    SDL_Surface* gScreenSurface = NULL;
    //The image we will load and show on the screen
    SDL_Surface* gHelloWorld = NULL;
//==============================================================================
а в _close.cpp и всех что начинаются на символ "_" описал функции, пример _close.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "core.h"
//==============================================================================
void close()
{
    //Deallocate surface
    SDL_FreeSurface( gHelloWorld );
    gHelloWorld = NULL;
 
    //Destroy window
    SDL_DestroyWindow( gWindow );
    gWindow = NULL;
 
    //Quit SDL subsystems
    SDL_Quit();
}
//==============================================================================
Но при компиляции получаю ошибку:
Код
1>------ Построение начато: проект: MyGame, Конфигурация: Debug Win32 ------
1>Построение начато 06.01.2014 0:55:45.
1>InitializeBuildStatus:
1>  Обращение к "Debug\MyGame.unsuccessfulbuild".
1>ClCompile:
1>  Для всех выходных данных обновления не требуется.
1>_close.obj : error LNK2005: "struct SDL_Window * gWindow" (?gWindow@@3PAUSDL_Window@@A) уже определен в core.obj
1>_close.obj : error LNK2005: "struct SDL_Surface * gScreenSurface" (?gScreenSurface@@3PAUSDL_Surface@@A) уже определен в core.obj
1>_close.obj : error LNK2005: "struct SDL_Surface * gHelloWorld" (?gHelloWorld@@3PAUSDL_Surface@@A) уже определен в core.obj
1>_init.obj : error LNK2005: "struct SDL_Window * gWindow" (?gWindow@@3PAUSDL_Window@@A) уже определен в core.obj
1>_init.obj : error LNK2005: "struct SDL_Surface * gScreenSurface" (?gScreenSurface@@3PAUSDL_Surface@@A) уже определен в core.obj
1>_init.obj : error LNK2005: "struct SDL_Surface * gHelloWorld" (?gHelloWorld@@3PAUSDL_Surface@@A) уже определен в core.obj
1>_loadMedia.obj : error LNK2005: "struct SDL_Window * gWindow" (?gWindow@@3PAUSDL_Window@@A) уже определен в core.obj
1>_loadMedia.obj : error LNK2005: "struct SDL_Surface * gScreenSurface" (?gScreenSurface@@3PAUSDL_Surface@@A) уже определен в core.obj
1>_loadMedia.obj : error LNK2005: "struct SDL_Surface * gHelloWorld" (?gHelloWorld@@3PAUSDL_Surface@@A) уже определен в core.obj
1>D:\Proga\GamePC\Win\MyGame\Debug\MyGame.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более
1>
1>СБОЙ построения.
1>
1>Затраченное время: 00:00:00.15
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Что я делаю не так ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2014, 02:56     Укажите на ошибку
Посмотрите здесь:

C++ Укажите на ошибку или исправте!!!
Объясните функцию классы в С++ и укажите мою ошибку. C++
C++ Укажите на ошибку - при запуске runtime error
C++ Укажите ошибку!
C++ Задачка по C++! Укажите пожалуйста на ошибку!
C++ укажите на ошибку в листинге
C++ Вылетает программа, укажите ошибку
Укажите на ошибку C++
Укажите на ошибку C++
Калькулятор Z-1. Укажите на ошибку в программе к задаче C++
Укажите на ошибки C++
Укажите пожалуйста ошибку(и) C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
akarad
1 / 1 / 0
Регистрация: 06.01.2014
Сообщений: 6
06.01.2014, 03:08     Укажите на ошибку #2
Я не совсем уверен, сам только разбираюсь во всем этом, но попробуйте убрать #include "core.h" из файлов, что начинаются на символ "_".
core.h уже ведь подключается в основной программе, а здесь получается его повторное подключение и дублирование объявления всех переменных.
tdo22
10 / 10 / 1
Регистрация: 14.02.2013
Сообщений: 728
06.01.2014, 03:13  [ТС]     Укажите на ошибку #3
не, я не могу убрать от туда инклюд, так как описания функций находиться в core.h
а сами функции описаны в файлах с "_"
akarad
1 / 1 / 0
Регистрация: 06.01.2014
Сообщений: 6
06.01.2014, 03:57     Укажите на ошибку #4
Кажется, понял что нужно делать.
Из файлов с "_" уберите #include "core.h", а все необходимые переменные (в _close.cpp, например, это gHelloWorld, gWindow и gScreenSurface) сделайте вначале описание (не знаю как точно называется) при помощи ключевого слова "extern".
Выйдет примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//==============================================================================
void close()
{
    extern SDL_Window* gWindow;
    extern SDL_Surface* gScreenSurface;
    extern SDL_Surface* gHelloWorld;
    //Deallocate surface
    SDL_FreeSurface( gHelloWorld );
    gHelloWorld = NULL;
 
    //Destroy window
    SDL_DestroyWindow( gWindow );
    gWindow = NULL;
 
    //Quit SDL subsystems
    SDL_Quit();
}
//==============================================================================
По аналогии сделать и для других файлов.

Дело в том, что из главной программы у вас вызывается файл core.h, в котором инициализируются переменные. Дальше из этого файла вызываются функции, которые также вызывают core.h, где повторно инициализируются переменные. Не уверен что правильно описал принцип работы, но примерно так.
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.01.2014, 11:25     Укажите на ошибку #5
Цитата Сообщение от tdo22 Посмотреть сообщение
в core.h объявил все функции:
Если бы только функции. Там ещё и объявление переменных есть, а это уже определение.
Цитата Сообщение от akarad Посмотреть сообщение
Из файлов с "_" уберите #include "core.h",
Не нужно убирать. Это убрать из core.h и сделать в .cpp:
C++
1
2
3
4
5
6
 //The window we'll be rendering to
    SDL_Window* gWindow = NULL; 
    //The surface contained by the window
    SDL_Surface* gScreenSurface = NULL;
    //The image we will load and show on the screen
    SDL_Surface* gHelloWorld = NULL;
В core.h сделать:
C++
1
2
3
4
// объявления без определения
extern SDL_Window* gWindow;
extern SDL_Surface* gScreenSurface;
extern SDL_Surface* gHelloWorld;
Yandex
Объявления
06.01.2014, 11:25     Укажите на ошибку
Ответ Создать тему
Опции темы

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