Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 17.08.2009, 18:11 Titel: |
|
|
Darf man fragen was du hier treibst?
Du übersetzt hier gerade nicht ernsthaft die Torque Game Engine? |
|
Nach oben |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 17.08.2009, 18:20 Titel: |
|
|
Nein
Ich erwähnte es schon einmal in einem anderen Thread.
Ich übersetze die trueSpace SDK. trueSpace ist ein 3D Programm zum Erstellen von 3D Objekten, Rendern, Animation usw.
Für dieses Programm kann man PlugIns entwickeln. Allerdings ist die SDK für Visual C++ ausgelegt was ich weder habe noch kenne ich mich (hast du vielleicht schon bemerkt) mit C++ aus.
Sämtliche Header Dateien habe ich durch SWIG laufen lassen und hier und da mit meinem spärlichen Wissen einiges korrigiert.
Bei der originalen SDK sind mehrere C++ Beispiel PlugIns dabei die ich nun versuche zu übersetzen.
2 dieser Beispiele konnte ich schon erfolgreich übersetzen - auch dank euch. Zudem hab ich schon ein 3. eigenes geschrieben.
Das heißt, es ist auf jeden Fall machbar und lauffähig. Aber: Natürlich gibt es elendig viele differenzen zwischen C++ und FB und auch auf SWIG kann man sich nicht 100%ig verlassen - leider.
Von daher stelle ich hier halt viele, viele, viele kleine Fragen um mich durch die Codes zu wursteln. _________________ 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: 19.08.2009, 13:58 Titel: |
|
|
EDIT: HAB DEN FREEBASIC CODE MAL KORRIGIERT
Eine, vorläufig hoffentlich letzte, Frage ehab ich noch:
Gegeben ist dieser C++ Code:
Code: | CtsxVector3f *vecs = tsxPolyhGetVxArray(obj);
if ((!numvecs) || (vecs == NULL)) {
bBox->minbounds.x = bBox->minbounds.y = bBox->minbounds.z = -1.0f;
bBox->maxbounds.x = bBox->maxbounds.y = bBox->maxbounds.z = 1.0f;
}
else {
bBox->minbounds = bBox->maxbounds = *vecs++;
while (--numvecs > 0) {
if (vecs->x < bBox->minbounds.x)
bBox->minbounds.x = vecs->x;
else if (vecs->x > bBox->maxbounds.x)
bBox->maxbounds.x = vecs->x;
if (vecs->y < bBox->minbounds.y)
bBox->minbounds.y = vecs->y;
else if (vecs->y > bBox->maxbounds.y)
bBox->maxbounds.y = vecs->y;
if (vecs->z < bBox->minbounds.z)
bBox->minbounds.z = vecs->z;
else if (vecs->z > bBox->maxbounds.z)
bBox->maxbounds.z = vecs->z;
vecs++;
}
} |
Übersetzt nach Fb ist es bisher so:
Code: | Dim numvecs As Integer = tsxPolyhGetNbrVxs( obj )
Dim vecs As CtsxVector3f Ptr = tsxPolyhGetVxArray( obj )
If ( ( numvecs = FALSE ) Or ( vecs = NULL ) ) Then
bBox.minbounds.x = -1.0f
bBox.minbounds.y = -1.0f
bBox.minbounds.z = -1.0f
bBox.maxbounds.x = 1.0f
bBox.maxbounds.y = 1.0f
bBox.maxbounds.z = 1.0f
Else
bBox.maxbounds.x = vecs->x + 1.0f
bBox.maxbounds.y = vecs->y + 1.0f
bBox.maxbounds.z = vecs->z + 1.0f
bBox.minbounds.x = vecs->x + 1.0f
bBox.minbounds.y = vecs->y + 1.0f
bBox.minbounds.z = vecs->z + 1.0f
While (numvecs > 0)
numvecs -= 1
If vecs->x < bBox.minbounds.x Then
bBox.minbounds.x = vecs->x
Else
If vecs->x > bBox.maxbounds.x Then
bBox.maxbounds.x = vecs->x
End If
End If
If vecs->y < bBox.minbounds.y Then
bBox.minbounds.y = vecs->y
Else
If vecs->y > bBox.maxbounds.y Then
bBox.maxbounds.y = vecs->y
End If
End If
If vecs->z < bBox.minbounds.z Then
bBox.minbounds.z = vecs->z
Else
If vecs->z > bBox.maxbounds.z Then
bBox.maxbounds.z = vecs->z
End If
End If
vecs += 1
Wend
End If |
Das Problem ist die Zeile im REM. Hier muss der Pointer von "vecs" erhöht werden.
Hierzu sollte ich noch erwähnen das die Funktion "tsxPolyhGetVxArray(obj);" ein Array des Typs CtsxVector3f zurückgibt.
Irgendwie bekomme ich es nicht gepeilt diesen Pointer zu erhöhen. _________________ Man kann sich öfter als zweimal im Leben halb tot lachen.
Zuletzt bearbeitet von E-P-S am 19.08.2009, 20:57, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 19.08.2009, 15:23 Titel: |
|
|
Nicht zu deiner Frage, aber zur Übersetzung:
--numvecs dekrementiert erst, und gibt dann den dekrementierten Wert zurück. D. h. in der while-Schleife muss erst der Wert von numvecs dekrementiert werden, dann mit der Bedingung verglichen, und wenn es dann immer noch passt, dann wird der Schleifenrumpf ausgeführt. Bei numvecs-- wäre das etwas anders. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 19.08.2009, 15:37 Titel: |
|
|
Danke erstmal für den Tipp. Ich glaube ich hab es jetzt auch hinbekommen. Die restlichen Fehler die mein Programm noch macht liegen wohl an meiner "3D Unfähigkeit".
Ich muß mich da irgendwie mal weiter reinarbeiten. All diese Vektoren, Matrizen, Axen etc. machen mich ganz wuschig... _________________ 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: 19.08.2009, 18:53 Titel: |
|
|
Nochmal zu obigen Beispiel.
"vecs++"
erhöht das den Pointer um 1 oder um die Größe der Struktur - sprich ermittelt C++ automatisch die Größe der Struktur für den nächsten "Sprung"?
Anderenfalls, also wenn es einfach um 1 inkrementiert verstehe ich diese Schleife so gar nicht. _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
|
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 562 Wohnort: Jüterbog
|
Verfasst am: 19.08.2009, 20:16 Titel: |
|
|
Ich verfolge das hier schon ganz gespannt.
Hab leider auch nur das Einsteiger-Buch "C++ easy" neben mir zu liegen, und da ist noch nichts
von Referenzierung mit dabei... Kurz um ich hab auch noch keine Ahnung und rede mich mal
wieder um Kopf und Kragen... egal
in deinem C++ code steht:
Code: |
CtsxVector3f *vecs = tsxPolyhGetVxArray(obj);
|
über eine C++ Web-Tutorial hab ich rausgefunden das vecs ein Pointer vom Typ CtsxVector3f ist (wegen dem * davor)
müsste vecs dann nicht so nach FB portiert werden?:
Code: |
dim vecs as CtsxVector3f ptr
|
..(und bitte nicht gleich hauen)
Mutton |
|
Nach oben |
|
|
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 19.08.2009, 20:52 Titel: |
|
|
Nö er weist der Struktur einfach den Inhalt des Pointers (ohne NULL Prüfung ) zu... |
|
Nach oben |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 19.08.2009, 20:55 Titel: |
|
|
Nein das ist nicht verkehrt, du hast Recht. Ich hab das mittlerweile auch geändert. Nur obigen Code nicht nachkorrigiert.
Das letzte beschriebene Problem verstehe ich aber immer noch nicht (das mit dem "vecs++".
Würde der Pointer nur um 1 erhöht ergäbe die Routine keinen Sinn, da der Pointer ja auf eine Struktur verweist. Man müsste somit den Pointer um die Größe der Struktur erhöhen (so zumindest denke ich mir das).
Vielleicht übersehe ich da was - ich schlage mich mit den Pointern nun schon ne Ewigkeit rum und hab immer noch nicht alles kapiert.
Na jedenfalls hab ich das mal getestet und vecs um stets eine Strukturgröße erhöht. Mein Programm verhält sich dann jedoch genau wie vorher. Da das Programm ohnehin nicht korrekt funktioniert weis ich jedeoch nicht ob es nun daran liegt oder woran auch immer.
Daher hätte ich das gern von jemand anderem erklärt bzw. bestätigt.
NACHTRAG: HAB DEN OBIGEN CODE EDITIERT _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
|
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 19.08.2009, 21:12 Titel: |
|
|
vecs wird um die Größe des Deklarierten Datentypes erhöht. |
|
Nach oben |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 20.08.2009, 08:01 Titel: |
|
|
Vielen Dank - dachte ich's mir doch.
Wenn ich dies nun in FB machen möchte, reicht dann ebenfalls ein
vecs += 1
oder muß hier ein
vecs = vecs + 1
oder gar ein
vecs = vecs + sizeof( STRUKTUR )
gemacht werden? Es funktioniert nämlich nur "vecs += 1" - alle anderen Versionen schießen mein Programm ab. Nur: Warum??? Und vor allem - warum stehen solche Infos nicht in der Hilfe _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
|
frebas
Anmeldungsdatum: 20.06.2008 Beiträge: 245
|
Verfasst am: 20.08.2009, 13:57 Titel: |
|
|
In der Hilfe steht das die beiden ersten möglichkeiten gleich seien.
Zitat: | es wird vom Compiler auf dieselbe Art umgesetzt. |
|
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 20.08.2009, 14:11 Titel: |
|
|
Wenn der pointer vom type "struktur" ist, musst du +1 machen. wie, ist dabei egal:
Code: |
Type foo
a As Integer
b As Integer
c As Integer
End Type
Dim arr(1 To 10) As foo
For i As Integer = 1 To 10
arr(i).a = 1 + i * 10
arr(i).b = 2 + i * 10
arr(i).c = 3 + i * 10
Next
Dim bar As foo Ptr
bar = @arr(1)
Print (*bar).a
bar +=1
Print (*bar).a
bar = bar +1
Print (*bar).a
Sleep |
Würdest du einen Integer-Pointer verwenden, würde die Speicheradresse z.B. immer um 4 Bytes erhöht. Da du nicht weißt, wie das Alignment der Struktur ist, ist die Variante mit "foo ptr" am sichersten. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 20.08.2009, 14:15 Titel: |
|
|
So, an dieser Stelle möchte ich mich nun mal herzlichst bei allen bedanken.
Mein Programm läuft nun endlich. Letzendlich war es ein klitzekleiner Fehler der den ganzen Tumult und das lange Suchen verursacht hat - wie meistens.
Ich hatte einfach die Zeile:
factor += factor * 0.1
ohne das Pluszeichen übersetzt. Kleine Ursache große Wirkung eben - oder auch: "wer lesen kann ist klar im Vorteil".
Dennoch habe ich durch eure Hilfe viel gelernt - und das schadet bekanntlich nie. _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
|
|