[C++] Funktionszugriffe

Huhu MCoder,

Bei der statischen Geschichte vermute ich allerdings dann auch Probleme bei C4D.
Evt. könntest du eine globale Instanziierung versuchen

Daran dachte ich eigentlich, da "static" im Plugin von Cinema4D nicht so wirklich gemocht wird.
Prinzipiell funktioniert das globale instaziieren. Ich arbeite in der Instanziierten Klasse mit INT* die mir beim zugriff CXX0030: Error: expression cannot be evaluated auswerfen. Laut MSDN verweis der Ausdruck p_L = class1.pL[index] auf eine Speicherstelle außerhalb des Programms. Das Programm ist meiner Logik nach die *.cdl. Oder meint die MSDN dass ich nicht auf Zeiger einer anderen Klasse zugreifen kann ?!

Gruß
WiZdooM
 
Hallo und guten Morgen,

Bisher erfolgt eine reguläre Deklaration um Klassenrumpf. Vor den eigentlichen Lese- und Schreibzugriffen wird
dann ein neues INT[] angelegt. Das einzige was ich mir erklären kann, ist dass das Pointerkonstrukt in diesem Falle ungeeignet ist.
Code:
class myclass1{
       INT* pW; 
	INT* pG; 
	INT* pL; 
	INT* pR; 
	INT* pLL; 
	INT* pLR; 
	INT* pRL; 
	INT* pRR;

       void Graph(INT numMaxVertices){
               pW = new INT[numMaxVertices];
		pG = new INT[numMaxVertices];
		pL = new INT[numMaxVertices];
		pR = new INT[numMaxVertices];
		pLL = new INT[numMaxVertices];
		pLR = new INT[numMaxVertices];
		pRL = new INT[numMaxVertices];
		pRR = new INT[numMaxVertices];
       }
};

Gruß
WiZdooM
 
Zuletzt bearbeitet:
Das einzige was ich mir erklären kann, ist dass das Pointerkonstrukt in diesem Falle ungeeignet ist.
Das wäre aber dann eine C4D-Spezialität. Solange du vor der ersten Benutzung der Variablen die Graph()-Methode aufrufst, sollte es eigentlich keine Probleme geben.
Hast du mal testweise eine konstante Initialisierung probiert:
C++:
class myclass1{
    INT pW[1000]; 
    ...
}
Gruß
MCoder
 
Hi MCoder,

Solange ich nicht versuche aus einer anderen Klasse heraus Funktionen aufzurufen, funktioniert dieses Konstrukt perfekt. "numMaxVertices" ist in dem Fall eine konstante die ich der Funktion bei Aufruf mitgebe, daher so etwas wie konkrete Initialisierung.

Ich glaube da aber eine Ahnung zu haben. Bin mir aber nicht sicher. Was bassiert wenn die Main()-Funktion einer Klasse return 1 zurück gibt ? Dann endet doch das Programm, und damit werden Variablen "zerstört" ?
Wenn dem so ist, endet mein Programm und ich versuche auf leere und nicht existente Variablen aus meiner anderen Klasse heraus zuzugreifen.

Jetzt ist nur die Frage wie ich eine Variable derart Globalisiere, dass sie nach Ende meiner Main() noch belegt ist. Wenn ich das richtig verstanden habe, geht das mit static - womit ich am Anfang bin.

Gruß WiZdooM
 
Zuletzt bearbeitet:
Hallo WiZDooM,

wie kommst du auf eine Main()-Funktion? Eine Klasse hat sowas nicht. Brauchst du eigentlich nur die Methode der Klasse oder eine Instanz davon, wo schon irgendwelche Daten erzeugt (verändert) wurden? Im ersteren Fall würde eine lokale Instanziierung ja reichen. Ich vermute, dass da jeweils unterschiedliche Prozesse (Threads) laufen, so dass die jeweiligen Adressräume geschützt sind.

Gruß
MCoder
 
Hi

wie kommst du auf eine Main()-Funktion?
Ich komme um die Art "main" nicht herum - die heisst nur nicht main sondern Execute(BaseDocument *doc) - in dieser Hauptroutine wird das Objekt erstellt, da es die Funktion ist, die vom Menü ausgeführt wird.

Brauchst du eigentlich nur die Methode der Klasse oder eine Instanz davon, wo schon irgendwelche Daten erzeugt (verändert) wurden?
Auf meinem Objekt will ich nun zwei weitere Operationen laufen lassen, die leider Daten aus dem Erstellungsprozess brauchen (den direct acyclic graph). Nur wie es scheint, werden alle Konstrukte der klasse 1 beim verlassen von Execute() aus dem Speicher geworfen. Wenn ich versuche darauf zuzugreifen, geht das ins leere.
Ich habe daher noch etwas rumprobiert: Mithilfe des static konzepts Variablen im Header zu deklarieren und diesen dann in der *.cpp die werte aus meinen DAG zuzuweisen. Beim Klick auf den Button hab ich dann reine Art "Rückkopieren" gemacht, was zumindest schonmal zu keiner Exception geführt hat. Jedoch ist das Ergebnis nicht das was ich erwartet habe. Statt einen Vertex zu löschen, waren alle gelöscht - obwohl die Löschfunktion einwandfrei Funktioniert.Zur Laufzeit der Execute habe ich sie mal ausführen lassen da wurde der richtige Punkt entfernt.

Gruß
WiZdooM
 
Hi WiZdooM,
wenn du die Werte zwischenspeichern willst,
leg eine Globale Variable an, und weis ihr den Wert zu der gespeichert werden soll, bevor du die Funktion wieder verlässt..
das ist zwar nicht die schönste Lösung, aber was anderes fällt mir im Moment nicht ein..

Grüße, random.
 
Hi,

ich denke jetzt auch, dass der Vergleich mit "main" ganz gut passt. Jeder Execute()-Aufruf ist wie ein eigener Programmlauf zu betrachten, so dass es nicht möglich sein dürfte, über die Programmlaufzeit hinaus irgendwelche Daten im Speicher aufzubewahren.
Welche Möglichkeiten bietet eigentlich der Parameter "BaseDocument"? Könnte man da evt. individuelle Daten mit dranhängen? Ansonsten sehe ich nur noch die Möglichkeit einer temporären Datei.

Gruß
MCoder
 
Hi
Hi WiZdooM,
wenn du die Werte zwischenspeichern willst,
leg eine Globale Variable an, und weis ihr den Wert zu der gespeichert werden soll, bevor du die Funktion wieder verlässt..
das ist zwar nicht die schönste Lösung, aber was anderes fällt mir im Moment nicht ein..

Grüße, random.

Naja mit dem static Konstrukt und den außerhalb der klasse definierten Variablen hab ich das ja bereits versucht. Das Ergebnis is wie in meinem letzten Beitrag beschrieben, aber eine andere Möglichkeit habe ich auch nicht gesehen über globale Variablen zu gehen.

Hi,

ich denke jetzt auch, dass der Vergleich mit "main" ganz gut passt. Jeder Execute()-Aufruf ist wie ein eigener Programmlauf zu betrachten, so dass es nicht möglich sein dürfte, über die Programmlaufzeit hinaus irgendwelche Daten im Speicher aufzubewahren.
Welche Möglichkeiten bietet eigentlich der Parameter "BaseDocument"? Könnte man da evt. individuelle Daten mit dranhängen? Ansonsten sehe ich nur noch die Möglichkeit einer temporären Datei.

Gruß
MCoder

Ja genau, nur dass für jeden Plugintyp die Execute() nur einmal ausgeführt wird. Anders gesagt sind das eher zwei "miniprogramme" die ich da gebaut hab. Zwar kann ich die Funktionen zwischen den Klassen Aufrufen, aber nach ablauf des Programms, funktionieren die nicht mehr weil die Daten weg sind.
Das BaseDocument stellt die Szene von C4D dar, die dem Plugin von C4D übergeben wird. Ich kann da lediglich eine Reihe von Funktionen ausführen. Inwiefern man das BaseDocument Objekt als Datenspeicher missbrauchen kann weiss ich nicht genau.
Ich hab jetzt dann erstmal mündliche Diplomprüfungen, danach werde ich mich wieder diesem Problem widmen. Da wird sich sicher eine Lösung finden ;)

Gruß
WiZdooM
 
Zurück