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

OnTheRun

Frischling

  • »OnTheRun« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Schweiz

Beruf: Lehrling

  • Private Nachricht senden

1

12.10.2003, 12:11

Problem bei Kapitel 2.4, Listing 2.16

Hallo,
nachdem das erste Beispiel geklappt hat, wollte ich mich nun an das 2. wagen :)
Nun, zuerst habe ich es in eine eigene Datei geschrieben, habe dann aber gemerkt, dass dort ja iAdapter fehlt (der im 1. Beispiel initialisiert wird resp. festgelegt wird).
Daher habe ich mir überlegt, nach den Adapterinformationen einfach nochmal eine Messagebox zu machen, in welcher dann noch steht, welche 16-Bit-Videomodi sie anzeigen kann (anstatt dies separat zu tun).
Jedoch ist bei meinem Programm iNumModes <= 0, also quasi gar keine 16-Bit-Modi vorhanden ?
Hier der Code:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <Windows.h>
#include <Stdio.h>
#include <D3D9.h>

int                         g_iNumAdapters; // Anzahl der Adapter
D3DADAPTER_IDENTIFIER9*     g_pAdapters;    // Adapterliste
PDIRECT3D9                  g_pD3D = NULL;  // IDirect3D9-Schnittstelle
int                 iNumModes;          // Anzahl der Videomodi
D3DDISPLAYMODE*     pModes;             // Array der Videomodi
char                acModes[16384];     // Beschreibungsstring


int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   char* pcCmdLine,
                   int iShowCmd)
{
    char acAdapterInfo[1024];

    // schnitstelle für Direct3D erzeugen
    g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    if(g_pD3D == NULL)
    {
        // Fehler ! Da nicht DirectX9 !
        MessageBox(NULL, "Fehler beim erzeugen der Direct3D-Schnittstelle !",
                   "Fehler !", MB_OK | MB_ICONEXCLAMATION);
        return 1;
    }
    
    // Anzahl der Adapter ermitteln
    g_iNumAdapters = g_pD3D->GetAdapterCount();

    // Speicher reservieren und Informationen über jeden Adapter sammeln
    g_pAdapters = new D3DADAPTER_IDENTIFIER9[g_iNumAdapters];

    for(int iAdapter = 0; iAdapter < g_iNumAdapters; iAdapter++)
    {
        if(FAILED(g_pD3D->GetAdapterIdentifier(iAdapter, 0,
                                               &g_pAdapters[iAdapter])))
        {
            // Fehler !
            MessageBox(NULL, "Adapterinformationen konnten nicht abgefragt werden !!", "Fehler !!", MB_OK | MB_ICONEXCLAMATION);

            // Aufräumen
            g_pD3D->Release();
            delete[] g_pAdapters;
            return 1;
        }

        // Adapterinformationen anzeigen
        sprintf(acAdapterInfo, "Adapter-ID: %d\nName: %s\nTreiber: %s\nTreiberversion: %d",iAdapter,g_pAdapters[iAdapter].Description,g_pAdapters[iAdapter].Driver,g_pAdapters[iAdapter].DriverVersion);
    //  MessageBox(NULL, acAdapterInfo, "Adapter gefunden !",
    //             MB_OK | MB_ICONINFORMATION);
    }

    // Ermitteln, wie viele 16-Bit Videomodi verfügbar sind
    iNumModes = g_pD3D->GetAdapterModeCount(iAdapter, D3DFMT_R5G6B5);
    if(iNumModes > 0)
    {
        // Speicherplatz reservieren und den String zurücksetzen
        pModes = new D3DDISPLAYMODE[iNumModes];
        strcpy(acModes, "");

        // Jeden Videomodus durchgehen
        for(int iMode = 0; iMode < iNumModes; iMode++)
        {
            g_pD3D->EnumAdapterModes(iAdapter, D3DFMT_R5G6B5, iMode, &pModes[iMode]);
            
            // Nummer, Breite, Höhe und Bildwiederholfrequenz in den String schreiben
            sprintf(acModes, "%s\nModus %d: %dx%d bei %d Hz (0: Standard)",
                    acModes,
                    iMode,
                    pModes[iMode].Width,
                    pModes[iMode].Height,
                    pModes[iMode].RefreshRate);
        }

        // Videomodi anzeigen
        MessageBox(NULL, acModes, "Verfügbare 16-Bit-Videomodi",
                   MB_OK | MB_ICONINFORMATION);

    }
    else
    {
        MessageBox(NULL, "iNumModes ist <= 0 !!", "Fehler !!",
                    MB_OK | MB_ICONEXCLAMATION);
    }
    // Aufräumen
    g_pD3D->Release();
    delete[] g_pAdapters;
    delete[] pModes;


    return 0;
}


Gruss OTR

OnTheRun

Frischling

  • »OnTheRun« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Schweiz

Beruf: Lehrling

  • Private Nachricht senden

2

13.10.2003, 18:29

Tut mir leid, dass ich hier schon wieder ein Problem beschreibe ;)
Also ich habe heute das 1. Beispiel des Buches abgetippt (erstellen eines Fensters) und 2 Fehler beim linken erhalten.
Ich habe diese mit unserem Java & C / C++ Lehrer angeschaut.
Dieser meinte, dass etwas mit der TriBase.lib resp. dem linken der Bibliotheken nicht in Ordnung sei.
Wir haben dann aber mal das Beispielprogramm der CD kompiliert.. und siehe da, es klappt. Also kann es nicht an den Einstellungen des Compilers (Visual Studio 6 Enterprise Edition) liegen. Folglich muss es an den Projekteinstellungen liegen.
Ich habe dort die Zeile der Bibliotheken etc. (also tribased.lib und dx9 libs) kopiert und bei meinen Projekteinstellungen eingefügt.. hat nicht's gebracht. Nun weiss ich nicht, an was es liegen kann. Also die dll's etc. muss er haben, da er das Beispiel fehlerfrei kompiliert und ausführt.. es kann bloss an den Projekteinstellungen liegen.
Der Compiler sagt, dass der Fehler bei tbResult, WinMain(); und WinExit(); liegt. Diese Files sind ja in der INITWINDOW.h resp. .cpp verlinkt / beschrieben.. doch auch dort konnten wir nichts finden. Weiss jemand eine Antwort hierauf ? Schlimmstenfalls nehme ich halt Beispiel02 als Basis zum kompilieren.

Edit:
Also ich habe jetzt zu Hause das ganze VisualStudio 6 inkl. MSDN, DirectX und TriBase nochmal neu installiert.
Ich habe nun alles so wie im Buch beschrieben eingebunden.
Das Beispiel 01 - Fenster kann ich, wie oben gesagt, wunderbar kompilieren. Wenn ich jedoch den gleichen Code nehme und auch die gleichen libs unter Project/library modules (unter Project -> Settings -> Link) nehme, bekomme ich folgenden Fehler:

--------------------Configuration: Beispiel002 - Win32 Debug--------------------
Linking...
bsp002.obj : error LNK2001: unresolved external symbol "enum tbResult __cdecl ExitWindow(void)" (?ExitWindow@@YA?AW4tbResult@@XZ)
bsp002.obj : error LNK2001: unresolved external symbol "enum tbResult __cdecl InitWindow(int,int,char *,struct HICON__ *)" (?InitWindow@@YA?AW4tbResult@@HHPADPAUHICON__@@@Z)
Debug/Beispiel002.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

Beispiel002.exe - 3 error(s), 0 warning(s)

Es muss wohl an den Projekteinstellungen leigen, doch komme ich nicht drauf, wo genau der Fehler liegt.

Gruss OTR