Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

04.02.2007, 21:09

Blutiger Anfänger - 1. Übungsaufgabe - VS 2005 Pro

Hallo Leute,

habe mir vor kurzem das Buch gekauft. Ich muss sagen es ist das erste Informatikbuch was mich fesselt ;) Es ist sehr gut zu lesen.

Mein Problem ist --> Ich hänge an der ersten Übungsaufgabe!

Man soll ein Programm erstellen worin man die TriBase Engine initialisiert, etwas in eine Logdatei schreibt und dann wieder herunterfährt.

Ich poste nunmal mein Quelltext was natürlich alle zum Lachen bringen wird. Tut mir nunmal leid. Habe auf dem Gebiet null Erfahrung. C++ ist mir jedoch geläufig.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "TriBase.h";

//Initialisieren der TriBase Engine

if (tbInit())
{
    std::cout << "Es trat ein Fehler auf";
}
else
{
    std::cout << "Die Engine konnte gestartet werden!";
}
//Hier wird die Engine wieder heruntergefahren

tbExit();


Zitat


------ Erstellen gestartet: Projekt: 1_Uebung_1, Konfiguration: Debug Win32 ------
Kompilieren...
Uebung1_Kapitel1.cpp
c:\dokumente und einstellungen\chimaira\eigene dateien\visual studio 2005\projects\1_uebung_1\1_uebung_1\uebung1_kapitel1.cpp(1) : warning C4067: Unerwartete Token nach Präprozessordirektive - Zeilenvorschub erwartet.
c:\dokumente und einstellungen\chimaira\eigene dateien\visual studio 2005\projects\tribase\include\dshowbaseclasses\wxutil.h(195) : warning C4312: 'Typumwandlung': Konvertierung von 'LONG' in größeren Typ 'PVOID'
c:\dokumente und einstellungen\chimaira\eigene dateien\visual studio 2005\projects\tribase\include\tbgui.h(288) : warning C4267: '=': Konvertierung von 'size_t' nach 'int', Datenverlust möglich
c:\dokumente und einstellungen\chimaira\eigene dateien\visual studio 2005\projects\1_uebung_1\1_uebung_1\uebung1_kapitel1.cpp(4) : error C2059: Syntaxfehler: 'if'
c:\dokumente und einstellungen\chimaira\eigene dateien\visual studio 2005\projects\1_uebung_1\1_uebung_1\uebung1_kapitel1.cpp(5) : error C2143: Syntaxfehler: Es fehlt ';' vor '{'
c:\dokumente und einstellungen\chimaira\eigene dateien\visual studio 2005\projects\1_uebung_1\1_uebung_1\uebung1_kapitel1.cpp(5) : error C2447: '{': Funktionskopf fehlt - Parameterliste im alten Stil?
c:\dokumente und einstellungen\chimaira\eigene dateien\visual studio 2005\projects\1_uebung_1\1_uebung_1\uebung1_kapitel1.cpp(8) : error C2059: Syntaxfehler: 'else'
c:\dokumente und einstellungen\chimaira\eigene dateien\visual studio 2005\projects\1_uebung_1\1_uebung_1\uebung1_kapitel1.cpp(9) : error C2143: Syntaxfehler: Es fehlt ';' vor '{'
c:\dokumente und einstellungen\chimaira\eigene dateien\visual studio 2005\projects\1_uebung_1\1_uebung_1\uebung1_kapitel1.cpp(9) : error C2447: '{': Funktionskopf fehlt - Parameterliste im alten Stil?
c:\dokumente und einstellungen\chimaira\eigene dateien\visual studio 2005\projects\1_uebung_1\1_uebung_1\uebung1_kapitel1.cpp(13) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
c:\dokumente und einstellungen\chimaira\eigene dateien\visual studio 2005\projects\1_uebung_1\1_uebung_1\uebung1_kapitel1.cpp(13) : error C2556: 'int tbExit(void)': Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps von 'tbResult tbExit(void)'
c:\dokumente und einstellungen\chimaira\eigene dateien\visual studio 2005\projects\tribase\include\tribase.h(109): Siehe Deklaration von 'tbExit'
c:\dokumente und einstellungen\chimaira\eigene dateien\visual studio 2005\projects\1_uebung_1\1_uebung_1\uebung1_kapitel1.cpp(13) : error C2371: 'tbExit': Neudefinition; unterschiedliche Basistypen
c:\dokumente und einstellungen\chimaira\eigene dateien\visual studio 2005\projects\tribase\include\tribase.h(109): Siehe Deklaration von 'tbExit'
Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Chimaira\Eigene Dateien\Visual Studio 2005\Projects\1_Uebung_1\1_Uebung_1\Debug\BuildLog.htm" gespeichert.
1_Uebung_1 - 9 Fehler, 3 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========


Diese Fehler kommen :(

Muss hier eine Main-Methode rum?

Also so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "TriBase.h";
#include <iostream>;

int main(){
    //Initialisieren der TriBase Engine

    if (tbInit())
    {
        std::cout << "Es trat ein Fehler auf";
    }
    else
    {
        std::cout << "Die Engine konnte gestartet werden!";
    }
    //Hier wird die Engine wieder heruntergefahren

    tbExit();

        return 0;
}


Ich habe keine Ahnung von dem Kram :(. Hauptsache ich komme durch das komplette Buch. Ich hoffe mir kann jemand helfen.


Mfg Chris

Sheddex

unregistriert

2

04.02.2007, 21:14

Was sofort ins Auge springt ist die Tatsache dass du Semikola nach den Include-Anweisungen setzt.

Und ja, natürlich muss eine Main-Funktion vorhanden sein, wobei es allerdings eine WinMain sein muss, also so:

C-/C++-Quelltext

1
2
3
4
5
int WINAPI WinMain(HINSTANCE Instance, HINSTANCE PreviousInstance, char* CommandLine, int ShowCommand)
{
//Dein Code

return 0;
}


[EDIT]: Ich sage dir direkt dass du kein std::cout sondern MessageBox verwenden musst ;)

Also das iostream inkludieren soll auch weg.

3

04.02.2007, 21:15

Dann sag ihm dann aber direkt das er dann net ohne weiteres std::cout nehmen kann sonder MessageBox nehmen muss.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

04.02.2007, 21:15

#include-Anweisungen (oder Präprozessordirektiven generell) werden nicht mit einem Semikolon abgeschlossen.
Kommen Sie nie mit einem Schwert zu einer Schießerei.

5

04.02.2007, 21:19

Erstmal danke für die schnelle Antwort!

Wenn er die TRIBASE.DLL nicht gefunden hat muss ich sie kompilieren richtig?

//Edit: Wenn ich versuche die TriBase Engine zu kompilieren dann kommt dieser Fehler:

Zitat


LINK : fatal error LNK1104: Datei "d3d9.lib" kann nicht geöffnet werden.


Wie kann ich den Beheben?

Mfg Chris

Sheddex

unregistriert

6

04.02.2007, 21:43

Zitat von »"Chimaira"«


Wenn er die TRIBASE.DLL nicht gefunden hat muss ich sie kompilieren richtig?


Wenn sie nicht gefunden wird musst du sie eben aus dem TriBase Ordner kopieren und in deinen Projektordner einfügen. Oder du tust sie in den system32 Ordner von Windows, dort ist sie dann absolut überall verfügbar.
Und dann eben noch Verzeichnisse bekannt geben, so wie es im Buch steht...

7

04.02.2007, 21:50

Ich habe alle Verzeichnisse bekannt gegeben. Aber ich kann die TriBase Engine nicht kompilieren. Siehe letzten Beitrag.

Habe die Platform SDK, DirectX SDK und TriBase Ordner alle so eingestellt wie es im Buch steht.

Hoffe dabei kannste mir helfen.

//Edit: Habe das Problem gefunden ^^. Dumm. Habe nur DirectX/Lib angegeben, aber nicht DirectX/Lib/x86 .... sorry :(

//Edit2: Wie kann ich nun mit Hilfe der WinAPI MessageBoxen ausgeben?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "TriBase.h"
#include "windows.h"

int WINAPI WinMain(HINSTANCE Instance, HINSTANCE PreviousInstance, char* CommandLine, int Command)
{ 
    //Initialisieren der TriBase Engine

    if (tbInit())
    {
        //Hier eine

    }
    else
    {
        //Und hier auch eine

    }
    //Hier wird die Engine wieder heruntergefahren

    tbExit();

    return 0;
}


Wie kann ich dort Messageboxen eintragen? Wie gesagt --> habe keine Ahnung von der WinAPI.

Mfg Chris

8

04.02.2007, 22:21

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "TriBase.h"
#include "windows.h"

int WINAPI WinMain(HINSTANCE, HINSTANCE, char*, int)
{
    //Initialisieren der TriBase Engine

    if (!tbInit())
    {
        MessageBox(NULL, TEXT("Fehler beim initialisieren der TriBase Engine!"), NULL, MB_OK | MB_ICONERROR); 
        return 0;
    }

    MessageBox(NULL, TEXT("TriBase-Engine initialisiert!"), TEXT("Information"), MB_OK | MB_ICONINFORMATION);
    //Hier wird die Engine wieder heruntergefahren

    tbExit();

    return 0;
} 


So nun kommt der Teil zum Verständnis...

nehmen wir uns mal die Deklaration von MessageBox

C-/C++-Quelltext

1
int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);

So.
hWnd soll das Parentfenster sein. Dort kannst du aber, falls du kein Parentfenster hast auch NULL angeben.
lpText ist ein Pointer auf den von dir gewünschten Text.
lpCaption ist halt ein Pointer auf den Text der in der Titelleiste der MessageBox stehen soll(wenn du hier NULL angibst, sollte für gewöhnlich "Fehler" in der momentanen Systemsprache als Caption genommen werden.)
uType ist schon etwas interessanter. Dort gibst du einmal an welche Button die MessageBox haben soll und zum anderen, welches Icon die MessageBox haben soll. (wenn du hier 0 angibst sollte eig nur ein Ok Button vorhanden sein...)

Bsw.

C-/C++-Quelltext

1
MessageBox(NULL, TEXT("Das ist eine Nachricht"), NULL, MB_OK | MB_ICONERROR);


Naja ne bessere Erklärung findest du hier: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/dialogboxes/dialogboxreference/dialogboxfunctions/messagebox.asp
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

04.02.2007, 23:21

Eigentlich ist das ein ganz klein wenig anders. ;) MessageBox ist nämlich ein Makro zu zwei Funktionen, nämlich MessageBoxA und MessageBoxW. Erstere wird bei eingeschaltetem ANSI Zeichensatz, letztere bei UNICODE verwendet. Um den Aufruf zu erleichtern gibts allerdings ein Macro MessageBox für das der Preprozessor, je nach Ausführzeichensatz, den korrekten Funktionsnamen verwendet.

Die Definitionen sehen übrigens so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
int WINAPI MessageBoxA( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);

int WINAPI MessageBoxW( HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);

#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA
#endif // !UNICODE


Dann macht nämlich auch das Makro TEXT Sinn, welches von Deviloper verwendet wurde. Bei Unicode wird hier nämlich der übergebene String "gekennzeichnet".

C-/C++-Quelltext

1
2
3
4
5
6
7
#ifdef  UNICODE   
#define __TEXT(quote) L##quote
#else
#define __TEXT(quote) quote
#endif

#define TEXT(quote) __TEXT(quote)


Nur der Genauigkeit halber! ;))) Man sollte sich darüber aber durchaus bewusst sein.
@D13_Dreinig

10

04.02.2007, 23:40

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "TriBase.h"
#include "windows.h"

int WINAPI MessageBoxW( HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType); 

int WINAPI WinMain(HINSTANCE Instance, HINSTANCE PreviousInstance, char* CommandLine, int Command)
{ 
    //Initialisieren der TriBase Engine

    if (tbInit())
    {
        MessageBoxW(NULL, TEXT("Fehler beim initialisieren der TriBase Engine!"), NULL, MB_OK | MB_ICONERROR);
        return 0; 
    }
    else
    {
        MessageBoxW(NULL, TEXT("TriBase-Engine initialisiert!"), TEXT("Information"), MB_OK | MB_ICONINFORMATION); 
    }
    //Hier wird die Engine wieder heruntergefahren

    tbExit();

    return 0;
}


Also so hats geklappt aber er hat Warnings ausgegeben!


Mfg Chris

Werbeanzeige