Debug geht, Release nicht.

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Xethoras
Beiträge: 36
Registriert: 05.03.2008, 21:56

Debug geht, Release nicht.

Beitrag von Xethoras »

VC++ 2008 Express

Debug funktioniert auf meinem PC. Auf einem anderen hingegen werden nicht alle Buchstaben ausgegeben (Bitmapfont).
Release lässt sich nicht kompiliieren, die folgende Fehlermeldung (gleich mehrfach) tritt auf:
'const char [11]' kann nicht in 'LPCWSTR' konvertiert werden

Ich habe zugegebenermaßen noch nicht probiert zu casten. Aber selbst wenn das gehen wird, wüsste ich gerne, warum sich etwas im Debug kompiliieren lässt und im Release nicht.
Seraph
Site Admin
Beiträge: 1174
Registriert: 18.04.2002, 21:53
Echter Name: Steffen Engel

Re: Debug geht, Release nicht.

Beitrag von Seraph »

Du musst in deinen Projekteinstellungen Dich fuer entweder das "Unicode Character Set" oder "Multibyte Character Set" entscheiden und das entsprechende in deinem Code benutzen. Vergleiche notfalls einfach mal die "Character Set"-Einstellung von deiner Debug- und Release-Version.
Xethoras
Beiträge: 36
Registriert: 05.03.2008, 21:56

Re: Debug geht, Release nicht.

Beitrag von Xethoras »

ok danke, das wars. Hätte nicht gedacht, dass es für debug und release unterschiedliche einstellungen gibt...

Das Problem mit der nur teilweise richtig angezeigten Bitmapfont besteht aber weiterhin...

Während auf meinem eigenen Rechner alles korrekt angezeigt wird, steht auf dem anderen z.B. statt "Auflösung" "A-f-----g
Seraph
Site Admin
Beiträge: 1174
Registriert: 18.04.2002, 21:53
Echter Name: Steffen Engel

Re: Debug geht, Release nicht.

Beitrag von Seraph »

Wie und wann genau erstellst Du den Bitmap-Font? Wie genau benutzt Du ihn? Was sind die Unterschiede zwischen den beiden Rechnern?
Xethoras
Beiträge: 36
Registriert: 05.03.2008, 21:56

Re: Debug geht, Release nicht.

Beitrag von Xethoras »

Ich erstelle den Bitmap-Font aus einem TGA File(länglich, 4932 x 42) während der Initialisierung des Programms. Gerendert werden dann halt ensprechend des chars verschiedene Teile der Textur.

Der PC auf dem das Programmiert wurde und es funktioniert hat einen AMD Sempron Prozessero 3400+ und eine NVIDIA GEFORCE 6200, der auf dem es nicht funktioniert hat einen Intel Pentium 4 Prozessor mit 3 GHz und eine ATI 9000

Wenn ein Schreibaufruf getätigt wird, werden die enstprechenden Daten in einem statischen Array gespeichert um dann am Ende der Zeichenvorgänge zusammen gezeichnet zu werden.(Um Grafikfehler zu vermeiden)

Der Zeichencode selbst sieht so aus:

Code: Alles auswählen

	P12RPTO_DrawInfo* pTemDrawInfo=NULL;			//Variablen hier definieren, um sie nicht in der Schleife dauernd neu zu definieren..
	D3DXMATRIX mat;				
	D3DXVECTOR2 pos;
	RECT rect;
	rect.bottom=info.Height;	//gilt für die gesamte klasse... die bitmapfont ist recht länglich :D
	rect.top=0;
	unsigned int character;
	D3DXVECTOR3 xyZpos(0,0,0);
	D3DMATERIAL9 material = {0};
	char *buffer=NULL;							//Dies, sowie das spätere "CharToOemA" ist nötig, weil meine Bitmapfont nicht ANSI code sondern eben OEM code ist..
	pSprite->Begin(D3DXSPRITE_SORT_DEPTH_FRONTTOBACK|D3DXSPRITE_ALPHABLEND);	//GO on! :P
	

	for(int i=drawInfo.size();i>0;i--)	//Sooft, wie es Schreibbefehle gibt..., 
	{		//erstmal lokale variablen schaffen, um die orginale nicht verändern zu müssen, etc...
		pTemDrawInfo=&drawInfo.back();	
		pos.x=pTemDrawInfo->pos.x;		
		pos.y=pTemDrawInfo->pos.y;
		xyZpos.z=pTemDrawInfo->pos.z;
		
		buffer=new char[pTemDrawInfo->text.size()];		//Jaja, ein Puffer, der zur Konvertierung von Ansi zu OEM leider nötig war, ich wollte ihn ja ganz brav mit delete[] aufräumen, aber dann ist das Programm abgestürzt... >_>
		CharToOemA(pTemDrawInfo->text.c_str(),strcpy(buffer,pTemDrawInfo->text.c_str()));	//Die erwähnte Konvertierung..
		for(unsigned int j=0;j<pTemDrawInfo->text.size();j++)	//Sooft, wie die Anzahl der Zeichen im String
		{	
			character=(unsigned int)unsigned char(buffer[j]);		//Man will ja nicht jedesmal konvertieren müssen, also macht mans hier einmal...(von char in int)
			if(buffer[j]=='\n')	//Der Zeilenumbruch muss natürlich auch definiert sein...
			{
				pos.y+=pTemDrawInfo->sizeMod.y*info.Height;
				pos.x=pTemDrawInfo->pos.x;
				continue;
			}
			rect.left=long((float)character*((float)info.Width/256.0f));		//Verschiedene Buchstaben, also verschiedene Ausschnitte der Bitmapfont.... (Jedesmal alle Zeichen zu schreiben, wäre keine echte Lösung)
			rect.right=long((float)(character+1)*((float)info.Width/256.0f));
			D3DXMatrixTransformation2D(&mat,NULL,0,&pTemDrawInfo->sizeMod,NULL,0,&pos);	//Skalierung
			pSprite->SetTransform(&mat);
			pSprite->Draw(pTexture,&rect,NULL,&xyZpos,pTemDrawInfo->color);			//Der Zeichenvorgang selbst
			pos.x+=pTemDrawInfo->sizeMod.x*info.Width/256.0f;						//Und nun gehen wir einen Platz, weiter um den nächsten Buchstaben nicht über den letzten zu zeichnen oO
		}
		drawInfo.pop_back();			//Die Informationen wurden jetzt übergebn und können entfernt werden...
	}

	pSprite->End();			//Ja, endlich fertig...
Helmut
Establishment
Beiträge: 237
Registriert: 11.07.2002, 15:49
Wohnort: Bonn
Kontaktdaten:

Re: Debug geht, Release nicht.

Beitrag von Helmut »

Na wie kommst du denn auf ne Bildgröße von 4932 x 42? Zum einen mögen viele Grafikkarten nur Texturgrößen kleiner als der Bildschirm, zum anderen hast du durch ne längliche Textur ne Menge Cachmisses.
Textur also schön quadratisch machen ;)

Ciao
Xethoras
Beiträge: 36
Registriert: 05.03.2008, 21:56

Re: Debug geht, Release nicht.

Beitrag von Xethoras »

Hmm... nagut, werd ich wohl ändern müssen...
Fand ne längliche Textur am einfachsten..
Antworten