entwicklungsumgebung

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
manuelmassari
Beiträge: 28
Registriert: 20.10.2012, 16:29
Benutzertext: c++

entwicklungsumgebung

Beitrag von manuelmassari »

Hallo leute,
ich bin ein c++-neueinsteiger und habe neulich das buch c++ für spieleentwicklervon heiko kalista gelesen..ich bin jetzt bei kapitel 10 und wollte ein ganz normales windows fenster programmieren..dazu installierte ich die entwicklungsumgebung microsoft visual c++ 2008 express edition und führte das listening aus dem ordner source aus..nun wollte ich den text selbst abtippen bzw. ihn in ein von mir angelegtes projekt kopieren..als ich es nun kompilieren wollte spuckte mir der compiler diverse fehlermeldungen raus,was ja eigentlich nicht möglich sein dürfte,da e sich ja eigentlich um den originalen quellcode aus dem listening handet..könntet ihr mir hier eine kurze hilfestellung geben? Ich bin mit meinem latein am ende..danke schon mal im voraus..
Matthias Gubisch
Establishment
Beiträge: 493
Registriert: 01.03.2009, 19:09

Re: entwicklungsumgebung

Beitrag von Matthias Gubisch »

Hallo und willkommen

Damit es überhaupt möglich wird dir zu helfen, wäre es gut wenn du uns beschreibst was du genau gemacht hast und welche Fehlermeldungen du genau erhältst.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
manuelmassari
Beiträge: 28
Registriert: 20.10.2012, 16:29
Benutzertext: c++

Re: entwicklungsumgebung

Beitrag von manuelmassari »

also, ich habe diesen Quellcode in einem von mir angelegten Win32-Projekt angelegt:
also eine ganz normale Programmierung eines Windows-Fenster..wenn ich nun den Code kompilieren möchte, kommen folgende Fehlermeldungen:

1>c:\users\admin\documents\visual studio 2008\projects\windowsfenster\windowsfenster.cpp(54) : error C2440: '=': 'const char [15]' kann nicht in 'LPCWSTR' konvertiert werden
1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
1>c:\users\admin\documents\visual studio 2008\projects\windowsfenster\windowsfenster.cpp(70) : error C2664: 'CreateWindowExW': Konvertierung des Parameters 2 von 'const char [15]' in 'LPCWSTR' nicht möglich
1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.

wenn ich den Code allerdings direkt aus dem Ordner "Source", was im Lieferumfang mittels Cd beim Buch dabei war, kompiliere funktioniert es..ich weiß jetzt nur nicht woran das liegt..

Code: Alles auswählen

// C++ für Spieleprogrammierer
// Listing 10.1
// Ein Windows-Grundgerüst
//
#include <windows.h>

// Prototyp der Callback-Funktion
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
							 WPARAM wParam, LPARAM lParam);

// Hauptprogramm
//
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,
					LPSTR lpcmdline, int ncmdshow)
{
	WNDCLASSEX windowclass; // Struktur für Fenstereigenschaften
	HWND       hWnd;        // Fenster-Handle
	MSG        message;     // Nachricht

	// Der Klassen-Name des Fensters ist frei wählbar
	const char szClassName[] = "Erstes Fenster";

	// Struktur mit gewünschten Eigenschaften füllen
	//

	// Größe der Struktur zwischenspeichern
	windowclass.cbSize = sizeof (WNDCLASSEX);

	// Fenster soll beim Verschieben neu gezeichnet werden
	windowclass.style = CS_HREDRAW | CS_VREDRAW;

	// Zeiger auf Callback-Funktion
	windowclass.lpfnWndProc = WindowProc;

	// Keine erweiterten Einstellungen
	windowclass.cbClsExtra = 0;
	windowclass.cbWndExtra = 0;

	// Instanz speichern
	windowclass.hInstance = hInst;

	// Icons und Cursor festlegen
	windowclass.hIcon   = LoadIcon (NULL, IDI_APPLICATION);
	windowclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
	windowclass.hCursor = LoadCursor (NULL, IDC_ARROW);

	// Hintergrundfarbe festlegen
	windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND+1;

	// Ein Menü brauchen wir nicht
	windowclass.lpszMenuName = NULL;

	// Klassenname angeben
	windowclass.lpszClassName = szClassName;

	// Fensterklasse registrieren
	if (!RegisterClassEx (&windowclass) )
		return (0);

	// Das Fenster erzeugen
	hWnd = CreateWindowEx (NULL,
						   szClassName,
						   "Das erste Fenster!",
						   WS_OVERLAPPEDWINDOW | WS_VISIBLE,
						   100, 100,
						   300, 250,
						   NULL,
						   NULL,
						   hInst,
						   NULL);

	// Prüfen, ob alles glatt ging
	if (hWnd == NULL)
		return (0);

	// Der "Herzschlag" des Programms.
	// Hier werden alle Nachrichten abgeholt,
	// übersetzt und weitergeleitet.
	while (GetMessage (&message, NULL, 0, 0) )
	{
		TranslateMessage (&message);
		DispatchMessage (&message);

	}

	// Programm beenden
	return (int)(message.wParam);

} // WinMain


// Callback-Funktion zur Nachrichtenverarbeitung
//
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
							 WPARAM wParam, LPARAM lParam)
{
	// Messages auswerten
	switch (message)
	{
		// Fenster schließen? (Auch Alt-F4)
		case WM_DESTROY:
		{
			// Nachricht zum Beenden schicken
			PostQuitMessage (0);
			return (0);

		}

		// Wurde eine Taste gedrückt?
		case WM_KEYDOWN:
		{
			// Ja, also je nach Taste verzweigen
			switch (wParam)
			{
				// Wurde "Escape" gedrückt?
				case VK_ESCAPE:
				{
					// Ja, also Nachricht zum Beenden schicken
					PostQuitMessage (0);
					return (0);

				}
			}
		} break;
	} 

	// Die Nachricht wurde nicht von uns verarbeitet, also
	// von Windows verarbeiten lassen.
	return (DefWindowProc (hWnd, message, wParam, lParam) );

} // WindowProc
Benutzeravatar
Schrompf
Moderator
Beiträge: 5077
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: entwicklungsumgebung

Beitrag von Schrompf »

Ich habe Deinen ganzen Code mal in code-Tags verpackt, dann ist er besser lesbar. Die Ursache für Dein Problem ist, dass in den Projekteigenschaften "Unicode" eingestellt ist. Dadurch erwarten alle möglichen Funktionen der WinAPI einen wchar_t-Text, während Du nur char-Text übergibst. Entweder Du änderst die Projekteinstellungen auf "Multibyte-Zeichensatz" oder Du kennzeichnest Deine Strings im Code als wide-char. Also etwa so

Code: Alles auswählen

// aus
TuDas( "blablubb");
// wird
TuDas( L"blablubb");
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
manuelmassari
Beiträge: 28
Registriert: 20.10.2012, 16:29
Benutzertext: c++

Re: entwicklungsumgebung

Beitrag von manuelmassari »

Komisch, ich habe eingentlich exakt das getan, war im Buch verlangt wurde als ich ein Win32-Projekt angelegt habe..ich habe in der Entwicklungsumgebung nirgends eine Einstellung für einen "Multibyte-Zeichensatz" gefunen..könntest du mir noch einmal das mit den wide-char erklären? ich habe dieso Form so noch nie gehört..Muss man dazu einfach vor dem String irgend einen Buchstaben schreiben, bzw. den char zu wide-char machen?
Benutzeravatar
dot
Establishment
Beiträge: 1745
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: entwicklungsumgebung

Beitrag von dot »

Ich hab das hier mal etwas genauer erklärt, vielleicht hilft dir das...
manuelmassari
Beiträge: 28
Registriert: 20.10.2012, 16:29
Benutzertext: c++

Re: entwicklungsumgebung

Beitrag von manuelmassari »

Ich habe das gerade bei meinem Code-Beispiel "versucht" anzuwenden, hat aber nicht ganz geklappt..sprich:

// Der Klassen-Name des Fensters ist frei wählbar
const Wchar szClassName[] = L"Erstes Fenster";

Fehlermeldung:

1>c:\users\admin\documents\visual studio 2008\projects\windows-fenster\windowsfenster.cpp(22) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\users\admin\documents\visual studio 2008\projects\windows-fenster\windowsfenster.cpp(22) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'szClassName'
1>c:\users\admin\documents\visual studio 2008\projects\windows-fenster\windowsfenster.cpp(22) : error C2065: 'szClassName': nichtdeklarierter Bezeichner
1>c:\users\admin\documents\visual studio 2008\projects\windows-fenster\windowsfenster.cpp(22) : error C2059: Syntaxfehler: ']'
1>c:\users\admin\documents\visual studio 2008\projects\windows-fenster\windowsfenster.cpp(55) : error C2065: 'szClassName': nichtdeklarierter Bezeichner
1>c:\users\admin\documents\visual studio 2008\projects\windows-fenster\windowsfenster.cpp(63) : error C2065: 'szClassName': nichtdeklarierter Bezeichner

ich habe hier wahrscheinlich noch etliche Fehler in der richtigen Anwendung von "Wide-char" gemacht, wodurch es zu den Kompilierfehlern kommt, wie gesagt, ich bin leider noch neu in dieser Materie..

was ich nicht verstehe ist, wieso sich der Code aus der "Source-Datei" problemlos kompilieren lässt und wenn ich "denselben" Quellcode in meinem Projekt kompilieren möchte, er jedesmal steikt..es muss doch irgendwo an der Einstellung der Entwicklungsumgebung liegen..aber wie gesagt, ich habe bis jetzt noch nirgends irgend eine Einstellung bzgl. Multibyte-Zeichensatz, oder Unicode gesehen..der Autor müsste dies bei der Beschreibung "Anlegen eines Win32-Projektes" doch berücksichtigt haben?
Benutzeravatar
dot
Establishment
Beiträge: 1745
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: entwicklungsumgebung

Beitrag von dot »

manuelmassari hat geschrieben:Ich habe das gerade bei meinem Code-Beispiel "versucht" anzuwenden, hat aber nicht ganz geklappt..sprich:

// Der Klassen-Name des Fensters ist frei wählbar
const Wchar szClassName[] = L"Erstes Fenster";
Der Typ heißt wchar_t und nicht Wchar...
manuelmassari hat geschrieben:was ich nicht verstehe ist, wieso sich der Code aus der "Source-Datei" problemlos kompilieren lässt und wenn ich "denselben" Quellcode in meinem Projekt kompilieren möchte, er jedesmal steikt..es muss doch irgendwo an der Einstellung der Entwicklungsumgebung liegen..aber wie gesagt, ich habe bis jetzt noch nirgends irgend eine Einstellung bzgl. Multibyte-Zeichensatz, oder Unicode gesehen..der Autor müsste dies bei der Beschreibung "Anlegen eines Win32-Projektes" doch berücksichtigt haben?
Sind die Projektdateien vom Buch denn auch für VS 2008? Denn früher war der Default mal ein anderer...
manuelmassari
Beiträge: 28
Registriert: 20.10.2012, 16:29
Benutzertext: c++

Re: entwicklungsumgebung

Beitrag von manuelmassari »

Ganz genau..ich hatte zuvor mit der 2003-Version zu tun und da hat es bis auf ein paar weitere Beispiele auch geklappt ein "normales" Fenster zu programmieren..ich habe die Source-Dateien dirket von der Cd runtergeholt, von der ich auch die Entwicklungsumgebung installiert habe, also sind sie aktuell zu der 2008-Version kompatibel, sozusagen..der Autor erklärt zu Anfang des Kapitels wie man korrekt ein Win32- Projekt anlegt, Schritt für Schritt...diese habe ich genauestens befolgt, jedoch, wenn ich den Quellcode per Hand abtippe (ohne Syntaxfehler oder dergleichen versteht sich) lässt mich dies der Kompiler trotzdem nicht korrekt ausführen.
manuelmassari
Beiträge: 28
Registriert: 20.10.2012, 16:29
Benutzertext: c++

Re: entwicklungsumgebung

Beitrag von manuelmassari »

Die CD war beim Buch dabei, also müssen sie auch auf die Entwicklungsumgebung abgestimmt sein..ich verstehe das nicht..
Benutzeravatar
dot
Establishment
Beiträge: 1745
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: entwicklungsumgebung

Beitrag von dot »

Dann ist das wohl ein Fehler mit der CD bzw. den Projekten und im Buch. Vermutlich wurden die einfach von der alten Version nach 2008 konvertiert ohne sie wirklich zu testen oder so...
manuelmassari
Beiträge: 28
Registriert: 20.10.2012, 16:29
Benutzertext: c++

Re: entwicklungsumgebung

Beitrag von manuelmassari »

das habe ich auch vermutet, werde bei Gelegenheit dieses Manko auf www.Spieleprogrammierer.de ansprechen..ich habe jetzt noch einmal deinen Vorschlag mit "wchar_t" ausprobiert und diesesmal habe ich es geschafft, danke nochmal für den super Tipp!!! =) für mich wäre es jedoch wesentlich einfacher einfach bei "char" zu bleiben, da das gesamte Buch damit arbeitet, wobei wir wieder bei der Frage wären, wo man das denn in der Entwicklungsumgebung umstellen kann..heisst das jetzt konkret, dass das Problem hier "nur" bei den Strings sitzt und ich auch nur hier "wchar_t" verwenden muss, oder muss ich das auch bei anderen Befehlen einsetzten?
Benutzeravatar
dot
Establishment
Beiträge: 1745
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: entwicklungsumgebung

Beitrag von dot »

Wenn du's umstellen willst: Project Properties > General > Character Set auf Not Set stellen...
manuelmassari
Beiträge: 28
Registriert: 20.10.2012, 16:29
Benutzertext: c++

Re: entwicklungsumgebung

Beitrag von manuelmassari »

wer suchet der findet..wenn irgendjeman noch dieses Problem hat..hier die Lösung:

Projet->Eigenschaften->Konfigurationseigenschaften->Zeichensatz->MultibyteZeichensatz verwenden...

danke vielmals nochmal für deine Hilfestellung, es ist als Einsteiger manchmal echt nicht leicht, da fängst schon bei diesen Kleinigkeiten an zu hapern..jetzt kanns weitergehen =)
Benutzeravatar
dot
Establishment
Beiträge: 1745
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: entwicklungsumgebung

Beitrag von dot »

Multibyte Zeichensatz is eigentlich auch falsch, auch wenn du den Unterschied vermutlich nicht merken wirst; du willst eigentlich die dritte Option, keine Ahnung wie das Ding auf Deutsch heißt. Aber dazu auch gleich eine Anmerkung: Ich würd dir sehr zu Herzen legen, die englische Version von Visual Studio zu installieren, allein schon weil google dir zu deutschen Compilerfehlermeldungen wenig ausspucken wird...
manuelmassari
Beiträge: 28
Registriert: 20.10.2012, 16:29
Benutzertext: c++

Re: entwicklungsumgebung

Beitrag von manuelmassari »

Das stimt auch wieder,werde gleich die englische version einstellen,danke für den tipp!
Antworten