Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Omituisia erroreita

Sivun loppuun

mika132 [06.08.2011 16:55:28]

#

Eli siis monissa oppaissa mitkä liittyvät OpenGL on kirjoitettu esim näin:

bool	keys[256];
bool	active=TRUE;
bool	fullscreen=TRUE;
bool	blend;
bool	bp;
bool	fp;

mutta kun itse kirjoitan noin tulee erroreita. Mitähän nämä tarkoittaa:

C:\Documents and Settings\Mika\Työpöytä\Mika\CPP\Harjoittelua\main.c:21: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token
C:\Documents and Settings\Mika\Työpöytä\Mika\CPP\Harjoittelua\main.c:22: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'active'
C:\Documents and Settings\Mika\Työpöytä\Mika\CPP\Harjoittelua\main.c:23: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'fullscreen'
C:\Documents and Settings\Mika\Työpöytä\Mika\CPP\Harjoittelua\main.c:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'blend'
C:\Documents and Settings\Mika\Työpöytä\Mika\CPP\Harjoittelua\main.c:25: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'bp'
C:\Documents and Settings\Mika\Työpöytä\Mika\CPP\Harjoittelua\main.c:26: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'fp'

vesikuusi [06.08.2011 17:10:00]

#

g++ 4.5.2 käyttäen kääntyy ainakin:

int main()
{
    bool	keys[256];
    bool	active=true;
    bool	fullscreen=true;
    bool	blend;
    bool	bp;
    bool	fp;
}

Mitä kääntäjää käytät?
Olisiko mahdollista nähdä koodia ennen näitä rivejä?

Deffi [06.08.2011 17:34:26]

#

Veikkaan että käytät vahingossa tai tarkoituksella C-kääntäjää, josta ei löydy bool-tietotyyppiä. Lisää rivien yläpuolelle:

typedef unsigned char bool;
#define FALSE 0
#define TRUE 1

mika132 [06.08.2011 17:55:44]

#

Käytän CodeBlocksia.

Tosiaan C kääntäjä oli käytössä. Oli tullut käyttöön kun otin OpenGL projektin. Tein uuden projektin ja nyt käytössä on console application.

Tein taas lisää säätöjä ja nyt törmäsin toiseen ongelmaan.

main.cpp:262: error: too few arguments to function 'GLvoid KillGLWindow(<type error>)'
main.cpp:693: error: at this point in file


Tuo ylempi errori ilmaantui alapuolella olevan koodin ensimmäisestä rivistä eli:
int InitGL(GLvoid)

alimmainen errori rivi on:

KillGLWindow();

mutta pistin koko funktion siihen. Ja kuten näkyy se on suorakopio oppaasta josta sitä luin koska opin parhaiten (kokemusta on) niin että saan jonkun lähdepohjan toimimaan jota muokkailen ja haluan tämän toimimaan.

int InitGL(GLvoid) // All Setup For OpenGL Goes Here
{
	if (!LoadGLTextures())								// Jump To Texture Loading Routine
	{
		return FALSE;									// If Texture Didn't Load Return FALSE
	}

	glEnable(GL_TEXTURE_2D);							// Enable Texture Mapping
	glBlendFunc(GL_SRC_ALPHA,GL_ONE);					// Set The Blending Function For Translucency
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);				// This Will Clear The Background Color To Black
	glClearDepth(1.0);									// Enables Clearing Of The Depth Buffer
	glDepthFunc(GL_LESS);								// The Type Of Depth Test To Do
	glEnable(GL_DEPTH_TEST);							// Enables Depth Testing
	glShadeModel(GL_SMOOTH);							// Enables Smooth Color Shading
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	// Really Nice Perspective Calculations

	SetupWorld();

	return TRUE;										// Initialization Went OK
}

vesikuusi [06.08.2011 18:04:23]

#

Postaamassasi koodissa ei näy kohtaa, jossa 'GLvoid KillGLWindow(<type error>)' -funktiota kutsutaan, joten emme voi auttaa. Etsipä ensin tuo kohta :)

mika132 [06.08.2011 18:29:08]

#

Hups. anteeksi pieni ajatuskatkos :D

GLvoid KillGLWindow(GLvoid)								// Properly Kill The Window
{
	if (fullscreen)										// Are We In Fullscreen Mode?
	{
		ChangeDisplaySettings(NULL,0);					// If So Switch Back To The Desktop
		ShowCursor(TRUE);								// Show Mouse Pointer
	}

	if (hRC)											// Do We Have A Rendering Context?
	{
		if (!wglMakeCurrent(NULL,NULL))					// Are We Able To Release The DC And RC Contexts?
		{
			MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
		}

		if (!wglDeleteContext(hRC))						// Are We Able To Delete The RC?
		{
			MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
		}
		hRC=NULL;										// Set RC To NULL
	}

	if (hDC && !ReleaseDC(hWnd,hDC))					// Are We Able To Release The DC
	{
		MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
		hDC=NULL;										// Set DC To NULL
	}

	if (hWnd && !DestroyWindow(hWnd))					// Are We Able To Destroy The Window?
	{
		MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
		hWnd=NULL;										// Set hWnd To NULL
	}

	if (!UnregisterClass("OpenGL",hInstance))			// Are We Able To Unregister Class
	{
		MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
		hInstance=NULL;									// Set hInstance To NULL
	}
}

vesikuusi [06.08.2011 18:48:00]

#

Juu, tässä on nyt siis itse funktio. Virhe johtuu siitä, että funktiota kutsuttaessa sille annetaan liian vähän parametreja (tässä tapauksessa ei yhtään, koska funktio vaatii yhden GLvoid-parametrin). Eli nyt pitäisi nähdä se kohta, jossa kyseistä funktiota kutsutaan. Se näyttänee tältä:

KillGLWindow ();

Sen tulisi varmaankin näyttää tältä:

KillGLWindow (GLvoid);

Edit: Ko. funktiokutsu on siis saamasi virheviestin perusteella tiedostossa main.cpp rivillä 262.

mika132 [06.08.2011 19:11:41]

#

Mahtaako minulta puuttua jotain? Nimittäin sain 50 erroria. Laitan muutaman errorin tähän jos niistä käy selväksi että jotain puuttuu.

main.cpp:138: undefined reference to `glGenTextures@8'
main.cpp:141: undefined reference to `glBindTexture@8'
main.cpp:142: undefined reference to `glTexParameteri@12'
main.cpp:143: undefined reference to `glTexParameteri@12'
main.cpp:144: undefined reference to `glTexImage2D@36'
main.cpp:147: undefined reference to `glBindTexture@8'

//Rivi 138:
glGenTextures(3, &texture[0]);

//rivi 141:
glBindTexture(GL_TEXTURE_2D, texture[0]);

//Rivi 142:			glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

Olen includettanut kyllä:

#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>


ja:
codebolock/MinGW/gl/
kansiosta löytyy kyseiset tiedostot.

jimi-kimi [07.08.2011 00:23:48]

#

Edelleen, jos sinulta puuttuu funktio kutsusta parametreja -> ei toimi.
Et ole linkannut tarpeellisia kirjastoja -opengl32(?)

Ihan alkeita taas. Kääntäjä kertoo virheilmoituksilla missä mättää. Tässä tapauksessa kysyjän korvien välissä.

vesikuusi [07.08.2011 01:28:50]

#

En sano yhtyväni ylläolevaan viestiin, mutta suosittelen opettelemaan ja sisäistämään C ja/tai C++ perusteet ja sitten alkaa vasta katella muita juttuja :)

mika132 [07.08.2011 02:02:23]

#

No tarkistin GLAUX.h tiedoston jossa kyseinen funktio esitellään, että onko parametrit väärin, mutta ymmärtääkseni ei ole?

Tässä suoraan GLAUX.h tiedostosta otettu kohta yhteen funktioista liittyvään asiaan.

AUX_RGBImageRec * APIENTRY auxDIBImageLoadA(LPCSTR);
AUX_RGBImageRec * APIENTRY auxDIBImageLoadW(LPCWSTR);

Tässä itse ohjelmasta miten sitä käytetään:

return auxDIBImageLoadA(Filename);       // Tässä on ainoastaan yksi 50 errori rivistä.


//Tässä vielä funktio jossa kyseinen koodi on:
AUX_RGBImageRec *LoadBMP(char *Filename)                // Loads A Bitmap Image
{
        FILE *File=NULL;                                // File Handle

        if (!Filename)                                  // Make Sure A Filename Was Given
        {
                return NULL;                            // If Not Return NULL
        }

        File=fopen(Filename,"r");                       // Check To See If The File Exists

        if (File)                                       // Does The File Exist?
        {
                fclose(File);                           // Close The Handle
                return auxDIBImageLoadA(Filename);       // Load The Bitmap And Return A Pointer
        }
        return NULL;                                    // If Load Failed Return NULL
}

Ja funktiota haetaan:

if (TextureImage[0]=LoadBMP("Data/tekstuuri.bmp"))


//Ja tässä vielä funktio jossa tuo on:

int LoadGLTextures()                                    // Load Bitmaps And Convert To Textures
{
        int Status=FALSE;                               // Status Indicator

        AUX_RGBImageRec *TextureImage[1];               // Create Storage Space For The Texture

        memset(TextureImage,0,sizeof(void *)*1);        // Set The Pointer To NULL

        // Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
        if (TextureImage[0]=LoadBMP("Data/Mud.bmp"))
        {
                Status=TRUE;                            // Set The Status To TRUE

                glGenTextures(3, &texture[0]);          // Create Three Textures

				// Create Nearest Filtered Texture
				glBindTexture(GL_TEXTURE_2D, texture[0]);
				glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
				glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
				glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

                // Create Linear Filtered Texture
                glBindTexture(GL_TEXTURE_2D, texture[1]);
                glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
                glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
                glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

				// Create MipMapped Texture
				glBindTexture(GL_TEXTURE_2D, texture[2]);
				glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
				glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
				gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
        }
        if (TextureImage[0])                            // If Texture Exists
        {
                if (TextureImage[0]->data)              // If Texture Image Exists
                {
                        free(TextureImage[0]->data);    // Free The Texture Image Memory
                }

                free(TextureImage[0]);                  // Free The Image Structure
        }

        return Status;                                  // Return The Status
}

User137 [07.08.2011 02:44:34]

#

Keskustelun kulusta päätellen toisi kai enemmän informaatiota jos copy-pasteaisit myös kaikki kääntäjälle antamasi parametrit.

main.cpp:138: undefined reference to `glGenTextures@8'

Tuo virhe kai edelleen tarkoittaa ettei kääntäjä löydä koko funktiota mistään tiedostosta mitä olet sille antanut.

Ja muuten vaan... en ymmärrä miksi luot 3 versiota yhdestä tekstuurista. Jos aiot käyttää linear ja mipmap, sinulle riittää ladata vain se.

mika132 [07.08.2011 14:08:18]

#

Parametrithän näkyvät tuossa.

esim:

glGenTextures(3, &texture[0]); // siinä on kolme ja texture[0]

eli minulta mitä ilmeisemmin puuttuu jotain jos kyseistä funktiota ei löydy kääntäjältä? Onko jotain pakettia netissä josta saa kaikki openGL liittyvät jutut? Itse en ole vielä löytänyt. Eli .dll kirjastot .libit yms. Ilmeisesti CodeBlocksissa ei ole valmiina näitä kaikkia vaikkakin OpenGL on mahdollista aloittaa projektina.

Spongi [07.08.2011 17:39:27]

#

Linkkaa opengl32.lib mukaan (-lopengl32)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta