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

Fireball

Alter Hase

  • »Fireball« ist der Autor dieses Themas

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

1

24.08.2011, 23:50

HINT: XMMATRIX und Compilerfehler C2719 [solved]

Hallo zusammen,

ich betreibe zurzeit etwas refactoring in meinem Projekt und räume den Code auf, den ich in letzter Zeit implementiert habe.
Dabei bin ich auf folgendes Problem gestoßen. Wenn man folgendes implementiert.

Problem

C-/C++-Quelltext

1
void setShaderParameters(Light *light, Camera *camera, XMMATRIX world, XMMATRIX view, XMMATRIX projection);


Hier kommt es dann zu einem C2719 Compilerfehler ('parameter': formal parameter with __declspec(align('#')) won't be aligned).

Über google kam ich zu keinem ordentlichen Ergebnis und erst das Einführen von Zeigern löste das Problem.

Lösung

C-/C++-Quelltext

1
void setShaderParameters(Light *light, Camera *camera, XMMATRIX *world, XMMATRIX *view, XMMATRIX *projection);


Oder auf XMMATRIX verzichten und D3DMATRIX benutzen, wobei ich das keine schöne Lösung finde.

C-/C++-Quelltext

1
void setShaderParameters(Light *light, Camera *camera, D3DXMATRIX world, D3DXMATRIX view, D3DXMATRIX projection);


Ich kann mir nicht erklären, warum das so ist. Falls jemand von euch eine Erklärung hat, dann hier bitte posten.

Als Entwicklungsumgebung nutze ich derzeit VS2008 Express.

Schönen Gruß

Fb

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Fireball« (30.08.2011, 10:39)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

25.08.2011, 00:15

Am besten liest du mal das hier und das hier ;)

Fireball

Alter Hase

  • »Fireball« ist der Autor dieses Themas

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

3

25.08.2011, 10:28

Da hab ich wohl gepennt ... :-(

Zitat

However, often it is easier and more compact to avoid using XMVECTOR or XMMATRIX directly in a class or structure. Instead, make use of the XMFLOAT3, XMFLOAT4, XMFLOAT4X3, XMFLOAT4X4, and so on, as members of your structure.


Dachte immer, dass XMMATRIX ein Datentyp wie jeder andere auch wäre.

Danke!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

25.08.2011, 12:23

Naja, ist ja auch ein Datentyp wie jeder andere. Nur eben mit einem Alignment-Kriterium, das nicht so ohne weiteres immer erfüllt ist.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

5

25.08.2011, 21:43

Ich nehme mal an, du lässt XNA Math noch die normale FPU benutzen, denn dann fällt das nicht weiter auf. Wenn du aber auf SSE2 umstellst kannst du schöne Crashes bekommen wenn das Alignment nicht stimmt!
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

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

Fireball

Alter Hase

  • »Fireball« ist der Autor dieses Themas

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

6

26.08.2011, 09:41

Diese Fehler sind mir komplett neu ...

und wenn ich ehrlich bin kann ich mir unter dem "Alignment" auch noch nichts so richtig vorstellen.

Der Grund warum ich diesen Datentyp in letzter Zeit öfters benutze ist, dass er in einigen Code Beispielen vorgekommen ist.

Ich bin noch am überlegen, ob ich ihn nicht ganz aus meinem Code verbannen sollte. Dann muss ich jedoch immer wieder umkonvertieren, wenn dieser Datentyp von einer API Funktion benötigt wird.

Schönen Gruß

Fb

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

7

26.08.2011, 17:40

Ich weiss es nicht mehr ganz genau, aber ich meine das für SSE2 nötige Alignment waren 16 Bytes.
Das heisst, das man beim Laden der Daten in die Register darauf zu achten hat, dass die Speicheraddressen die man benutzt durch 16 teilbar sind!
Scheinbar macht es das für die CPU irgendwie einfacher.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

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

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

26.08.2011, 18:25

und wenn ich ehrlich bin kann ich mir unter dem "Alignment" auch noch nichts so richtig vorstellen.

http://en.wikipedia.org/wiki/Data_structure_alignment

Fireball

Alter Hase

  • »Fireball« ist der Autor dieses Themas

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

9

29.08.2011, 10:11

OK

Hallo zusammen,

OK, ich glaube ich habs verstanden. Das Beispiel von Wikipedia ist ja ganz gut.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
struct MixedData  /* After compilation in 32-bit x86 machine */
{
    char Data1; /* 1 byte */
    char Padding1[1]; /* 1 byte for the following 'short' to be aligned on a 2 byte boundary assuming that the address where structure begins is an even number */
    short Data2; /* 2 bytes */
    int Data3;  /* 4 bytes - largest structure member */
    char Data4; /* 1 byte */
    char Padding2[3]; /* 3 bytes to make total size of the structure 12 bytes */
};


Soweit ich das verstanden habe macht der Compiler das alleine, zum Glück! :-)
Allerdings ist das noch keine Antwort darauf, warum ich oben im Post einen allignment Error bekomme.

Ich denke ich werde in Zukunft einfach auf XMFLOAT4X4 or XMFLOAT4 zurückgreifen, um diesen Problemen aus dem Weg zu gehen.

Gruß

Fb

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Fireball« (29.08.2011, 10:28)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

29.08.2011, 11:01

Den Fehler bekommst Du deshalb, weil der Compiler das Alignment selber macht, aber eben eventuell nicht so, wie es sein soll. Er kann sich z.B. dazu entschieden haben jeden Member eines Structs auf 16 Byte aufzufüllen (15 leere Bytes nach einem char, 14 nach einem short, 12 nach einem int, usw...). Und da knallt es dann, wenn an anderer Stelle außerhalb Deines Programms ein Alignment angenommen wird, welchem Dein Compiler aber nicht folgt.
Außerdem lässt sich das Alignment in C# auch manuell festlegen. Dein "zum Glück" ist damit also doppelt dahin ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige