Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Błędy z wieloma plikami w projekcie

Ostatnio zmodyfikowano 2011-03-03 20:03
Autor Wiadomość
SeaMonster131
Temat założony przez niniejszego użytkownika
[C++] Błędy z wieloma plikami w projekcie
» 2011-03-03 16:56:52
Zacząłem sie uczyć Allegro 5.1. Ale raczej nie w tym rzecz. Mam kilka plików w projekcie i wyskakuje masa errorów.. A ja nie moge dojść jak poprawnie dołączyć te pliki :)

main.cpp
C/C++
#include "main.h"


enum MYKEYS {
    KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT
};

///BITMAPY itd:
ALLEGRO_BITMAP * platforma = NULL;
ALLEGRO_BITMAP * tlo = NULL;


int main( int argc, char ** argv )
{
    bool redraw = true;
   
    bool key[ 4 ] = { false, false, false, false };
   
    Init();
    CreateBall();
   
    while( 1 )
    {
        ALLEGRO_EVENT ev;
        al_wait_for_event( event_queue, & ev );
       
        if( ev.type == ALLEGRO_EVENT_TIMER ) {
           
            /*if(key[KEY_UP] && bouncer_y >= 4.0) {
                        bouncer_y -= 4.0;
                     }
           
                     if(key[KEY_DOWN] && bouncer_y <= SCREEN_H - BOUNCER_SIZE - 4.0) {
                        bouncer_y += 4.0;
                     }
           
                     if(key[KEY_LEFT] && bouncer_x >= 4.0) {
                        bouncer_x -= 4.0;
                     }
           
                     if(key[KEY_RIGHT] && bouncer_x <= SCREEN_W - BOUNCER_SIZE - 4.0) {
                        bouncer_x += 4.0;
                     }*/
           
            MoveBall();
           
            redraw = true;
        }
        else if( ev.type == ALLEGRO_EVENT_KEY_DOWN ) {
            switch( ev.keyboard.keycode ) {
            case ALLEGRO_KEY_UP:
                key[ KEY_UP ] = true;
                break;
               
            case ALLEGRO_KEY_DOWN:
                key[ KEY_DOWN ] = true;
                break;
               
            case ALLEGRO_KEY_LEFT:
                key[ KEY_LEFT ] = true;
                break;
               
            case ALLEGRO_KEY_RIGHT:
                key[ KEY_RIGHT ] = true;
                break;
            }
        }
        else if( ev.type == ALLEGRO_EVENT_KEY_UP ) {
            switch( ev.keyboard.keycode ) {
            case ALLEGRO_KEY_UP:
                key[ KEY_UP ] = false;
                break;
               
            case ALLEGRO_KEY_DOWN:
                key[ KEY_DOWN ] = false;
                break;
               
            case ALLEGRO_KEY_LEFT:
                key[ KEY_LEFT ] = false;
                break;
               
            case ALLEGRO_KEY_RIGHT:
                key[ KEY_RIGHT ] = false;
                break;
               
            case ALLEGRO_KEY_ESCAPE:
                break;
            }
        }
        else if( ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE ) {
            break;
        }
        /*else if(ev.type == ALLEGRO_EVENT_MOUSE_AXES ||
                      ev.type == ALLEGRO_EVENT_MOUSE_ENTER_DISPLAY) {
       
                 bouncer_x = ev.mouse.x;
                 bouncer_y = ev.mouse.y;
              }*/
        else if( ev.type == ALLEGRO_EVENT_MOUSE_BUTTON_UP ) {
            break;
        }
       
        if( redraw && al_is_event_queue_empty( event_queue ) ) {
            redraw = false;
           
            al_clear_to_color( al_map_rgb( 0, 0, 0 ) );
           
            DrawBall();
           
            al_flip_display();
        }
    }
   
    al_destroy_bitmap( bouncer );
    al_destroy_timer( timer );
    al_destroy_display( display );
    al_destroy_event_queue( event_queue );
   
    return 0;
}


main.h
C/C++
#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED

#include <stdio.h>
#include <allegro5/allegro.h>
#include "main.h"
#include "pilka.h"
#include "init.h"


#endif // MAIN_H_INCLUDED


init.h
C/C++
#ifndef INIT_H_INCLUDED
#define INIT_H_INCLUDED

#include "main.h"

extern const float FPS = 60;

ALLEGRO_DISPLAY * display = NULL;
ALLEGRO_EVENT_QUEUE * event_queue = NULL;
ALLEGRO_TIMER * timer = NULL;


void Init();


#endif // INIT_H_INCLUDED


init.cpp
C/C++
#include "init.h"

void Init()
{
    al_init();
    timer = al_create_timer( 1.0 / FPS );
    display = al_create_display( SCREEN_W, SCREEN_H );
   
    al_set_target_bitmap( al_get_backbuffer( display ) );
   
    event_queue = al_create_event_queue();
   
    al_register_event_source( event_queue, al_get_display_event_source( display ) );
   
    al_register_event_source( event_queue, al_get_timer_event_source( timer ) );
   
    al_install_mouse();
    al_install_keyboard();
    al_register_event_source( event_queue, al_get_mouse_event_source() );
    al_register_event_source( event_queue, al_get_keyboard_event_source() );
   
    al_clear_to_color( al_map_rgb( 0, 0, 0 ) );
   
    al_flip_display();
   
    al_start_timer( timer );
}


pilka.h
C/C++
#ifndef PILKA_H_INCLUDED
#define PILKA_H_INCLUDED

#include "main.h"

extern ALLEGRO_BITMAP * bouncer = NULL;
const int BOUNCER_SIZE = 100;

float bouncer_x = SCREEN_W / 2.0 - BOUNCER_SIZE / 2.0;
float bouncer_y = SCREEN_H / 2.0 - BOUNCER_SIZE / 2.0;
float bouncer_dx = - 4.0, bouncer_dy = 4.0;

void CreateBall();

void MoveBall();

void DrawBall();


#endif // PILKA_H_INCLUDED


pilka.cpp
C/C++
#include "pilka.h"

void CreateBall()
{
    bouncer = al_create_bitmap( BOUNCER_SIZE, BOUNCER_SIZE );
    al_set_target_bitmap( bouncer );
}

void MoveBall()
{
    if( bouncer_x < 0 || bouncer_x > SCREEN_W - BOUNCER_SIZE ) {
        bouncer_dx = - bouncer_dx;
    }
   
    if( bouncer_y < 0 || bouncer_y > SCREEN_H - BOUNCER_SIZE ) {
        bouncer_dy = - bouncer_dy;
    }
   
    bouncer_x += bouncer_dx;
    bouncer_y += bouncer_dy;
}

void DrawBall()
{
    al_draw_bitmap( bouncer, bouncer_x, bouncer_y, 0 );
}


Prosiłbym o jakieś podpowiedzi czy coś, jak zaincludować poprawnie te pliki bo co nie zrobie to jest źle heh... :)
P-28804
DejaVu
» 2011-03-03 17:02:10
P-28805
SeaMonster131
Temat założony przez niniejszego użytkownika
» 2011-03-03 17:13:35
Hmm...przeczytałem to już :)

No więc mam tak:


main.cpp:
#include <stdio.h>
#include <allegro5/allegro.h>
#include "init.h"
#include "pilka.h"


init.h:
#include <allegro5/allegro.h>


init.cpp:
#include "init.h"


pilka.h:
#include <allegro5/allegro.h>


pilka.cpp:
#include "pilka.h"



A błędy mam np takie:
C:\Documents and Settings\admin\Pulpit\all5 mini pr\pilka.cpp|4|multiple definition of `bouncer'

obj\Debug\main.o:C:\Documents and Settings\admin\Pulpit\all5 mini pr\main.cpp|16|first defined here|
Przy czym 16 linijka w main.cpp to otworzenie klamry głównej funkcji... ;/
P-28806
dmx81
» 2011-03-03 17:24:53
ogolnie to
plik.h zawierac powinien wszystkie deklaracje (czyli jak cos wyglada)+potrzebne biblioteki(lub inne pliki .h), z ktorych w tych deklaracjach bedziesz korzystal
a plik.cpp zawierac powinien dolaczony plik.h i definicje, czyli rozwiniecie deklaracji.

np:
C/C++
//plik.h

#ifndef PLIK_H
#define PLIK_H

#include <string> //bo bedzie w deklaracji wykorzystany string

class C1
{
public:
    std::string napis;
    void funkcja_pokaz();
};

#endif //koniec plik.h

//a plik.cpp wygladac bedzie tak

#include "plik.h" // w cudzyslowiu, bo plik w katalogu z projetkem
#include <iostream> // w ostrych nawiasach, bo w domyslnym katalogu bibliotek, dla cout
void C1::funkcja_pokaz() // C1:: operator zasiegu + "wlasiciel" funkcji,czyli klasa C1
{
    std::cout << napis;
}

// a main.cpp

#include <plik.h>

int main()
C1 c;
c.funkcja_pokaz;
return 0;
}

to tak mniej wiecej, mam nadzieje, ze bledow nie popelnilem, chodzilo glownie o przyklad
P-28807
dmx81
» 2011-03-03 17:29:41
pokaz, jak wygladaja teraz te 2 pliki - masz komunikat o wielokrotnej definicji (pewnie jedna ze zmiennych powinna byc jako extern - w pliku main)
P-28808
SeaMonster131
Temat założony przez niniejszego użytkownika
» 2011-03-03 17:38:09
Dam Wam całą paczke, bo chyba tutaj na forum nie jest to zbyt czytelne... heh :)

http://www.speedyshare.com/files/27185963/test.rar (12Kb, projekt w CodeBlocks)
P-28810
dmx81
» 2011-03-03 18:11:10
ja bym sprobowal takiej zmiany:
 zmienne nie zamkniete w klasach (czyli u ciebie wszytskie bouncer itd) - jesli sa deklarowane i definiowane w jakims pliku - wypisz je jeszcze raz w pliku main ze slowkiem extern zanim ich uzyjesz, np
C/C++
//plik.cpp

float bounce_x = 1;

// plik main.cpp

extern float bounce_x; /* bez nadawania wartosci - informujesz tylko, ze program powinien uzywac tej zmiennej, ale ze jest ona juz zdefiniowana w innym miejscu, wiec nie definiuj ponownie (uzyj istniejacej), a dzieki #include kompilator/linker poszuka tej zmiennej w dolaczanym pliku*/
a pozniej juz normalnie uzywac.
a kodu nie sprawdze, bo nie mam allegro 5
P-28811
szyx_yankez
» 2011-03-03 18:46:05
Kod w tej paczce się trochę różni niż ten forum, ale generalnie brakuje tam funkcij głównej programu.
Gdy do 'main.cpp' dodałem:
C/C++
int main()
{
}
Wszystko kompiluje się poprawnie.
P-28812
« 1 » 2
  Strona 1 z 2 Następna strona