| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen   | 
	
	
	
		| Autor | 
		Nachricht | 
	
	
		E-P-S
 
  
  Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
  | 
		
			
				 Verfasst am: 21.08.2009, 22:50    Titel: Pointer auf Pointer eines Array ??? | 
				     | 
			 
			
				
  | 
			 
			
				Ich hab mal wieder ne ungewöhnliche Frage und ich hoffe ihr könnt meinen Abstraktionen folgen, es geht immer noch um die Übersetzung der trueSpace SDK nach FreeBasic. In jetzigem Fall geht es um die richtige Anwendung einer bestimmten Funktion. Zunächst mal Code:
 
 
 	  | Code: | 	 		  Type CtsxFace
 
   nbrVxs As Short
 
   pFVxs As CtsxFaceVx
 
   r1 As UByte
 
   r2 As UByte
 
   r3 As Any Ptr
 
   normVxs(0 To 3-1) As UByte
 
   materialIdx As UShort
 
End Type
 
 | 	  
 
 
Diese Struktur ist gegeben. Nun gibt es da eine Funktion zu deren Erklärung ich mal das poste was in der SDK steht:
 
 
 	  | Zitat: | 	 		  tsxPolyhGetFaceptrArray 
 
 
PURPOSE Get a pointer to the array of Face-ptrs (0 if not a Polyhedron). 
 
 
SYNTAX
 
TSXAPIFN CtsxFace** tsxPolyhGetFaceptrArray(tsxPOLYHEDRON* pPolyh) 
 
 
PARAMETERS 
 
pPolyh tsxPOLYHEDRON*: a pointer to the polyhedron 
 
 
RETURNS CtsxFace** | 	  
 
 
Sol heißen: Die Funktion erwartet als Parameter einen Pointer - das ist klar - und gibt mir den Pointer auf einen Pointer eines Arrays des Typs CtsxFace zurück.
 
 
Ich habe die Funktion von C++ nach FB folgendermaßen übersetzt:
 
 
 	  | Code: | 	 		  | Declare Function tsxPolyhGetFaceptrArray Alias "tsxPolyhGetFaceptrArray" (pPolyh As tsxPOLYHEDRON) As CtsxFace Ptr Ptr | 	  
 
 
Die Frage lautet WIE kann ich das was mir die Funktion zurück gibt in einem Array des entsprechenden Typs "empfangen"?
 
 
Hierzu möchte ich anmerken das mir die Größe dieses Arrays bekannt ist. In diesem Falle ist das die Anzahl an Faces.
 
 
Daher hab ich es so versucht:
 
 
 	  | Code: | 	 		  Dim pFaces(0 To numFaces-1) As CtsxFace Ptr
 
   pFaces(0) = tsxPolyhGetFaceptrArray( sObj )  | 	  
 
 
Ausgeben lasse ich mir ein Feld des Arrays durch:
 
 
 	  | Code: | 	 		  | pFaces(index)->nbrVxs | 	  
 
 
Das Programm läuft und es stürzt auch nicht ab, jedoch ist das was ich auslese totaler Käse und absolut keine Werte die in Frage kämen. Sprich: statt 4, 4, 4 kommt sowas wie 32711, 407, 0 etc.
 
 
Irgend was läuft also schief - WAS MACHE ICH FALSCH? _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		ThePuppetMaster
 
  
  Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
  | 
		
			
				 Verfasst am: 22.08.2009, 05:53    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Versuch mal
 
 
 	  | Code: | 	 		  Type CtsxFace field = 1
 
'...
 
 | 	  
 
 
 
MfG
 
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		E-P-S
 
  
  Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
  | 
		
			
				 Verfasst am: 22.08.2009, 10:50    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Leider funktioniert auch das nicht. Es läuft ebenfalls, aber die Werte bleiben so merkwürdig.
 
 
Vielleicht handhabe ich die Befehle auch falsch - wer weiß, leider ist die SDK Dokumentation eben sehr dürftig und momentan bin ich wohl der einzige auf diesem "blauen Ball" der PlugIns für tS entwickelt...
 
 
Ich versuche mich erstmal schlauer zu machen ob das was ich da mache überhaupt die richtige Methode ist.
 
 
Danke erst einmal _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		E-P-S
 
  
  Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
  | 
		
			
				 Verfasst am: 23.08.2009, 00:03    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				So, ich hab es (endlich) selbst heraus gefunden. Das Geheimnis des ganzen ist eine FreeBasic Änderung - wer hätte das gedacht.
 
 
 	  | Zitat: | 	 		  | As of version 0.18.5b, FB's syntax has no way to specify returning a reference, although this will change in future versions. | 	  
 
 
Und wo steht das ganze? Beim Peek Befehl !!!
 
 
Somit lautet die einfache Antwort:
 
 
Pointer zunächst ganz normal in eine Variable übernehmen und dann diese per PEEK nochmal nach dem eigentlichen Pointer abfragen.
 
 	  | Code: | 	 		  Dim ppFace As Integer Ptr = tsxPolyhGetFaceptrArray( sObj ) 
 
Dim pFace As CtsxFace Ptr
 
pFace = Peek( Integer, ppFace ) | 	  
 
 
 
Mann ey ... an sowas kann man echt 3 Tage verschwenden .... _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		 |