Utilizator:
Parola:
Am uitat parola... | Cont nou!


Articole Resurse Echipe Competiții Proiecte Forum DevBlogs Locuri de muncă GDROMag Issue#1 GDROCon 2007

 
Forum » Programare » Altele » Eroare la compilare




Pagina 1 din 5 [ 1 | 2 | 3 | 4 | 5 ]

Mesaj Info autor
    Postat la 17 Feb 2010 20:15:04    Subiect: Eroare la compilare
Fuzzball info:

Fuzzball:

Apelez si eu la cei care au mai multa experienta in ale programarii sa ma ajute sa gasesc de ce nu se compileaza urmatorul program. Vreau sa fac un mini-engine bazat pe DirectX pentru un posibil viitor joc. O sa postez fragmentele din cod in care compilatorul imi indica unde e greseala.


Programul e compus din cateva fisiere:

winmain.cpp (aici este functia WinMain in care creez doar un obiect de tip cApplication si apelez metoda Run() a acestuia)

Cod sursă:
#include "cApp.h"



intL WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{ /* aici imi indica 3 greseli si anume:

"1>c:beginning visual c++ 2005corescores 1.01winmain.cpp(5) : error C2628: 'cApp' followed by 'int' is illegal (did you forget a ';'?)"

"1>c:beginning visual c++ 2005corescores 1.01winmain.cpp(9) : error C2556: 'cApp WinMain(HINSTANCE,HINSTANCE,LPSTR,int)' : overloaded function differs only by return type from 'int WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
1>        c:program filesmicrosoft visual studio 8vcplatformsdkincludewinbase.h(1875) : see declaration of 'WinMain' "

";1>c:beginning visual c++ 2005corescores 1.01winmain.cpp(9) : error C2371: 'WinMain' : redefinition; different basic types
  1> c:program filesmicrosoft visual studio 8vcplatformsdkincludewinbase.h(1875) : see declaration of 'WinMain' "




*/


    int a;
    cApp App(nCmdShow, hInstance,  800, 600);
    
    App.Run();
    App.ShutDown();
    
    
    return 0;
}


-system_core.cpp si system_core.h (aici se afla clasa cApplication care in principiu contine metode pentru crearea fereastrei in windows, functia Run() si mai contine si un handler la fereastra)

-cApp.cpp si cApp.h. Aici se afla clasa cApp care mosteneste pe cApplication si in care se rescriu metodele virtuale din cApplication :Init(), Frame() si ShutDown() specifice jocului. Mai jos fragmentul de cod contine prima eroare.

Cod sursă:

#include "cApp.h"


cApp::cApp( int nCmdShow,
           HINSTANCE hInstance,
           DWORD Width, DWORD Height,
           int iFrameDelay, 
           DWORD XPos ,
           DWORD YPos ,
           BOOL Windowed)
           :cApplication(nCmdShow, hInstance, Width, Height, iFrameDelay, XPos, YPos, Windowed)
{    
    /* pe linia de mai sus imi indica ca ar fi eroare urmatoare

1>c:beginning visual c++ 2005corescores 1.01capp.cpp(11) : error C2533: 'cApp::{ctor}' : constructors not allowed a return type

*/

    m_pD3D = NULL;
    m_pD3D = new cGraphic();
}

cApp::~cApp()
{
    
}

//+ definitia altor functii pe care din motive de spatiu nu le-am mai pus
 


Ordinea in care apar erorile e cam asa:

cApp.cpp
1>c:beginning visual c++ 2005corescores 1.01capp.cpp(11) : error C2533: 'cApp::{ctor}' : constructors not allowed a return type
1>winmain.cpp
1>c:beginning visual c++ 2005corescores 1.01winmain.cpp(5) : error C2628: 'cApp' followed by 'int' is illegal (did you forget a ';'?)
1>c:beginning visual c++ 2005corescores 1.01winmain.cpp(9) : error C2556: 'cApp WinMain(HINSTANCE,HINSTANCE,LPSTR,int)' : overloaded function differs only by return type from 'int WinMain(HINSTANCE,HINSTANCE,LPSTR,int)'
1> c:program filesmicrosoft visual studio 8vcplatformsdkincludewinbase.h(1875) : see declaration of 'WinMain'
1>c:beginning visual c++ 2005corescores 1.01winmain.cpp(9) : error C2371: 'WinMain' : redefinition; different basic types
1> c:program filesmicrosoft visual studio 8vcplatformsdkincludewinbase.h(1875) : see declaration of 'WinMain'
1>Generating Code...
1>Build log was saved at "file://c:Beginning Visual C++ 2005CoresCores 1.01DebugBuildLog.htm"
1>Cores 1.01 - 4 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


-graphyx_core.cpp si graphyx_core.h (aici se afla clasa cGraphic care inglobeaza functiile Direct3D-ului dar care momentan nu contine decat o functie de initializare a Direct3D-ului si un handler la Device).

O sa continui sa spun despre cum e structurat programul ca sa va faceti o idee mai buna despre ce e vorba.

Clasa cApp mosteneste clasa cApplication si e o clasa in care scriu codul specific jocului si scriu metodele virtuale din cApplication Init(), ShutDown() si Frame() care contin cod specific jocului. Pe langa aceste 3 metode virtuale mai sunt si doua metode virtuale GameStart() si GameEnd() care nu prea le-am folosit dar sunt puse acolo ca "sa fie".


Functia Run() din cApplication are in mare structura urmatoare:

Cod sursă:
Run()
{   
    InitCore();    //creeaza fereastra si apeleaza metodele virtuale care nu fac nimic Init() si GameStart()

    while(TRUE)
    {
        if(mesaj)
        {
          trimite mesaj catre handlerul de mesaje
        }
        else
        Frame()        //este apelata metoda virtuala Frame() care in cAplication nu face nimic
       
    }
}


In WinMain() instantiez un obiect cApp si apelez metoda Run() a acestuia in felul urmator

WINMAI()
{
cApp App(...)
cApp.Run()
cApp.ShutDownCore() //metoda a lui cApplication care apeleaza metoda virtuala ShutDown() si GameEnd()
// care sunt rescrise in cApp
}

Si putin cod din definitia clasei cApplication, poate are relevanta:

system_core.h
Cod sursă:
#ifndef _SYSTEM_CORE
#define _SYSTEM_CORE

#include
#include
#include

LRESULT CALLBACK WndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam);


class cApplication
{
    public:

        //constructors & destructors
        
        static cApplication* m_pApplication;    //static pointer to the class

        cApplication(
                        int nCmdShow,
                        HINSTANCE hInstance,
                        DWORD Width,
                        DWORD Height,
                        int iFrameDelay = 50,
                        DWORD XPos = 200,        //up-left coord of window (if fullscreen doesn't matter)
                        DWORD YPos = 200,        //up-left coord of window (if fullscreen doesn't matter)
                        BOOL Windowed = TRUE);    


        virtual ~cApplication();

        //essential functions for the game core
        BOOL InitCore();    //creates window and calls Init() and GameInit()    
        void ShutDownCore(); //calls GameEnd() and ShutDown()
        int Run();

        
        //virtual functions for overloading when creating games
        virtual BOOL Init(){return TRUE;};
        virtual void ShutDown(){};
        virtual BOOL Frame(){return TRUE;};    //called once each frame;

        virtual BOOL GameInit(){return TRUE;};    //called to initialize game data, called by InitCore()
        virtual BOOL GameEnd(){return TRUE;};    //called to cleanup game data, called by ShutDownCore()
        
        //window event callback function
        LRESULT  HandleEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);    //

    protected:

        BOOL m_Windowed;
        
        HWND m_hWnd;
        HINSTANCE m_hInstance;
        
        DWORD m_XPos;
        DWORD m_YPos;
        DWORD m_Width;
        DWORD m_Height;
        int m_iFrameDelay;
        int m_nCmdShow;
        
        int m_done;    // 1 when game is exiting
    
    
};


#endif


system_core.cpp

Cod sursă:

#include "system_core.h"

cApplication *cApplication::m_pApplication = NULL;

//First the local window procedure
LRESULT CALLBACK WinProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam)
{
    // Route all Windows messages to the game engine
    return cApplication::m_pApplication->HandleEvent(hWindow, msg, wParam, lParam);
}





//Constructors and Destructors
cApplication::cApplication( int nCmdShow,
                            HINSTANCE hInstance,
                            DWORD Width,
                            DWORD Height,
                            int iFrameDelay, /* =50*/
                            DWORD XPos /*= 200*/,
                            DWORD YPos /*= 200*/
                            BOOL Windowed /*= TRUE*/ )
{
    m_Windowed = Windowed;
    m_iFrameDelay = iFrameDelay;
    m_done = 0;
    
    if (m_Windowed)
        {
            m_XPos = XPos;
            m_YPos = YPos;
        }
    else
        {
            m_XPos = 0;
            m_YPos = 0;
        }

    m_Width = Width;
    m_Height = Height;
    m_hInstance = hInstance;
    m_iFrameDelay = 50;    //set the default frames per second
    m_nCmdShow = nCmdShow;

    m_pApplication = this;
}

cApplication::~cApplication()
{

}


 



Pana sa introduc clasa cGraphic a mers. Clasa cGraphic e un wrapper pentru Direct3D care momentan doar initializeaza Direct3D-ul si continte un pointer catre Direct3DDevice.
Am introdus un pointer catre cGraphic in clasa mea cApp si in metoda Init() am apelat metoda de initializare a lui cGraphic (in care se initializeaza Direct3D-ul)
Nu cred ca problema sta in cGraphic cine am gresit cumva cand am scris codul de mostenire al clasei cApp din cApplication.

Daca poate cineva sa ma ajute ii multumesc anticipat.

Will code for food.


Status:
Înregistrat pe:
20 Apr 2008 16:32:46
Vârsta: 27 ani
Mesaje: 106
Locatie: Asteroid of neverending rape and faggotry
Programator

 
    Postat la 17 Feb 2010 21:41:17    Subiect: < fara subiect >
Dark info:

Dark:

Nu se intelege nimic din cod asa cum apare pe forum. Mai bine fa un zip cu fisierele implicate si uploadeaza-l pe undeva.

"Am crezut ca esti ceva mai avansat" - Nekitu, 2008 A.D.
Autobaza


Status:
Înregistrat pe:
12 May 2007 20:12:30
Vârsta: ? ani
Mesaje: 740
Locatie:
Programator

 
    Postat la 18 Feb 2010 00:28:18    Subiect: < fara subiect >
Sir Game-a-lot info:

Sir Game-a-lot:

Mie imi suna a inclusion problem. Incearca sa modifici felul in care folosesti in noile fisiere, fisierul principal care contine punctul de intrare winmain. Daca de ex, comentezi toate liniile de cod efectiv din clasa noua si scoti includurile vezi daca macar compileaza asa. Daca da, de acolo poate fi.

Nine women working in perfect harmony can't have a baby in 1 month.


Status:
Înregistrat pe:
25 Aug 2007 18:20:41
Vârsta: 33 ani
Mesaje: 116
Locatie: Cluj-Napoca
Programator
Zamolxis Interactive
 
    Postat la 18 Feb 2010 02:14:20    Subiect: < fara subiect >
Fuzzball info:

Fuzzball:

Am uploadat fisierele pe un site. Asta e linkul:

http://www.2shared.com/fadmin/11468306/c534a02b/Cores_101.rar.html

Hm, am mai uploadat pe un alt site ca sa fiu sigur ca vad ca pe primul nu stiu cum sa dau download sa verific ca merge

http://rapidshare.com/files/352121180/Cores_1.01.rar.html

Ultima editare efectuată de Fuzzball pe 18 Feb 2010 02:17:26; 1 editări în total

Will code for food.


Status:
Înregistrat pe:
20 Apr 2008 16:32:46
Vârsta: 27 ani
Mesaje: 106
Locatie: Asteroid of neverending rape and faggotry
Programator

 
    Postat la 18 Feb 2010 09:41:23    Subiect: < fara subiect >
Pintea info:

Pintea:

intL WINAPI WinMain...

intL ?



Status:
Înregistrat pe:
05 May 2007 14:50:45
Vârsta: 29 ani
Mesaje: 301
Locatie:
Programator

 
    Postat la 18 Feb 2010 10:55:10    Subiect: < fara subiect >
Fuzzball info:

Fuzzball:

Mmmm, nu e asta. Nu stiu de ce apare pe site "L"-ul ala ca la mine in fisier e scris corect (probabil am apasat din greseala pe "L" cand am dat copy/paste). Am uploadat fisierele pe rapidshare pentru cine are rabdarea si bunavointa sa incerce sa ma ajute. Mersi oricum de incercare! Very Happy

edit: Acum imi dau seama de la ce vine "L"-ul ala. Am vazut in unele carti ca mai e folosita si varianta (sincer, habar n-am ce inseamna dar am incercat si asa ca poate poate o merge):

FAR PASCAL WINAPI WinMain()

E inutil sa spun ca nu a mers nici asa.

Ultima editare efectuată de Fuzzball pe 18 Feb 2010 10:58:17; 1 editări în total

Will code for food.


Status:
Înregistrat pe:
20 Apr 2008 16:32:46
Vârsta: 27 ani
Mesaje: 106
Locatie: Asteroid of neverending rape and faggotry
Programator

 
    Postat la 18 Feb 2010 11:26:29    Subiect: < fara subiect >
Dark info:

Dark:

Pune punct si virgula dupa declaratia clasei cApp in cApp.h. De obicei erorile astea SF rezulta din asa ceva.

Dupa aia, pune un return TRUE sau ceva la sfirsitul lui cApp::Frame() si se va compila.

"Am crezut ca esti ceva mai avansat" - Nekitu, 2008 A.D.
Autobaza


Status:
Înregistrat pe:
12 May 2007 20:12:30
Vârsta: ? ani
Mesaje: 740
Locatie:
Programator

 
    Postat la 18 Feb 2010 19:01:52    Subiect: < fara subiect >
Sir Game-a-lot info:

Sir Game-a-lot:

Doar ai grija sa nu cazi in extrema cealalta, la fel de "productiva" la capitolul erori, de data asta doar la runtime...

Cod sursă:
while(!what_the_heck);
{
    // Briliant code, executes just one time...
}

Nine women working in perfect harmony can't have a baby in 1 month.


Status:
Înregistrat pe:
25 Aug 2007 18:20:41
Vârsta: 33 ani
Mesaje: 116
Locatie: Cluj-Napoca
Programator
Zamolxis Interactive
 
    Postat la 18 Feb 2010 20:41:44    Subiect: < fara subiect >
Fuzzball info:

Fuzzball:

Thanks so much guys! Very Happy
Pot sa imi continui munca! Mr. Green

Will code for food.


Status:
Înregistrat pe:
20 Apr 2008 16:32:46
Vârsta: 27 ani
Mesaje: 106
Locatie: Asteroid of neverending rape and faggotry
Programator

 
    Postat la 27 Feb 2010 00:28:44    Subiect: < fara subiect >
Fuzzball info:

Fuzzball:

Mai am o problema de care nu stiu cum sa trec.

Se da programelul urmator:

Cod sursă:
#include
#include

void Message(char *mess)
{
    MessageBox(NULL, mess, L"Error title", MB_OK | MB_ICONERROR);
}


int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    Message("Ce mai faci?");

    return 0;
}


Imi da eroare la compilare:
error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'char *' to 'LPCWSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

Cum convertesc un sir de caractere in "LPCWSTR"?
Si inca o intrebare : De ce trebuie sa pun mereu L in fata sirului de caractere dintre ghilimele (cum e de exemplu in cazul L"Error title")?

Will code for food.


Status:
Înregistrat pe:
20 Apr 2008 16:32:46
Vârsta: 27 ani
Mesaje: 106
Locatie: Asteroid of neverending rape and faggotry
Programator

 
    Postat la 27 Feb 2010 01:52:43    Subiect: < fara subiect >
Dark info:

Dark:

Ai proiectul setat pe Unicode (project properties, general). Ori pui character set pe "not set", ca sa folosesti linistit char* peste tot, ori folosesti wchar_t* peste tot (sau unul din sinonimele de cacat din Winapi, cum ar fi WCHAR*, TCHAR*, LPWSTR etc.).

Cind pui L in fata unui string, el devine Unicode, adica fiecare caracter are 2 bytes, si in consecinta il poti pasa unei functii care doreste un wchar_t*. Ideea cu Unicode e ca pe pamint exista mai mult de 255 de litere (din pacate) si deci nu poti scrie in Thai cu ASCII. D-aia s-a inventat Unicode, care in principiu e simplu - 2 bytes per caracter, 65536 de litere - iar in practica este extrem de complicat, cu un miliard de substandarde, probleme si cu o multime de feluri de a scrie aceeasi litera. Mai multe detalii pe Wikipedia.

Toate functiile din Winapi care iau string-uri au doua variante: una cu sufixul A, alta cu sufixul W. De exemplu, nu exista functia MessageBox(), exista MessageBoxA() si MessageBoxW(). MessageBox() este un macro mapat la aia cu A daca proiectul e setat pe ASCII sau la aia cu W daca e pe Unicode (da-i go to definition in VS sa vezi cu ochiul tau). Daca esti control freak, scrii direct ce functie doresti, fara sa te bazezi pe macro, si esti sigur ca se compileaza codul indiferent ce setari sint in proiect.

In afara de asta, nu mai pasa string-uri constante, adica alea facute cu "" prin parametri fara const. Functia ta trebuia sa fie:

Cod sursă:

void Message(const char* msg)
 


pe ASCII, respectiv:

Cod sursă:

void Message(const wchar_t* msg)
 


daca ramii pe Unicode. Daca nu le pui const, intr-o zi o sa ai ideea nefericita de a scrie intr-un string d-asta, si in loc sa-ti spuna compilatorul ca intreci masura, o sa-ti spuna OS-ul abia la runtime sub forma dialogului aluia cu "has stopped working". Oricum, compilatoarele de C++ mai din zilele noastre se oftica daca pasezi "blabla" unei functii care ia char* fara const (alea de C cel mult dau un warning).

Se poate converti intre ASCII si Unicode folosind tot felul de giumbuslucuri (cum ar fi specificatorul %S pentru sprintf), dar e bine sa nu ajungi la asa ceva ci sa-ti tii toate string-urile in acelasi character set. Nu orice string Unicode se poate converti in ASCII, deci nu-i o idee buna sa faci chestii d-astea.

Ultima editare efectuată de Dark pe 27 Feb 2010 01:54:47; 1 editări în total

"Am crezut ca esti ceva mai avansat" - Nekitu, 2008 A.D.
Autobaza


Status:
Înregistrat pe:
12 May 2007 20:12:30
Vârsta: ? ani
Mesaje: 740
Locatie:
Programator

 
    Postat la 28 Feb 2010 13:31:41    Subiect: < fara subiect >
Fuzzball info:

Fuzzball:

Tot eu sunt tot cu o problema Very Happy

Am mai facut unele chestii la micul meu engine. I-am mai adaugat suport pentru input si am incercat sa fac un wrapper pentru IDirect3DSurface9. Am testat wrapperul asta intr-un mic programel si nu prea merge. Se compileaza, ruleaza, se initializeaza dar cand sa deseneze ceva pe ecran nu deseneaza nimic si metoda Draw returneaza un hresurt fail . Am pus un mic mesaj de erroare ca sa marcheze locul cu probleme. Nu stiu de ce face chestia asta. Am incercat sa randez o suprafata folosind doar metodele device-ului (fara niciun wrapper, fara nimic) si a mers. Cand i-am facut clasa vad ca nu mai merge.

Mai jos e codul: http://rapidshare.com/files/357008986/Testing_cTile_class.rar.html

Poate are cineva idee de ce nu merge. Sad

Will code for food.


Status:
Înregistrat pe:
20 Apr 2008 16:32:46
Vârsta: 27 ani
Mesaje: 106
Locatie: Asteroid of neverending rape and faggotry
Programator

 
    Postat la 28 Feb 2010 18:16:02    Subiect: < fara subiect >
Dark info:

Dark:

Pune codul pe yousendit.com sau alt serviciu d-asta free de hosting, rapidshare nu ma lasa sa-l downloadez (cica sint ocupate toate sloturile free).

"Am crezut ca esti ceva mai avansat" - Nekitu, 2008 A.D.
Autobaza


Status:
Înregistrat pe:
12 May 2007 20:12:30
Vârsta: ? ani
Mesaje: 740
Locatie:
Programator

 
    Postat la 28 Feb 2010 23:47:45    Subiect: < fara subiect >
Fuzzball info:

Fuzzball:

Asta merge?

http://www.filefactory.com/file/b06867e/n/Testing_cTile_class.rar

Am incercat cu yousendit si vad ca nu pot (sau cel putin nu stiu cum sa) sa hostez vreun file pe siteul lor, trebuie neaparat sa specific adresa de destinatie. (ceea ce ma face sa cred ca au servicii doar de file transfer)

Will code for food.


Status:
Înregistrat pe:
20 Apr 2008 16:32:46
Vârsta: 27 ani
Mesaje: 106
Locatie: Asteroid of neverending rape and faggotry
Programator

 
    Postat la 01 Mar 2010 00:07:24    Subiect: < fara subiect >
jos8cal info:

jos8cal:

http://www.fileshare.ro/

"Sunt la dispozitia dumneavoastra ca sa realizam ceea ce avem de realizat." (Blaxxunromania)

Breviar de personalitati.


Status:
Înregistrat pe:
10 Jun 2007 22:08:36
Vârsta: ? ani
Mesaje: 190
Locatie:


 

Pagina 1 din 5 [ 1 | 2 | 3 | 4 | 5 ]


Server time: 10:42:40 19.05.2012



[ Termeni si conditii | Contact | F.A.Q. | Funny Pictures ]

© 2006 - 2012 Copyright 7thFACTOR Entertainment - All rights reserved