C2102 und Back Buffer...
-
Hier bin ich etwas Überfragt da ich mich mit D3D nicht auskenne.
[stichel]
Aber TGGC scheint da sehr fitt zu sein. Vllt. kann man ihn ja zur Konstruktieven hilfe bewegen
[/stichel]
Aber ein runtime_error ist doch schon mal ein schritt weiter als der compiler error
Auch auf die Gefahr hin das ich müll schreibe (was aber sicherlich die Leute die sich mit D3D auskennen hervorlocken würde. Irgendwann kann man es doch nich mehr aushalten
Wenn ich das richtig sehe hast Du Dir eine Klasse geschrieben die einige Aufgaben für Dich übernehmen soll.
Hierbei hast Du geschrieben:
IDirect3DSurface8 * Surface::GetSurface() { return m_pIDirect3DSurface; }
Du brauchst nun aber IDirect3DSurface8 ** .
Eine weitere Möglichkeit (die hat nen fetten haken) wäre:
IDirect3DSurface8 ** Surface::GetSurface() { return &m_pIDirect3DSurface; }
Der Haken ist das man eigentlich keine Zeiger auf Interne Variablen vergibt da diese sonst Manipuliert werden können ohne das man etwas gegen machen kann. Nun lässt sich zwar mit const noch ein wenig was machen das mag dann aber die API nicht mehr so recht.
Der Vorteil wäre aber das jede Deiner Klassen so wie gedacht das "Surface" hält und Du eine passende Adresse zurückgibst.
Vllt. ist von der API auch die änderung der Daten wünschenswert weil eben dieser Wert permanent durch API und Deiner Klasse modifiziert werden muß.
Da muß ich passen, ich hab noch nie was mit GFX Programmierung gemacht.
P.s.: Das global sollte nur helfen herauszufinden ob später der Speicher verwendet wird nachdem Du es mit einer Lokalen variable versucht hast und es da krachte. Danach wurde ersichtlich das Du einen Speicherbereich brauchst der vermutlich die Lebenszeit des "Surface"'s üerlegeb muß.
-
Knuddlbaer schrieb:
Auch auf die Gefahr hin das ich müll schreibe
Selbsterkenntnis...
Das Beispiel passt hier nicht.@TetrisFan: Werd Dir mal klar, was dein Code machen soll. Dann verstehst du auch, warum hier nix compiliert.
-
auf die gefahr hin, mich noch unbeliebter zu machen, als ich schon bit:
ich BIN mir verdammt nochmal im klaren fdarüber, was mein code machen soll!
ich habe wie von Knuddlbaer schon gesagt, eine klasse geschrieben, die arbeit mit surfaces für mich übernimmt. sie lockt sie, unlockt sie, begoinnt das rendering auf sie und beendet es, sie kann einzelne pixel zurück liefern und setzen, etc.
aaußerdem enthält sie noch daten, wie eine D3DSURFACE_DESC.
nun möchte ich die "eigentliche" surface an GetBackBuffer übergeben, damit diese "der back biuffer ist". mit einer methode der Klasse (Update) aktualisiere ich nun z.b. die surface desc.
ich weiß aber immer noch nicht, warum es nicht funzt... *heul*
@Knuddlbaer
das mit der funktion hab ich auch schon versucht, und ich bekam wieder einen runtime error...
-
Na vllt. lässt Du Dich auch mal dazu ab etwas fachliches dazu zu schreiben und lässt mich nicht dumm sterben.
Wir haben eine Klasse mit der membervariablen:
IDirect3DSurface8 * m_pIDirect3DSurface .
Benötigt wird IDirect3DSurface8 ** .
Wenn ich mich nicht täusche erreicht man dies mit &m_pIDirect3DSurface;
Mir fehlt die Kentniss wieso dies nicht passt und würde es gerne erfahren.Sein Code soll einen Zeiger auf einen Zeiger des Types IDirect3DSurface8 zurückgeben.
Warum
IDirect3DSurface8 * Surface::GetSurface() ; & SurfaceClass.GetSurface() ;
nicht geht sollte mittlerweile klar geworden sein. Wurde ja mehrmals in beiden Beiträgen erläutert. Tetris Fan hat sich an das Forum gewendet weil er eine Hilfestellung bekommen möchte. Ein Überhebliches "Denk nach dann weist Du es" zeugt nicht gerade von Hilfestellung. Im moment bist Du für mich nur ein Quacksalber der sich nicht mal die Beiträge richtig durchliest. Ich würde mich aber freuen wenn Du mir z.B. erklärst wieso
IDirect3DSurface8 ** Surface::GetSurface() { return &m_pIDirect3DSurface; }
nicht Funktioniert. Ich möchte ja auch noch was lernen
-
@Knuddlbaer
das mit der funktion hab ich auch schon versucht, und ich bekam wieder einen runtime error...Ich bin mir sicher das sich TGGC zu der Sache mal äußert und wie beide etwas über diese Problematik lernen werden
-
Dann erkläre doch mal, was genau dieses Stück machen soll:
m_pIDirect3DDevice->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &m_pSurface[i].GetSurface())
Bye, TGGC
-
HRESULT IDirect3DDevice8::GetBackBuffer(UINT uBackBuffer // Zu ermittelnden Back Buffer D3DBACKBUFFER_TYPE Type // unwichtig, muss D3DBACKBUFFER_TYPE_MONO sein IDirect3DSurface8 ** pBuffer // Die Surface, in der die Funktion den ermittelten Back Buffer speichert
);
Ich würde also sagen:
Es gibt da ein Array von Surface Obejkten die hier in einer Schleife abgearbeitet werden sollen. Und zwar sollen alle bestehenden Objekte mit GetBackBuffer abgearbeitet werden. Ob dies nun so Sinn macht oder nicht kann man nur aus dem gesammtprojekt ermitteln.
Wenn Du auf das **&**m_pSurface[i].GetSurface() hinauswillst:
Lies mal die Beiträge
-
genau, danke, der sinn ist es, ein array von Surface objekten zu haben, die u.a. wie bereits 10 mal gesagt (nicht böse gemeint...) das IDirect3DSurface8 Interface beinhalten und so einfach und schnell zugriff auf die in eben dieser schleife ermittelnten backjbuffer zu ermöglichen.
das selbe hjabe ich auch vor bei meiner textur klasse, bloß0, dass es da die einzelnen mip levels und nicht die back buffer sind, die ich ermitteln will. das hat den zweck, dass ich auch einfach und schnell auf surfaces rendern kann, denn meine Surface klasse enthält auch ein ID3DXRenderToSurface Objekt.
@TGGC
diese zeile bezweckt auch wie schon achtzig mal gesagt, dass das in der Surface klasse enthaltene interface an getbackbuffer übergeben wird, sodass diese surface den backbuffer enthält!
-
Wenn das mit der "globalen" Variable klappt (pfui is das, da hat TGGC recht
Wenn es aber mit return &.... nicht geht gehe ich davon aus das Du
eine Änderung an der Variablen machst wärend der Laufzeit.
Beispiel:#include <iostream> class foo { int * i; int b; public: // Belegen des Speicherbereiches foo(){i = new int; *i = 12;} ~foo(){} // Gibt speicher frei und setzt andere Adresse void foobar(){delete i;i = &b;} // <-- Tut was was es nich tun darf :clown: // Gibt zeiger auf Zeiger zurück int ** bar(){return &i;} }; int main() { // @TGGC hierauf zielt meine Lösung ab: foo t; int ** i = t.bar(); // Zurückgeben eines Zeiger auf Zeiger des Typs int mit hilfe von & int* std::cout<<**i; // Nehmen wir an die API speichert die Adresse int * pi = *i; // Irgendwas ändert nun aber die Adresse in Deinem Objekt t.foobar(); // Und die API will nun darauf zugreifen. *pi = 12; // crascht weil in der Klasse *i freigegeben wurde und Adresse ungültig }
-
Tetris Fan schrieb:
diese zeile bezweckt auch wie schon achtzig mal gesagt, dass das in der Surface klasse enthaltene interface an getbackbuffer übergeben wird, sodass diese surface den backbuffer enthält!
Unsinn, der letzte Parameter ist ein Rückgabewert. Das bedeutet, du möchtest einen Member ändern. Jeder Code, der private Attribute auf diese Art modifiziert, ist ein Hack und gehört gelöscht.
@knuddlbär: return &... geht grundsätzlich, aber siehe deine eigene Anmerkung.
-
Ahhh..
GetBuffer erwartet hier also eine Adresse in die eine Rückgabe übergeben wird ?
Das bringt etwas Licht ins Dunkle und macht die vorgehensweise wirklich fragwürdigDemnach würde das Surface das die Klasse verwaltet von GetBackBuffer geliefert ?
Dann wäre eine lokale Variable zum befüllen wichtig die dann mit setirgendwas in die Klasse eingetragen wird !?
(Na siehste geht doch
Übrigens ist es nicht ungewöhnlich referenzen und zeiger zu liefern:
class t
{
std::string Name; // wird irgendwie gefülltconst std::string & Name(); // Gibt Name zurück
};Hier hilft das const die Rückgabe sauber zu halten. Du kannst nich immer eine Kopie mitgeben
*mal an TGGC übergeb, nu wird Ihnen geholfen
*
-
@TGGC
öhm, ich will dich nicht beleidigen, aber ist das nicht das gleiche??
@Knuddlbaer
ja, das ist richtig, die surface in der klasse kjommt von getbackbuffr oder in der texturklasse von GetLevel (oder wie die funktion heist)
@all
Knuddlbaer sagte, dass ich eine lokale variable füllen solle und diese dann per Set methoden an meine klasse weitergeben solle:
Frage 1: Wie genau (nur zur sicherheit bitte ein kleines code eispiel)
frage 2: funktioniert das überhaupt? ich meine in DX kann man doch nciht einfach ein Interface dem anderen zuweisen, das gibt doch ehler, oder??
-
@Tetris Fan
Die Aussage
Unsinn, der letzte Parameter ist ein Rückgabewert. Das bedeutet, du möchtest einen Member ändern. Jeder Code, der private Attribute auf diese Art modifiziert, ist ein Hack und gehört gelöscht
ist richtig. Du hälst den Member privat damit nurnoch der Zugriff per set und get Methode gemacht werden kann.
Beispiel:
struct cat { int age; void set_Age(int a){age = a}; } cat c; c.set_Age(10); //viel später: c.age = -10; // Ja was denn nun ?! :open_mouth: // Cat geht aber weiterhin davon aus das sie 10 Jahre alt ist und nicht erst in 10 Jahren auf die Welt kommt).
Man will somit in seinem Objekt immer wissen welchen Wert seine Member haben. Das erreicht man aber nicht in dem man die Zeiger rausrückt. (Daher auch das Kommentar mit dem Haken).
Ich bin bisher davon ausgegangen das die GetBuffer Methode die Variable liest, nicht schreibt. (Sry @tggc ich hab kein D3D SDK drauf und kenn mich dem dem D3D kram nich aus. Daher ja als der die bitte um einen Hinweis
.
Was Du machen möchtest bedeutet:
Das setzen der Membervariable OHNE eine Membermethode zu verwenden.
Mein Vorschlag wäre hierzu:
class Surface() { //.... void set_Surface(IDirect3DSurface8 * surf); } void Surface::set_Surface(IDirect3DSurface8 * surf) { m_pIDirect3DSurface = surf; } IDirect3DSurface8 * temp; // Ein gültiges Surface holen m_pIDirect3DDevice->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO,&temp); m_pSSurface[0].set_Surface(temp);
@ll sorry für die Verwirrung. Der Uhrsprung des Problemes wurde im C++ Forum gepostet. Mir war nicht bewusst das hier die Rückgabe über einen Zeiger auf Zeiger realisiert wird. Da ich keine D3D Programmierung mache habe ich auch kein Dokumentation dazu da. Ich habs auch nicht geschnallt als ich mir die Signatur zeigen lies. Diese Art der Parameterübergabe ist mir einfach zu befremdlich als das ich daran gedacht habe
@TGGC danke für den Hinweis, etwas früher hätte allen ne menge Zeit gespart
Ahso, die Qualität eines Programmierers wird Übrigens nicht an seiner Aroganz gemessen.
Eure Dummheit kotzt mich an. - Lest mal der Hilfe, mich hat's auch gehelft! - Nur noch 2 Genies auf der Welt und das Andere ist grad nicht da...
Die Zeit die Du mit dem Eintragen dieser Signatur verbracht hättest, hättest Du auch fachlich nutzen können den Hinweis zu geben das GetBuffer per Zeiger zurück gibt. Dem Genie ist bestimmt aufgefallen das ein Knuddlbaer in diesem Teil des Forums nie aufgetaucht ist und ich mehrmals geschrieben habe das ich D3D nicht kenne.
Etwas mehr Hilfsbereitschaft und weniger Argoganz könnte die Qualität Deiner Antworten wesentlich verbessern
Denk mal drüber nach.
-
tja, immer noch ein runtime error...
ich übergebe GetBackBuffer erstmal eine temp surface, die ich per set methode in die surface klasse "einfüge".
beim starten dann de rruntime fehler. mein compiler weißt auf die zeile hin, in der ich dann die GetDesc des IDirect3DSurface8 interfaces aufrufe (in einer funktion innerhalb der surface klasse)....
ich verzweifle... aaahhh
(wie oft habe ich obigen satz bereits gesagt? :))
-
Ich denke es wird Zeit für Mehr Quelltext Deiner seite (bitte Codetags verwenden) und jemanden der sich mit D3D auskennt. Ich ecke als mit dem Standard C++ an in diesem Forum
-
also, ich habe es jetzt anders gelöst, bzw. bin noch dabei.
ich baue in meine surface klasse zwei weitere funktionen ein:
CreateFromScreen (für Back buffer) und CreateFromTexture (für Texturen). da die methoden in der klasse sind, sollten keine probleme mehr mit lokal, global, oder private, etc. auftreten. den bericht gibs morgen...
-
also, ich habe es jetzt anders gelöst, bzw. bin noch dabei.
ich baue in meine surface klasse zwei weitere funktionen ein:
CreateFromScreen (für Back buffer) und CreateFromTexture (für Texturen). da die methoden in der klasse sind, sollten keine probleme mehr mit lokal, global, oder private, etc. auftreten. den bericht gibs morgen...
-
Im design sind viele Details versteckt.
Ich denke nun ist auch das erreicht was TGGC wollte, ein Überdenken des Konzepts
-
*froi*
-
Berich:
also, wie oben beschrieben klappt es, mir gefällt das design aber nicht allzu gut, vielleicht findet sich ja nochmal ne andere lösung...
danke an alle, die moich jetzt immer noch "mögen"
nein, im ernst, danke,
cya