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  Weiter
 
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
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 16.08.2009, 15:43    Titel: Antworten mit Zitat

Vielen Dank für die Links
_________________
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
nemored



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

BeitragVerfasst am: 16.08.2009, 16:28    Titel: Antworten mit Zitat

Code:
yrot = ( direction.y < 0 ) ? 180 : 0

ginge übrigens auch mit
Code:
yrot = iif(direction.y < 0, 180, 0)

_________________
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: 16.08.2009, 18:26    Titel: Antworten mit Zitat

Erst einmal danke für die gute und schnelle Hilfe hier.

Ich muß nochmal einen Schritt zurück gehen zu diesem Construct hier:

Code:
struct CtsxTxmx3f
{
    float matrix[3][4];
};


Übersetzt nach FB hab ich das so:

Code:
Type CtsxTxmx3f
   matrix(0 To 3-1, 0 To 4-1) As Single
End Type


Soweit so gut. Nun gibt es in einem Beispielprogramm die Situation das eine Variable dieses Typs angelegt und gleichzeitig mit Variablen gefüllt wird:

Code:
static CtsxTxmx3f wdgSampleTrans = {
   0.17398f, 0.0f,      0.0f,       0.0f,
   0.0f,     0.190981f, 0.0f,       0.0f,
   0.0f,     0.0f,      0.0744249f, 0.0308843f
};


Die Frage lautet: Wie muß das exakt übersetzt werden. Im Typ steht ja ein Array drinne. Alle Versuche, selbst mit nem Constructor, fruchten bei mir nicht - anscheinend hab ich das System noch nicht ganz verinnerlicht.
_________________
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: 16.08.2009, 18:29    Titel: Antworten mit Zitat

Code:
dim as CtsxTxmx3f wdgSampleTrans = {_
(0,0,0,0), _
(0,0,0,0), _
(0,0,0,0) _
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 16.08.2009, 18:35    Titel: Antworten mit Zitat

Also bei mir läuft das so nicht fehlerfrei durch
_________________
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
Jojo
alter Rang


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

BeitragVerfasst am: 16.08.2009, 18:36    Titel: Antworten mit Zitat

Mal noch ne allgemeine Frage dir mir grade eben bei meinem eigenen Code aufgekommen ist...

Ist das hier syntaktisch korrekt, also werden da wirklich alle Felder auf 0 gesetzt? Oder nur das erste?
Code:
BYTE cEffectMemory[MAX_CHANNELS][MAX_EFFECTS] = {0};

_________________
» 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
nemored



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

BeitragVerfasst am: 16.08.2009, 18:47    Titel: Antworten mit Zitat

Code:
dim as CtsxTxmx3f wdgSampleTrans = type<CtsxTxmx3f>({_
{0,0,0,0}, _
{0,0,0,0}, _
{0,0,0,0} _
})

Wie gesagt, TYPE-Funktion oder CONSTRUCTOR. (Außerdem die geschweiften Klammern beachten statt der runden zwinkern )
_________________
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
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 16.08.2009, 18:57    Titel: Antworten mit Zitat

@Jojo:
Es wird nur das letzte Feld des letzten Arrayeintrages auf 0 gesetzt...

So inetwa:
Code:
memset(&cEffectMemory, 0, sizeof(BYTE) * MAX_CHANNELS * MAX_EFFECTS
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 16.08.2009, 19:03    Titel: Antworten mit Zitat

Danke nemored - so funktioniert es.

Hab jetzt herausgefunden das es auch so geht:

Code:
Dim Shared wdgSampleTrans As CtsxTxmx3f = ( { {0.0f, 0.0f, 0.0f, 0.0f }, _
                                              {0.0f, 0.0f, 0.0f, 0.0f }, _
                                              {0.0f, 0.0f, 0.0f, 0.0f } } )

_________________
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
Jojo
alter Rang


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

BeitragVerfasst am: 16.08.2009, 19:30    Titel: Antworten mit Zitat

Hm klar, memset wäre durchaus ne Möglichkeit Autsch! - Hab das Verwechselt mit dem "resetten" von CHAR-arrays.
_________________
» 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
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 16.08.2009, 20:59    Titel: Antworten mit Zitat

Und da schreibe ich eigentlich gar keinen C-Code *stichel-stichel*
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 16.08.2009, 21:50    Titel: Antworten mit Zitat

C ist ja auch nicht C++ Zunge rausstrecken Und C++ hat tolle strings, die mehr können als FB-Strings! Zunge rausstrecken (std::string != char array)
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.


Zuletzt bearbeitet von Jojo am 17.08.2009, 00:09, insgesamt 2-mal bearbeitet
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: 16.08.2009, 22:13    Titel: Antworten mit Zitat

So, ich unterbreche euch nur ungern zwinkern aber ich hab schon wieder die nächste Frage. Erstmal der C++ Code:

Code:
static void GetBoundingBox(tsxPOLYHEDRON *obj, CtsxBBox3f *bBox)
{
    int          numvecs = tsxPolyhGetNbrVxs(obj);
    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++;
        }
    }
}


Mich verunsichert insbesondere diese Zeile:
Code:
bBox->minbounds = bBox->maxbounds = *vecs++;


Wird da nun der Pointer oder der Inhalt auf den der Pointer verweist erhöht?

Gleiche Frage - sozusagen das Gegenstück dazu hier:
Code:
vecs++;


????

Ich möchte noch anmerken das CtsxVector3f eine Structur mit folgendem Aufbau ist:

Code:
struct CtsxVector3f
{
    float x, y, z;
};


Vielen Dank schonmal und btw - ihr seid spitze.
_________________
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
nemored



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

BeitragVerfasst am: 16.08.2009, 22:34    Titel: Antworten mit Zitat

Laut Prioritätenordnung müsste ++ stärker binden als die Zeigerreferenzierung, also wird nicht der Pointer erhöht (würde mich auch wundern), sondern der Inhalt.

Besitzt der Typ eine Überladung für Addition?
_________________
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: 16.08.2009, 22:40    Titel: Antworten mit Zitat

Tja, da bin ich überfragt - ist halt C++ Code. Aber ich würde meinen ja.
_________________
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
Jojo
alter Rang


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

BeitragVerfasst am: 17.08.2009, 00:09    Titel: Antworten mit Zitat

vecs ist ja ein pointer, deswegen wird der inhalt erhöht. ohne Stern würde der Pointer erhöht.
_________________
» 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: 17.08.2009, 13:02    Titel: Antworten mit Zitat

So, es geht weiter. Folgendes Problem. Es gibt hier einige ineinanderverschachtelte Strukturen - also ich hoffe ihr kommt damit klar. Ich zeige erst einmal den (vereinfachten) Code:
Code:
Function MyApplyMove Cdecl( viewparam As CtsxViewParam Ptr ) As tsxErr

Dim axes As CtsxAxes3f

axes.xaxis = viewparam->axes.xaxis   '<--- FEHLER

End Function


Bis hierhin konnte ich den Fehler eingrenzen. Dieser äußert sich dadurch das das Programm einfach abstürzt.

Nun noch die Strukturen:
Code:
Type CtsxVector3f
   x As Single
   y As Single
   z As Single
End Type

'' Specifying axes.
Type CtsxAxes3f
   xaxis As CtsxVector3f   ''Unit vector specifying orientation of Model's X axis.
   yaxis As CtsxVector3f   '' ... Y ...
   zaxis As CtsxVector3f   '' ... Z ...
End Type

Type CtsxViewParam
   axes As CtsxAxes3f
   origin As CtsxVector3f
   viewnum As Integer
End Type


So, ich habe vermutet das die Übergabe scheitert weil hier ja versucht wird die ganze Strukture per "=" zuzuweisen.

Also habe ich das aufgedöselt hier mal das Beispiel für x:
Code:
axes.xaxis.x = viewparam->axes.xaxis.x


Aber auch das klappt nicht, das Programm schmiert ab. Compiliert wird es anständig (ok, wird die obige Variante auch - deswegen war es recht schwierig den Fehler einzugrenzen).

Kann mir jemand sagen was ich falsch mache?
_________________
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
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 17.08.2009, 13:36    Titel: Antworten mit Zitat

Ich habe deine Programmschnipsel in ein kleines Programm zusammengefügt (und teilweise leicht abgeändert), welches einwandfrei funktioniert:
Code:

Type CtsxVector3f
   x As Single
   y As Single
   z As Single
End Type

'' Specifying axes.
Type CtsxAxes3f
   xaxis As CtsxVector3f   ''Unit vector specifying orientation of Model's X axis.
   yaxis As CtsxVector3f   '' ... Y ...
   zaxis As CtsxVector3f   '' ... Z ...
End Type

Type CtsxViewParam
   axes As CtsxAxes3f
   origin As CtsxVector3f
   viewnum As Integer
End Type

Declare Function MyApplyMove Cdecl( viewparam As CtsxViewParam Ptr ) As Integer


Function MyApplyMove Cdecl( viewparam As CtsxViewParam Ptr ) As Integer
  Dim axes As CtsxAxes3f
  axes.xaxis = viewparam->axes.xaxis
  return 1
End Function


MyApplyMove(New CtsxViewParam)
'MyApplyMove(0)  '<-- So stürzt das Programm natürlich ab.

sleep


Den einzigen Grund den ich mir vorstellen könnte der für das Abstürzen des Programmes an dieser Stelle sinnvoll wäre, wäre die Übergabe eines Null-Pointers anstatt einem Pointer zu einer CtsxViewParam Struktur.
(So wie die auskommentierte Zeile "MyApplyMove(0)")

Dadurch wäre es vl. sinnvoll, wenn du in der Funktion den Pointer überprüfst und ggf. einen Fehler zurückgibst:
Code:
Function MyApplyMove Cdecl( viewparam As CtsxViewParam Ptr ) As Integer
  Dim axes As CtsxAxes3f
  if viewparam = 0 then return FEHLERCODE
  axes.xaxis = viewparam->axes.xaxis
  return 1
End Function

_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
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, 13:48    Titel: Antworten mit Zitat

Ich danke dir vielmals. Dann war also nur mein Testprogramm blöd ausgedacht. Der Quellcode selbst ist demnach i.O.
_________________
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: 17.08.2009, 15:36    Titel: Antworten mit Zitat

Und schon muß ich euch wieder quälen zwinkern Ich werd hier noch bekloppt ...

An folgendem Punkt stürzt mein Programm jetzt ab:
Code:
Dim txmx As CtsxTxmx3f
If tsxPolyhGetVxTxmx( wdgsparent, @txmx ) Then


Der originale C++ Header deklariert die Funktion so:
Code:
TSXAPIFN CtsxTxmx3f* tsxPolyhGetVxTxmx( tsxPOLYHEDRON* pPolyh, CtsxTxmx3f* pTxmx ); //ptr to Txmx where result is copied.


und übersetzt hab ich sie so:
Code:
Declare Function tsxPolyhGetVxTxmx Alias "tsxPolyhGetVxTxmx" (ByVal pPolyh As tsxPOLYHEDRON Ptr, ByRef pTxmx As CtsxTxmx3f Ptr ) As CtsxTxmx3f Ptr


Die SDK Dokumentation sagt übrigens folgendes zu dieser Funktion:

Zitat:
tsxPolyhGetVxTxmx

PURPOSE Get the Vertex Transformation Matrix. Returns pTxmx, if valid operation. Note:
This matrix includes scaling and shearing terms, so it is not guaranteed to be orthogonal. Use
`tsxUnMatrix3f' before inverting.

SYNTAX TSXAPIFN CtsxTxmx3f* tsxPolyhGetVxTxmx(tsxPOLYHEDRON* pPolyh,
CtsxTxmx3f* pTxmx)

PARAMETERS
pPolyh tsxPOLYHEDRON*: a pointer to the polyhedron
pTxmx CtsxTxmx3f*: ptr to Txmx where result is copied.

RETURNS CtsxTxmx3f*


Insgesamt sind sämtliche Funktionsaufrufe etwas bescheiden, da sie eigentlich das Ergebnis einer Funktion nicht direkt zurück geben, sondern einen (oder mehrere) übergebenen Parameter verändern.

Da es sich bei der LIB um eine C Lib handelt, habe ich diese daher auch mit Extern "C" Lib "tsxapi" gekennzeichnet.

Der 2. Parameter den mein Funktionsaufruf enthält ( wdgsparent ) ist definitiv vorhanden. Er wird in einer weiteren Funktion die zuvor aufgerufen wird ebenfalls benötigt und diese Funktion arbeitet ordnungsgemäß.
_________________
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  Weiter
Seite 2 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