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

11.06.2009, 22:46

Typumwandlung

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
class c_Vector2
{
public:
        float x;
    float y;

        operator D3DXVECTOR2& (){returnD3DXVECTOR2(x,y);}
    operator const D3DXVECTOR2& ()const{return D3DXVECTOR2(x,y);}
};

inline float    Vector2Length(const c_Vector2 &v){return D3DXVec2Length(&v);}



Wenn ich die Klasse oben kompiliere erhalte ich folgenden Fehler:
e:\meine dateien\programmieren\hxe(hobby directx engine)\tests\hxe-test1\hxe-test1\vector2.h(74) : error C2664: 'D3DXVec2Length': Konvertierung des Parameters 1 von 'const c_Vector2 *' in 'const D3DXVECTOR2 *' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.

Eigentlich sollte das doch funktionieren da es vom Prinzip her genauso wie bei der TriBase Engine ist.Wie muss ich des machen das es funktioniert?

gruß jan

2

11.06.2009, 23:00

Du darfst keine temporären Objekte an Referenzen auf nicht-konstante Objekte binden. Das machst du aber in deinem ersten Operator.

Warum nicht einfach ein einziger Operator wie der Folgende? Eine neues Objekt erzeugst du so oder so.

C-/C++-Quelltext

1
2
3
4
operator D3DXVECTOR2 () const
{
    return D3DXVECTOR2(x,y);
}

3

11.06.2009, 23:13

Danke für die Antwort

Bekomme aber wenn ich deine Codezeile einfüge und die anderen 2 rausmache immernoch den gleichen Fehler.

gruß jan

4

11.06.2009, 23:32

Ah, D3DXVec2Length() nimmt also einen Zeiger auf einen Vektor, um dessen Länge auszurechnen? Und dann nicht mal const-qualifiziert? Sehr sauberes Design... :roll:

Naja, dadurch bringt dir dein Konvertierungsoperator in deiner Situation nichts, da du Zeiger umwandeln müsstest. Wenn du es nur hier brauchst, schreibst du am besten eine eigene Funktion zur Längenberechnung, z.B. mit sqrt() aus <cmath>.

Ansonsten müsstest du eben zuerst einen D3DXVECTOR2 aus deinem c_Vector2 erstellen und dann dessen Adresse übergeben. Aber mit einem temporären Objekt funktioniert das nicht.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

11.06.2009, 23:43

warum nicht einfach so:

C-/C++-Quelltext

1
inline float length(const c_Vector2& v) { return std::sqrt(v.x * v.x + v.y * v.y); } 


oder so

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class c_Vector2 
{ 
public: 
  float x;
  float y;

  float length() const { return sqrt(x*x + y*y); }

};



Natürlich gibt es auch noch den Hack:

C-/C++-Quelltext

1
2
  operator const D3DXVECTOR2* () const { &x;}
  operator D3DXVECTOR2* () { &x;}


Generell stell ich jetz aber mal die Sinnfrage: Warum eine eigene Vektorklasse wenn du sowieso die D3DX* Funktionen verwenden willst!? Warum nimmst du dann nicht einfach D3DXVECTORn!?
Lerneffekt fällt imo ja mal flach...

6

12.06.2009, 00:02

Zitat von »"dot"«

Natürlich gibt es auch noch den Hack:

C-/C++-Quelltext

1
2
  operator const D3DXVECTOR2* () const { &x;}
  operator D3DXVECTOR2* () { &x;}
Hm? Selbst mit return würde das nicht so funktionieren, wie du dir das vorstellst. Man müsste entweder mit new ein neues Objekt erzeugen, was hier sehr leicht zu Leaks führen kann, oder Zeiger auf verschiedene Typen reinterpret-casten, was auch nicht ungefährlich ist.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

12.06.2009, 00:21

Zitat von »"Nexus"«

Hm? Selbst mit return würde das nicht so funktionieren, wie du dir das vorstellst. Man müsste entweder mit new ein neues Objekt erzeugen, was hier sehr leicht zu Leaks führen kann, oder Zeiger auf verschiedene Typen reinterpret-casten, was auch nicht ungefährlich ist.


Stimmt natürlich reinterpret_cast fehlt, zu meiner Verteidigung sei gesagt: Es ist schon spät und bei vollem Bewusstsein würd ich sowas natürlich niemals machen. Und ich hab mich den ganzen Tag mit rekursiven Lernverfahren für adaptive Transversalfilter und der korrekten Sortierung von Polygonen beschäftigt, mein Hirn is heute schon ziemlich weich ;)
Naja, alles Ausreden, ich sollte wohl ins Bett...halt...ich bin ja schon im Bett xD

C-/C++-Quelltext

1
2
  operator const D3DXVECTOR2* () const { reinterpret_cast<D3DXVECTOR2*>(&x);} 
  operator D3DXVECTOR2* () { reinterpret_cast<D3DXVECTOR2*>(&x);}


Natürlich is das unschön, aber er verwendet Direct3D, das ganze soll also sowieso nur auf Windows laufen und da funzt das im Allgemeinen.
Nicht umsonst hab ichs auch als Hack bezeichnet ;)

8

12.06.2009, 10:17

Danke für die Antworten

Ich werd jetzt D3DXVECTOR2 Typ verwenden

9

12.06.2009, 16:00

Zitat von »"dot"«


Natürlich is das unschön, aber er verwendet Direct3D, das ganze soll also sowieso nur auf Windows laufen und da funzt das im Allgemeinen.
Nicht umsonst hab ichs auch als Hack bezeichnet

Ich würde mich nicht aufs Allgemeine verlassen. Lieber gleich sauber implementieren.
Du hast übrigens dein return schon wieder vergessen.

Zitat von »"jan91"«


Ich werd jetzt D3DXVECTOR2 Typ verwenden

Scheint die naheliegendste Lösung zu sein.

Dass für die Länge eines Vektors ein Zeiger verlangt wird, verwundert mich trotzdem. Ist das wegen C-Kompatibilität?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

12.06.2009, 16:11

Zitat von »"Nexus"«

Du hast übrigens dein return schon wieder vergessen.


:shock:

ok ich habs verstanden return > dot :?

dot kapituliert hiermit bedingungslos vor dem return...

Zitat von »"Nexus"«

Dass für die Länge eines Vektors ein Zeiger verlangt wird, verwundert mich trotzdem. Ist das wegen C-Kompatibilität?


Würd mal sagen ja, bzw. generell damit das Teil auch von anderen Sprachen/Compilern aus verwendet werden kann...

Werbeanzeige