Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
14 / 14 / 13
Регистрация: 14.02.2013
Сообщений: 787

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

06.01.2014, 02:56. Показов 805. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, есть проект, в нем был только один файл core.cpp
в нем было и объявления функций и их описания, короче говоря все было в одном файле.
Я решил привести это дело в порядок, получилась такая структура:
Заголовочные файлы:
Code
1
core.h
Файлы исходного кода:
Code
1
2
3
4
_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();
}
//==============================================================================
Но при компиляции получаю ошибку:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 ==========
Что я делаю не так ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.01.2014, 02:56
Ответы с готовыми решениями:

Укажите ошибку!
В строке удвоить все символы ‘&amp;’. Под вставкой символа n в строку после к-го элемента понимается смещение всех элементов, начиная с...

Укажите на ошибку
Проблема с enum. Пишет что, нужно что-то перед enum. Поясните пожалуйста #include &lt;iostream&gt; using namespace std; int main()...

Укажите на ошибку
Подскажите ошибку пожалуйста #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; void main() ...

4
1 / 1 / 0
Регистрация: 06.01.2014
Сообщений: 6
06.01.2014, 03:08
Я не совсем уверен, сам только разбираюсь во всем этом, но попробуйте убрать #include "core.h" из файлов, что начинаются на символ "_".
core.h уже ведь подключается в основной программе, а здесь получается его повторное подключение и дублирование объявления всех переменных.
0
14 / 14 / 13
Регистрация: 14.02.2013
Сообщений: 787
06.01.2014, 03:13  [ТС]
не, я не могу убрать от туда инклюд, так как описания функций находиться в core.h
а сами функции описаны в файлах с "_"
0
1 / 1 / 0
Регистрация: 06.01.2014
Сообщений: 6
06.01.2014, 03:57
Кажется, понял что нужно делать.
Из файлов с "_" уберите #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, где повторно инициализируются переменные. Не уверен что правильно описал принцип работы, но примерно так.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.01.2014, 11:25
Цитата Сообщение от 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;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.01.2014, 11:25
Помогаю со студенческими работами здесь

Укажите пожалуйста ошибку(и)
#include &lt;iostream&gt; using namespace std; struct box { char maker; float height; float width; float length; float...

Укажите ошибку в массивах
Вобщем, в первом задании надо создать и вывести массив. Легко, конечно. Во втором задании надо создать массив из первого, поменяв местами...

укажите на ошибку в листинге
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace System; void main( ) { cout &lt;&lt; &quot;I love&quot;; ...

Укажите ошибку пожалуйста
№ 3 вариант 8 #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main() { const float Eps=1E-4; int...

Укажите на ошибку пожалуйста C++ код
Всего выдаёт 2 ошибки 1 C2760 Синтаксическая ошибка: ожидается «Нет данных» не «Нет данных»(строка 14) 2 С2760 Синтаксическая ошибка:...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru