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

[C++] error C2146: syntax error : missing ';' before identifier

Ostatnio zmodyfikowano 2012-12-30 02:20
Autor Wiadomość
sinoo
Temat założony przez niniejszego użytkownika
» 2012-12-28 16:27:56
To jak mam to poskładać? A może zrobić w ten sposób, że zmienna zadeklarowana w pliku głównym(main.cpp) byłaby dostępna w każdym pliku nagłówkowym... Teoretycznie(patrząc po mojemu) należałoby jedynie stworzyć zmienne globalne w pliku "main.cpp", ale to już próbowałem i coś nie pykło. Właściwie to wywala dużo mniej błędów - sami zobaczcie:

1>------ Build started: Project: SFML_Game1, Configuration: Debug Win32 ------
1>Compiling...
1>main.cpp
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\events.h(10) : error C2065: 'GameApp' : undeclared identifier
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\events.h(10) : error C2228: left of '.GetEvent' must have class/struct/union
1>        type is ''unknown-type''
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\events.h(10) : fatal error C1903: unable to recover from previous error(s); stopping compilation
1>Build log was saved at "file://e:\Documents and Settings\SysOp\Moje dokumenty\Visual Studio 2008\Projects\SFML_Game1\SFML_Game1\Debug\BuildLog.htm"
1>SFML_Game1 - 3 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Jedyny problem jaki się teraz nasuwa to brak deklaracji dla GameApp w pliku "Events.h", ale nie wiem dlaczego - w innych plikach go nie brakuje(przynajmniej nie wywala błędu informującego o tym). W takim wypadku próbowałem użyć
extern sf::RenderWindow GameApp
, ale w ten sposób niestety wróciłem znowu do poprzedniej sytuacji(masa tych samych błędów)
P-72196
DejaVu
» 2012-12-28 16:40:36
Frazy, które należy wpisać w wyszukiwarkę google:
P-72199
sinoo
Temat założony przez niniejszego użytkownika
» 2012-12-28 17:29:50
DejaVu - dzięki bo bardzo mi się przydało przy porządkowaniu kodu, ale nic poza tym. Ciąglę mój problem został nierozwiązany. Dla odświeżenia kod wygląda teraz w ten sposób:

main.cpp
C/C++
#include <SFML/Graphics.hpp>

sf::RenderWindow GameApp( sf::VideoMode( 800, 600, 32 ), "SFML Untitled aplication" );
Hero hero( 100, 100, true );
Game1 Game;
sf::Image img;

img.LoadFromFile( "2.png" );

int main()
{
    Game.onStart();
   
    while( GameApp.IsOpened() )
    {
        GameEvent();
        Game.Update();
        Game.Draw();
    }
    return 0;
}

Game1.h
C/C++
#pragma once
#ifndef Game1_h
#define Game1_h

#include <SFML/Graphics.hpp>

class Game1
{
public:
    void onStart();
    void Update();
    void Draw();
    void Exit();
};


#endif

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

void Game1::onStart()
{
    hero.start( img );
}

void Game1::Update()
{
}

void Game1::Draw()
{
    GameApp.Clear( sf::Color( 255, 255, 255 ) );
    GameApp.Draw( hero.sprite );
    GameApp.Display();
}

void Game1::Exit()
{
    GameApp.Close();
}

Hero.h
C/C++
#pragma once
#ifndef Hero_h
#define Hero_h

#include <SFML/Graphics.hpp>

class Hero
{
    int posX;
    int posY;
    bool flip;
    sf::Sprite sprite;
    float speed;
   
    Hero( int PosX, int PosY, bool Flip )
        : posX( PosX )
        , posY( PosY )
        , flip( Flip )
    { }
   
public:
    void start( sf::Image * IMG );
    bool Colision();
    void Run();
};

#endif

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

void Hero::start( sf::Image * IMG )
{
    sprite.SetImage( IMG );
    sprite.SetPosition( posX, posY );
    speed = + 1.0;
    sprite.FlipX( flip );
}

bool Hero::Colision()
{
    return false;
}

void Hero::Run()
{
    sprite.Move( speed, 0.0 );
}

Events.h
C/C++
#pragma once
#ifndef Events_h
#define Events_h

#include <SFML/Graphics.hpp>

sf::Event Event;

void GameEvent();

#endif

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

void GameEvent()
{
    while( GameApp.GetEvent( Event ) )
    {
        if( Event.Type == sf::Event::Closed )
             Game.Exit();
       
        if( Event.Key == sf::Key::D )
        {
            if( hero.Colision() == false )
                 hero.Run();
           
        }
       
    }
}

A oto log z kompilacji:
1>------ Build started: Project: SFML_Game1, Configuration: Debug Win32 ------
1>Compiling...
1>main.cpp
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\main.cpp(4) : error C2146: syntax error : missing ';' before identifier 'hero'
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\main.cpp(4) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\main.cpp(4) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\main.cpp(4) : error C2078: too many initializers
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\main.cpp(5) : error C2146: syntax error : missing ';' before identifier 'Game'
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\main.cpp(5) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\main.cpp(5) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\main.cpp(8) : error C2143: syntax error : missing ';' before '.'
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\main.cpp(8) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\main.cpp(8) : error C2371: 'img' : redefinition; different basic types
1>        e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\main.cpp(6) : see declaration of 'img'
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\main.cpp(12) : error C2228: left of '.onStart' must have class/struct/union
1>        type is 'int'
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\main.cpp(16) : error C3861: 'GameEvent': identifier not found
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\main.cpp(17) : error C2228: left of '.Update' must have class/struct/union
1>        type is 'int'
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\main.cpp(18) : error C2228: left of '.Draw' must have class/struct/union
1>        type is 'int'
1>Hero.cpp
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\hero.cpp(5) : error C2664: 'sf::Sprite::SetImage' : cannot convert parameter 1 from 'sf::Image *' to 'const sf::Image &'
1>        Reason: cannot convert from 'sf::Image *' to 'const sf::Image'
1>        No constructor could take the source type, or constructor overload resolution was ambiguous
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\hero.cpp(6) : warning C4244: 'argument' : conversion from 'int' to 'float', possible loss of data
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\hero.cpp(6) : warning C4244: 'argument' : conversion from 'int' to 'float', possible loss of data
1>Game1.cpp
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\game1.cpp(5) : error C2065: 'hero' : undeclared identifier
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\game1.cpp(5) : error C2228: left of '.start' must have class/struct/union
1>        type is ''unknown-type''
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\game1.cpp(5) : error C2065: 'img' : undeclared identifier
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\game1.cpp(14) : error C2065: 'GameApp' : undeclared identifier
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\game1.cpp(14) : error C2228: left of '.Clear' must have class/struct/union
1>        type is ''unknown-type''
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\game1.cpp(15) : error C2065: 'GameApp' : undeclared identifier
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\game1.cpp(15) : error C2228: left of '.Draw' must have class/struct/union
1>        type is ''unknown-type''
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\game1.cpp(15) : error C2065: 'hero' : undeclared identifier
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\game1.cpp(15) : error C2228: left of '.sprite' must have class/struct/union
1>        type is ''unknown-type''
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\game1.cpp(16) : error C2065: 'GameApp' : undeclared identifier
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\game1.cpp(16) : error C2228: left of '.Display' must have class/struct/union
1>        type is ''unknown-type''
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\game1.cpp(21) : error C2065: 'GameApp' : undeclared identifier
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\game1.cpp(21) : error C2228: left of '.Close' must have class/struct/union
1>        type is ''unknown-type''
1>Event.cpp
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\event.cpp(5) : error C2065: 'GameApp' : undeclared identifier
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\event.cpp(5) : error C2228: left of '.GetEvent' must have class/struct/union
1>        type is ''unknown-type''
1>e:\documents and settings\sysop\moje dokumenty\visual studio 2008\projects\sfml_game1\sfml_game1\event.cpp(5) : fatal error C1903: unable to recover from previous error(s); stopping compilation
1>Generating Code...
1>Build log was saved at "file://e:\Documents and Settings\SysOp\Moje dokumenty\Visual Studio 2008\Projects\SFML_Game1\SFML_Game1\Debug\BuildLog.htm"
1>SFML_Game1 - 31 error(s), 2 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
W ten sposób łatwiej ogarnąć kod, ale co do zmiennej dostępnej w każdym pliku, to było w tych wynikach podanych przez DejaVu tyle, by stworzyć globalne, a ja już je mam i błędy dalej są. Starałem się jużto ogarnąć na wiele sposobów, ale widocznie trzeba to rozwiązać w sposób, jakiego jeszcze nie znam. Mam nadzieję, że kto mi wytłumaczy o co chodzi, bo ja już ręce załamuje.
P-72202
jsc
» 2012-12-28 18:07:57
I znowu nie załączyłeś swoich bibliotek.
P-72207
Admixior
» 2012-12-30 02:20:15
W skrócie nie rozumiesz w jaki sposób kompilator kompiluje jeśli są oddzielne pliki

0. do maina dołącz hero.h
1. do maina dołacz game1.h
2. do...
Zlituj się Panie Boże i oszczędź moich oczu.
img.LoadFromFile( "2.png" );
 dlaczego to umieściłeś przed main?? Toż to przecież jest kod wykonywalny, a takie tylko mogą się robić w funkcjach (np. w main). Jak umieściłeś je tak jak teraz to kiedy by miało się to wykonać??? Przy której funkcji? losowej?
3. hero.cpp linia 5 - - funkcja nie może mieć różnych parametrów od deklaracji w klasie (referencja!=adres(wskaźnik))
4. Do game1.h dołącz hero.h
5. game1.cpp nie wie co to img i GameApp (dowiedz go).
   Z mojego doświadczenia lepiej przesyłać dane typu adres obrazka i tym bardzie refencja (lub adres) okna przez parametr. W sumie tak później robisz z obrazkiem do klasy hero (tak mieszanie)
6. Dlaczego zdefiniowałeś Event w nagłówku. Unikaj takiego bo późnej 2 razy dołączysz plik i będziesz miał redefinition.Zamiast tego jak już jest potrzebne (a tu nie) dawaj deklaracje a wpliku cpp dawaj definicje.
7. event.cpp nie wie co to gameApp i hero ...
8. #pragma once  ==  #ifndef bla \ #define bla \ \ \ #endif

To tyle po krótkiej analizie logów błędu i kodu
P-72349
1 « 2 »
Poprzednia strona Strona 2 z 2