Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

C++ nach FB - Syntaxfrage
Gehe zu Seite Zurück  1, 2, 3
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 17.08.2009, 18:11    Titel: Antworten mit Zitat

Darf man fragen was du hier treibst? grinsen
Du übersetzt hier gerade nicht ernsthaft die Torque Game Engine?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 17.08.2009, 18:20    Titel: Antworten mit Zitat

Nein zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 19.08.2009, 13:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 19.08.2009, 15:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 19.08.2009, 15:37    Titel: Antworten mit Zitat

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... mit dem Kopf durch die Mauer wollen
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 19.08.2009, 18:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 562
Wohnort: Jüterbog

BeitragVerfasst am: 19.08.2009, 20:16    Titel: Antworten mit Zitat

Ich verfolge das hier schon ganz gespannt. lächeln
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 19.08.2009, 20:52    Titel: Antworten mit Zitat

Nö er weist der Struktur einfach den Inhalt des Pointers (ohne NULL Prüfung Zunge rausstrecken) zu...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 19.08.2009, 20:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 19.08.2009, 21:12    Titel: Antworten mit Zitat

vecs wird um die Größe des Deklarierten Datentypes erhöht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 20.08.2009, 08:01    Titel: Antworten mit Zitat

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 zwinkern
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
frebas



Anmeldungsdatum: 20.06.2008
Beiträge: 245

BeitragVerfasst am: 20.08.2009, 13:57    Titel: Antworten mit Zitat

In der Hilfe steht das die beiden ersten möglichkeiten gleich seien.

Zitat:
es wird vom Compiler auf dieselbe Art umgesetzt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 20.08.2009, 14:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 20.08.2009, 14:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2, 3
Seite 3 von 3

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz