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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Justix
73 / 19 / 1
Регистрация: 26.04.2012
Сообщений: 233
#1

g++ Заголовочные файлы - C++

23.06.2012, 16:05. Просмотров 1563. Ответов 12
Метки нет (Все метки)

Значит есть у меня файлик main.cpp к нему инклудиться #include "Event.h" .В этом хидере название функции void event_loop(); .Так же этот хидер инклудиться к event.cpp и там уже полный код функции.
Но когда я эту функцию вызываю в main.cpp,он выдаёт ошибку на ней,ну типо чо за функция такая.
Короче просто не видит её.Но почему так,что я не правильно сделал?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2012, 16:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос g++ Заголовочные файлы (C++):

Заголовочные файлы .h, файлы исходного когда c/c++ и установление связи между ними - C++
Всем добрый вечер!) Относительно недавно стал изучать c/c++, хочу полюбопытствовать ,так как появился вопрос. Почему при объявлении...

Работа в Visual Studio 2015 - как добавить файлы исходного кода и заголовочные файлы? - C++
Приветствую всех! Столкнулся с тем, что решая задачи по книге Лафоре про графику, не смог добавить файлы .h и .cpp, скачав их с одной из...

Заголовочные файлы - C++
Подключил два заголовочных файла, при компиляции пишет, что не знает имени функции Header.h #pragma once float F1(float* ar1,...

Заголовочные файлы - C++
#ifndef _MYCLASS_H #define _MYCLASS_H class myclass{//Описание класса}; #endif Сказано, что заголовочные файлы обычно включают...

Заголовочные файлы - C++
Почему в учебниках пишет, например, чтобы использовать какую-то математическую функцию, то надо подключить файл <cmath>. У меня из без...

Заголовочные файлы - C++ - C++
Здравствуйте уважаемые пользователи! написал код программы в 3 файлах. При компилировании возникает следующая ошибка: ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
easybudda
Модератор
Эксперт CЭксперт С++
9624 / 5572 / 946
Регистрация: 25.07.2009
Сообщений: 10,699
23.06.2012, 16:10 #2
А файл event.cpp при компиляции указываете?
Код
g++ -o main main.cpp event.cpp
Если да, выкладывайте код...
1
Justix
73 / 19 / 1
Регистрация: 26.04.2012
Сообщений: 233
23.06.2012, 16:28  [ТС] #3
неа,не делал,просто не знал что так нужно)
Спасибо,помогло)

Добавлено через 12 минут
А вот ещё вопрос!!!!есть файлик draw.cpp и в нём используются всякие функции и переменные и библиотеки из init.cpp.Ну и он почему то на это ошибку выдаёт.Хотя я их оба прописал в компиляторе
0
easybudda
Модератор
Эксперт CЭксперт С++
9624 / 5572 / 946
Регистрация: 25.07.2009
Сообщений: 10,699
23.06.2012, 16:50 #4
Justix, ну опять же - либо больше подробностей, что где и как объявлено, либо ждите кого-нибудь с прокачаным уровнем телепатии...
0
Justix
73 / 19 / 1
Регистрация: 26.04.2012
Сообщений: 233
23.06.2012, 16:57  [ТС] #5
Извините...)
init.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
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
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>
#include <X11/keysymdef.h>
#include <GL/gl.h>
#include <GL/glx.h>
 
 
#include <stdio.h>
#include "init.h"
#include "draw.h"
 
 
 
 
 
 
 
int Attr[] = {  GLX_RGBA,
                GLX_RED_SIZE, 1,
                GLX_GREEN_SIZE, 1,
                GLX_BLUE_SIZE, 1,
                GLX_DEPTH_SIZE, 16,
                GLX_ALPHA_SIZE,1,
                GLX_DOUBLEBUFFER,
                None};
 
XVisualInfo             *xvVisualInfo;
Colormap                cmColorMap;
XSetWindowAttributes    winAttr;
GLXContext              glXContext;
Display                 *dpDisplay;
Window                  win;
 
 
 
 
int Openwindow()
{
 
    dpDisplay = XOpenDisplay(NULL);
    if(dpDisplay == NULL) return 0; 
 
    if(!glXQueryExtension(dpDisplay, NULL, NULL)) return 0; 
 
 
    xvVisualInfo = glXChooseVisual(dpDisplay, DefaultScreen(dpDisplay), Attr);
    if(xvVisualInfo == NULL) return 0; 
 
 
    cmColorMap = XCreateColormap(dpDisplay, RootWindow(dpDisplay, xvVisualInfo->screen), xvVisualInfo->visual, AllocNone);
    winAttr.colormap = cmColorMap;
    winAttr.border_pixel = 0;
    winAttr.background_pixel = 0;
    winAttr.event_mask = ExposureMask | ButtonPressMask | StructureNotifyMask | KeyPressMask;
 
 
    win = XCreateWindow(dpDisplay, RootWindow(dpDisplay, xvVisualInfo->screen),
                        0, 0,
                        1280, 960, 
                        0,
                        xvVisualInfo->depth, 
                        InputOutput,
                        xvVisualInfo->visual,
                        CWBorderPixel | CWColormap | CWEventMask,
                        &winAttr);
 
 
    glXContext = glXCreateContext(dpDisplay, xvVisualInfo, NULL, True);
if(glXContext == NULL) return 0; 
 
    glXMakeCurrent(dpDisplay, win, glXContext); 
    XMapWindow(dpDisplay, win);
    glEnable(GL_LIGHTING);
         //   glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
         glEnable( GL_DEPTH_TEST );            // Разрешить тест глубины
        glDepthFunc( GL_LESS);            // Тип теста глубины
      //    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );      // Улучшение в вычислении перспективы
 
 
    return 0;
}
 
 
char    keyStr[20];
void event_loop()
{
    XEvent event;
 
    while (1)
    {
        XNextEvent(dpDisplay, &event);
        switch (event.type)
        {
            case Expose: redraw(); break; 
            case KeyPress :
      
          glXDestroyContext(dpDisplay,glXContext);
             XCloseDisplay(dpDisplay);
 
             break;
            case ConfigureNotify: resize(event.xconfigure.width, event.xconfigure.height); break; 
        }
    }
}
draw.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
39
40
41
42
43
44
45
#include "draw.h"
#include <math.h>
#include "box.h"
 
#define GL_PI 3.1415f
 
 GLfloat angle;
void draw(){
    //for(angle=0.01f;angle<=360.0f;angle+=0.01f){
    //      glClearColor(0.4, 0.5, 0.6, 0.0);
  //      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
    //    glMatrixMode(GL_MODELVIEW);
    //    glLoadIdentity();
      //    glPushMatrix();
     box* box_1=new box(10.0f,0.0f,10.0f,0.0f);
        
                 
    //    glPopMatrix();
       // sleep(1000);
    //    if(angle==359.0f)angle=1.0f;
    //    glXSwapBuffers(dpDisplay, win); 
    //    }
    }
    
void redraw()
{
   glClearColor(0.0,0.0,0.0,0.0);
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  draw();
  glXSwapBuffers(dpDisplay, win);
}
 
void resize(unsigned int width, unsigned int height)
{ 
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
//gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,-100,100);
    glOrtho(-100.0, 100.0, -100.0, 100.0, -100.0, 100.0);
        glRotatef(10.0f,1.0f,0.0f,0.0f);
    glRotatef(-20.0f,0.0f,1.0f,0.0f);
    
    glMatrixMode(GL_MODELVIEW);
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
#include "init.h"
 
 
 
int main(int argc, char* argv[]){
    Openwindow();
    event_loop();
    return 0; 
    }
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
23.06.2012, 17:03 #6
Код это хорошо. Но полный текст сообщения об ошибке ещё лучше!

Добавлено через 2 минуты
К тому же заголовочных файлов init.h и draw.h отсюда не видать что-то.
0
Justix
73 / 19 / 1
Регистрация: 26.04.2012
Сообщений: 233
23.06.2012, 17:03  [ТС] #7
Воть)
0
Миниатюры
g++ Заголовочные файлы  
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
23.06.2012, 17:06 #8
А box.h это своё? Ошибка-то, вероятно, в нём, судя по первому же сообщению.
0
Justix
73 / 19 / 1
Регистрация: 26.04.2012
Сообщений: 233
23.06.2012, 17:11  [ТС] #9
Ну всё своё)а бокс.h работал и ничего не понял пока не сказали что весь код функций в хидерах не держат и надо разделить на хидер и цпп
box.h
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
 
 class box{
     public:
     box();
     box(GLfloat ,GLfloat ,GLfloat ,GLfloat );  
     }; 
        box::box(){} 
     box::box(GLfloat size,GLfloat x,GLfloat y,GLfloat z){   
             glBegin(GL_QUADS);
                glVertex3f(x,y,z);
                glVertex3f(x,y+size,z);
                glVertex3f(x+size,y+size,z);
                glVertex3f(x+size,y,z);
                      
                glVertex3f(x+size,y,z);
                glVertex3f(x+size,y+size,z);
                glVertex3f(x+size,y+size,z-size);
                glVertex3f(x+size,y,z-size);
                
                glVertex3f(z,y,z-size);
                glVertex3f(x,y+size,z-size);
                glVertex3f(x+size,y+size,z-size);
                glVertex3f(x+size,y,z-size);
                             glEnd();
         
         }
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
23.06.2012, 17:41 #10
Надо чтобы gl.h и glx.h подключались и в draw.cpp тоже. Либо перед включением box.h либо внутри box.h.
0
Justix
73 / 19 / 1
Регистрация: 26.04.2012
Сообщений: 233
23.06.2012, 17:54  [ТС] #11
А это разве правильно?два раза в программе подключать библиотеки?

Добавлено через 52 секунды
И ещё,ошибки функций убрал.А как быть с перменными из init.cpp?на них ошибка всё стоит
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,000
23.06.2012, 18:19 #12
Цитата Сообщение от Justix Посмотреть сообщение
А это разве правильно?два раза в программе подключать библиотеки?
#include не подключает библиотеки. #include встраивает текст заголовочного файла в указанное место. Заголовочные файлы для того и нужны, чтобы включать определения функций в каждый модуль, где эти функции используются. По той же причине в заголовке не должно быть кода (за исключением inline) и глобальных переменных. Потому что если такой заголовок включить в 2 модуля, то код функций и переменные будут определены 2 раза и во время компоновки (связывания, линковки) возникнет ошибка.
А с переменными проблема в том, что в модуле draw.cpp ничего не известно о глобальных переменных. Так что их там (в draw.cpp) можно объявить с ключевым словом extern, или же сделать это в заголовочном файле init.h (тоже с extern).

Добавлено через 2 минуты
Но если возможно — лучше вообще избавляться от глобальных переменных. Они бывают нужны, но чаще можно обойтись без них.
1
Justix
73 / 19 / 1
Регистрация: 26.04.2012
Сообщений: 233
23.06.2012, 18:22  [ТС] #13
Спасибо за пояснение)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2012, 18:22
Привет! Вот еще темы с ответами:

заголовочные файлы - C++
За мое небольшое время знакомство с программированием в с++ накопилось немного вопросов с работой заголовочных файлов: 1 Почему в имени...

Заголовочные файлы *.h - C++
Доброго времени суток! Как понят следующее: В заголовочных файлах, в целях более быстрой компиляции, для указателей на типы данных...

Заголовочные файлы - C++
Здравствуйте ув. Пользователи, У меня такой вопрос: Есть ли хорошие книги по заголовочным файла как правильно ими пользоваться... Просто...

Заголовочные файлы (.h) - C++
Доброго времени суток господа! Озадачился вопросом по поводу заголовочных файлов. Но подробного, или понятного мне ответа так и не нашёл....


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.06.2012, 18:22
Ответ Создать тему
Опции темы

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