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

SaTy

Frischling

  • »SaTy« ist der Autor dieses Themas

Beiträge: 12

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

1

18.02.2011, 12:33

kryptisches Fenster beim D3D-Eigenschaften auswählen

Hallo,
ich bin grade dabei ein Graphikprojekt mithilfe des Buches zu schreiben, allerdings halte ich mich nicht 1:1 an das Buch, insbesondere versuche ich, nicht die TriBase-Engine zu nutzen.
Da ich das Auswahlfenster für die Direct3D-Einstellungen aber so super praktisch finde, wollte ich es einbinden, indem ich die Direct3DEnum.h und .cpp meinem Projekt hinzgefügt und verlinkt habe.
Um die die Tribase.h nicht nutzen zu müssen war ich also gezwungen einige Dinge zu ändern, also return -1 stannt return TB_ERROR, malloc statt TB_MEM_ALLOC, "strings" durch L"strings" und const char* name durch A2BSTR(name) ersetzen.
Der Compiler meldet keine Fehler mer und das Programm startet, wenn sich das auswahlfenster öffnen, zeigt er mir aber nur Japanische Zeichen an

(Link)

hat jemand eine Idee, woran das liegen könnte?
ich will doch nur ein einziges Dreieck t.t

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

18.02.2011, 12:56

Daran dass der Compiler sich aufgeregt hat dass du einen normalen String als LPWSTR verwenden wolltest, was du schnell mal mit einem entsprechenden Cast "behoben" hast um den Compiler ruhigzugstellen. Aber der Compiler weiß schon warum er sich da aufregt. Nur weil du ihm sagst er soll ruhig sein und es einfach schlucken ist dein Programm dann nicht plötzlich korrekt ;)

SaTy

Frischling

  • »SaTy« ist der Autor dieses Themas

Beiträge: 12

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

3

18.02.2011, 13:05

Mhh, na ich habe nie einen expliziten (LPWSTR)-Cast vorgenommen. dafür habe ich wie gesagt die A2BSTR-Funktion aus dem atlconv.h genutzt und das scheint auch zu funktionieren (siehe die Beschreibung im rechten Fenster des screenshots, korrekt dargestellt).
Was eher Probleme zu bereiten scheint sind die Definitionen ganz am Anfang der Direct3DEnum.cpp
"case D3DFMT_R8G8B8: strcpy(pcOut, "R8G8B8"); break;"
usw.
ich will doch nur ein einziges Dreieck t.t

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

18.02.2011, 13:09

Ok, sry, das ist nur bisher praktisch immer der Fehler gewesen wenn jemand den Screenshot von da oben gepostet hat (was relativ oft vorkommt) ;)
Verwend einfach TCHAR statt char und das TEXT() Makro und alles sollte in Butter sein. Oder verwend wchar_t und explizit die *W Varianten aller API Funktionen.

SaTy

Frischling

  • »SaTy« ist der Autor dieses Themas

Beiträge: 12

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

5

18.02.2011, 13:19

gibts denn dann ne Alternative zu strcpy? denn das erwartet leider einen char*

So sieht die Funktion derzeit aus:

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
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
int GetFormatString(D3DFORMAT Format,
                         char *pcOut)
{
    // Parameter prüfen
    if(pcOut == NULL) return 0;

    int i = 0;
    // Format suchen und Beschreibung kopieren
    switch(Format)
    {
    case D3DFMT_R8G8B8:         strcpy(pcOut, "R8G8B8"); break;
    case D3DFMT_A8R8G8B8:       strcpy(pcOut, "A8R8G8B8"); break;
    case D3DFMT_X8R8G8B8:       strcpy(pcOut, "X8R8G8B8"); break;
    case D3DFMT_R5G6B5:         strcpy(pcOut, "R5G6B5"); break;
    case D3DFMT_X1R5G5B5:       strcpy(pcOut, "X1R5G5B5"); break;
    case D3DFMT_A1R5G5B5:       strcpy(pcOut, "A1R5G5B5"); break;
    case D3DFMT_A4R4G4B4:       strcpy(pcOut, "A4R4G4B4"); break;
    case D3DFMT_A2B10G10R10:    strcpy(pcOut, "A2B10G10R10"); break;
    case D3DFMT_A16B16G16R16:   strcpy(pcOut, "A16B16G16R16"); break;
    case D3DFMT_G16R16:         strcpy(pcOut, "G16R16"); break;
    case D3DFMT_A8P8:           strcpy(pcOut, "A8P8"); break;
    case D3DFMT_P8:             strcpy(pcOut, "P8"); break;
    case D3DFMT_L8:             strcpy(pcOut, "L8"); break;
    case D3DFMT_A8L8:           strcpy(pcOut, "A8L8"); break;
    case D3DFMT_A4L4:           strcpy(pcOut, "A4L4"); break;
    
    case D3DFMT_V8U8:           strcpy(pcOut, "V8U8"); break;
    case D3DFMT_Q8W8V8U8:       strcpy(pcOut, "Q8W8V8U8"); break;
    case D3DFMT_V16U16:         strcpy(pcOut, "V16U16"); break;
    case D3DFMT_Q16W16V16U16:   strcpy(pcOut, "Q16W16V16U16"); break;
    
    case D3DFMT_L6V5U5:         strcpy(pcOut, "L6V5U5"); break;
    case D3DFMT_X8L8V8U8:       strcpy(pcOut, "X8L8V8U8"); break;
    case D3DFMT_A2W10V10U10:    strcpy(pcOut, "A2W10V10U10"); break;
    case D3DFMT_L16:            strcpy(pcOut, "L16"); break;

    case D3DFMT_UYVY:           strcpy(pcOut, "UYVY"); break;
    case D3DFMT_YUY2:           strcpy(pcOut, "YUY2"); break;
    case D3DFMT_DXT1:           strcpy(pcOut, "DXT1"); break;
    case D3DFMT_DXT2:           strcpy(pcOut, "DXT2"); break;
    case D3DFMT_DXT3:           strcpy(pcOut, "DXT3"); break;
    case D3DFMT_DXT4:           strcpy(pcOut, "DXT4"); break;
    case D3DFMT_DXT5:           strcpy(pcOut, "DXT5"); break;
    case D3DFMT_MULTI2_ARGB8:   strcpy(pcOut, "MULTI2_ARGB8"); break;
    
    case D3DFMT_D16_LOCKABLE:   strcpy(pcOut, "D16_LOCKABLE"); break;
    case D3DFMT_D32:            strcpy(pcOut, "D32"); break;
    case D3DFMT_D32F_LOCKABLE:  strcpy(pcOut, "D32F_LOCKABLE"); break;
    case D3DFMT_D24FS8:         strcpy(pcOut, "D24FS8"); break;
    case D3DFMT_D15S1:          strcpy(pcOut, "D15S1"); break;
    case D3DFMT_D24S8:          strcpy(pcOut, "D24S8"); break;
    case D3DFMT_D16:            strcpy(pcOut, "D16"); break;
    case D3DFMT_D24X8:          strcpy(pcOut, "D24X8"); break;
    case D3DFMT_D24X4S4:        strcpy(pcOut, "D24X4S4"); break;
    case D3DFMT_VERTEXDATA:     strcpy(pcOut, "VERTEXDATA"); break;
    case D3DFMT_INDEX16:        strcpy(pcOut, "INDEX16"); break;
    case D3DFMT_INDEX32:        strcpy(pcOut, "INDEX32"); break;

    case D3DFMT_UNKNOWN:        strcpy(pcOut, "UNKNOWN"); break;

    default: strcpy(pcOut, "Unbekanntes Format"); break;
    }

    return 0;
}
ich will doch nur ein einziges Dreieck t.t

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

18.02.2011, 13:25

Du brauchst da kein strcpy, ein einfaches = sollte reichen, sind ja nur Stringliterale...

7

18.02.2011, 15:42

Wieso benutzt du keine Stringklasse?
Und wieso gibts du immer 0 zurück? Wäre ein void GetFormatString nicht sinniger?
Lieber dumm fragen, als dumm bleiben!

8

18.02.2011, 16:12

/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »E333« (02.09.2021, 04:13)


SaTy

Frischling

  • »SaTy« ist der Autor dieses Themas

Beiträge: 12

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

9

18.02.2011, 16:32

Zitat

die Funktion, die du suchst wäre im Übrigen wcscpy ;)
ah perfekt danke, das hatte ich gesucht.
Das "return 0" war ein typo, sollte eigentlich -1 heißen.
Jetzt hab ich alle char in wchar_t geändert und es gehen zumindest 2 der 6 Auswahlmenüs korrekt. Den Rest find ich hoffentlich noch raus. Danke für die Antworten. :)
ich will doch nur ein einziges Dreieck t.t

10

18.02.2011, 23:38

Du brauchst da kein strcpy, ein einfaches = sollte reichen, sind ja nur Stringliterale...

Dann müsste der Zeiger aber per Referenz übergeben worden sein (oder als Doppelzeiger, naja...).
Was ich viel schlimmer finde ist, dass du einfach davon ausgehst, dass im Zeiger genug Platz ist, für Strings unterschiedlicher Länge. Zwischen 2 und 12 wird ungefähr alles mal benutzt.Im günstigen Fall verschwendest du Speicher, im ungünstigen schmiert dir alles ab, weil zuwenig Speicher reserviert war.
Ordentlich wäre es, den Zeiger per Referenz zu übergeben, passenden Speicher zu reservieren und da den String reinzukopieren. Da das nervig ist, solltest du z.B. std::string benutzen (der geht auch nicht nur mit char*, sondern ist ein auch Template).
Dann kannste nämlich einfach den String als return Wert nehmen, brauchst nur noch einen Parameter und hast die Fehlerquelle (das Pcout 0 ist) eliminiert, was immer gut ist. Achja, nochwas: Wenn du schon so unachtsam bist, der Funktion einen Nullpointer zu übergeben, wirst du dann auch wirklich den Returnwert prüfen? Ist ungefähr so wie bei OpenGL. Man kann einfach nicht hinter jeden Ogl Befehl alle Fehlercodes prüfen; aber dafür gibt es ja zum Glück Ogl Debugger, die das für die machen. Du könntest Exceptions benutzen, um das Problem zu lösen, so kannst du evtl. nicht an Ort und Stelle auf den Fehler reagieren, aber du merkst auf jeden Fall, wenn er Auftritt.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige