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

13.09.2012, 14:27

C++ Fehler durch Compiler?

Hi Leute,

ich habe ein ziemlich seltsames Problem. Ich habe ursprünglich mein Fenster und DirectX per Hand initialisiert, jetzt bin ich aber darauf umgestiegen, meine DirectX Anwendung zu einer Engine umzubauen und in einer DLL auszulagern.
Vom Code an sich habe ich rein gar nichts geändert, ich habe diesen nur in einer DLL ausgelagert. Wenn ich diese dann ausführe, werden mir aber Parameter, die ich in der Funktion an sich setze, komplett falsch dargestellt.

Hier der wesentliche Code:

Zitat

DXGI_SWAP_CHAIN_DESC swapChainDesc;
swapChainDesc.BufferDesc.Width = width,
swapChainDesc.BufferDesc.Height = height;
swapChainDesc.BufferDesc.RefreshRate.Numerator = refreshRate;
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
dxErr = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, _featureLevel, 5, D3D11_SDK_VERSION, &swapChainDesc, &swapChain, &device, &chosenFeatureLevel, &deviceContext);
if(dxErr != S_OK) throw dxErr;
Ich habe unwesentliche Zeilen ausgelassen; der Fehler liegt hierbei bei swapChainDesc. Initialisiert habe ich die Struktur korrekt mit den Werten [width=800, height=800,Numerator=60].
Jetzt habe ich einfach mal ein Bild gemacht, was aber wirklich beim Compiler ankommt. Man achte auf die Werte.

Woran kann sowas liegen?!
»Palimaschin« hat folgendes Bild angehängt:
  • Bild.png

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

13.09.2012, 14:38

Verwendest du da auch einen Debug Build deiner dll?

3

13.09.2012, 14:44

Ne ich verwende direkt den Releasebuild.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

13.09.2012, 14:47

Dacht ich mir; das erklärts natürlich. Der Release Build ist optimiert, d.h. Variablen wurden evtl. wegoptimiert etc. und der Debugger kann daher nur in eingeschränktem Umfang sinnvolle Informationen präsentieren. Wenn du debuggen willst, verwend einen Debug Build. Erst wenn du dort auch komische Werte siehst, gibts Grund zur Sorge...

5

13.09.2012, 15:08

Danke für die Hilfe, ich habe jetzt die Debug-Dll genutzt. Die Werte sind alle korrekt! Das kommt davon, wenn man fast nur in C# programmiert und es dort bei den Werten keinen großen Unterschied macht, ob Release oder Debug.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

6

13.09.2012, 23:25

Danke für die Hilfe, ich habe jetzt die Debug-Dll genutzt. Die Werte sind alle korrekt! Das kommt davon, wenn man fast nur in C# programmiert und es dort bei den Werten keinen großen Unterschied macht, ob Release oder Debug.
Jein. Wenn du in .NET deinen Releasebuild debuggst, führt der JIT trotz Releasebuild keine Optimierung durch. Ich hatte schon (selten, zweimal) den Fall, dass ein Programm wunderbar durchlief wenn es im Debugger gestartet worden war, ganz ohne Breakpoint oder durchsteppen. Einmal hat es geholfen den Algorithmus gegen einen anderen auszutauschen, der sowieso effizienter war, und ein anderes Mal dem JIT das Optimieren der problematischen Methode per Attribut zu verbieten. Das zweite ist natürlich eigentlich eine ganz schlechte Lösung.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

7

14.09.2012, 19:52

Eine kurze Frage, die nicht zum eigentlichem Thema gehört:

HMONITOR monitor = MonitorFromWindow(_handle, MONITOR_DEFAULTTOPRIMARY);


Diese Zeile Code schlägt immer fehl, und ich kann nicht sagen woran das liegen kann. Das Windowhandle ist definitiv richtig; ich bekomme als Ergebnis nur "0" zurück.

Werbeanzeige