Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 16.08.2009, 16:43 Titel: |
|
|
Vielen Dank für die Links _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 16.08.2009, 17:28 Titel: |
|
|
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 |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 16.08.2009, 19:26 Titel: |
|
|
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 |
|
|
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 16.08.2009, 19:29 Titel: |
|
|
Code: | dim as CtsxTxmx3f wdgSampleTrans = {_
(0,0,0,0), _
(0,0,0,0), _
(0,0,0,0) _
} |
|
|
Nach oben |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 16.08.2009, 19:35 Titel: |
|
|
Also bei mir läuft das so nicht fehlerfrei durch _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 16.08.2009, 19:36 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 16.08.2009, 19:47 Titel: |
|
|
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 ) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 16.08.2009, 19:57 Titel: |
|
|
@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 |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 16.08.2009, 20:03 Titel: |
|
|
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 |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 16.08.2009, 20:30 Titel: |
|
|
Hm klar, memset wäre durchaus ne Möglichkeit - 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 |
|
|
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 16.08.2009, 21:59 Titel: |
|
|
Und da schreibe ich eigentlich gar keinen C-Code *stichel-stichel* |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 16.08.2009, 22:50 Titel: |
|
|
C ist ja auch nicht C++ Und C++ hat tolle strings, die mehr können als FB-Strings! (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, 01:09, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 16.08.2009, 23:13 Titel: |
|
|
So, ich unterbreche euch nur ungern 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:
????
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 16.08.2009, 23:34 Titel: |
|
|
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 |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 16.08.2009, 23:40 Titel: |
|
|
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 |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 17.08.2009, 01:09 Titel: |
|
|
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 |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 17.08.2009, 14:02 Titel: |
|
|
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 |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 17.08.2009, 14:36 Titel: |
|
|
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 |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 17.08.2009, 14:48 Titel: |
|
|
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 |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 17.08.2009, 16:36 Titel: |
|
|
Und schon muß ich euch wieder quälen 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 |
|
|
|