Seite 1 von 1
entwicklungsumgebung
Verfasst: 20.10.2012, 16:44
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..
Re: entwicklungsumgebung
Verfasst: 20.10.2012, 17:22
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.
Re: entwicklungsumgebung
Verfasst: 20.10.2012, 19:10
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
Re: entwicklungsumgebung
Verfasst: 20.10.2012, 19:16
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");
Re: entwicklungsumgebung
Verfasst: 20.10.2012, 21:03
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?
Re: entwicklungsumgebung
Verfasst: 20.10.2012, 21:12
von dot
Ich hab das
hier mal etwas genauer erklärt, vielleicht hilft dir das...
Re: entwicklungsumgebung
Verfasst: 20.10.2012, 22:16
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?
Re: entwicklungsumgebung
Verfasst: 20.10.2012, 22:20
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...
Re: entwicklungsumgebung
Verfasst: 20.10.2012, 22:38
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.
Re: entwicklungsumgebung
Verfasst: 20.10.2012, 22:39
von manuelmassari
Die CD war beim Buch dabei, also müssen sie auch auf die Entwicklungsumgebung abgestimmt sein..ich verstehe das nicht..
Re: entwicklungsumgebung
Verfasst: 20.10.2012, 22:41
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...
Re: entwicklungsumgebung
Verfasst: 20.10.2012, 22:50
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?
Re: entwicklungsumgebung
Verfasst: 20.10.2012, 22:58
von dot
Wenn du's umstellen willst: Project Properties > General > Character Set auf Not Set stellen...
Re: entwicklungsumgebung
Verfasst: 20.10.2012, 23:06
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 =)
Re: entwicklungsumgebung
Verfasst: 20.10.2012, 23:16
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...
Re: entwicklungsumgebung
Verfasst: 23.10.2012, 11:53
von manuelmassari
Das stimt auch wieder,werde gleich die englische version einstellen,danke für den tipp!