0 registered members (),
16,302
guests, and 5
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Wrong Values/Falsche Werte
#235872
11/10/08 16:53
11/10/08 16:53
|
Joined: Aug 2003
Posts: 127 Berlin, Germany
CHaP
OP
Member
|
OP
Member
Joined: Aug 2003
Posts: 127
Berlin, Germany
|
Hey !! Schaut mal bitte auf den Quellcode und dann den Screenshot. Achtet auf die Variablen.
////////////////////////////////////////////////////////////////////////////////////
float g_CameraMode = 0;
float g_CameraPan = 0;
float g_CameraTilt = 0;
float g_CameraHeight = 0;
float g_CameraDistance = 0;
float g_CameraTotalDistance = 0;
////////////////////////////////////////////////////////////////////////////////////
PANEL* pDebugCamera =
{
pos_x = 10;
pos_y = 10;
digits(0,0,"[DEBUG] CAMERA",fntArial12,1,NULL);
digits(0,15,"Mode: %f",fntArial12,1,g_CameraMode);
digits(0,30,"Pan: %f",fntArial12,1,g_CameraPan);
digits(0,45,"Tilt: %f",fntArial12,1,g_CameraTilt);
digits(0,60,"Height: %f",fntArial12,1,g_CameraHeight);
digits(0,75,"Distance: %f",fntArial12,1,g_CameraDistance);
digits(0,90,"Total Distance: %f",fntArial12,1,g_CameraTotalDistance);
flags = VISIBLE;
}
////////////////////////////////////////////////////////////////////////////////////
typedef struct
{
ENTITY* Pivot;
float Mode;
float Height;
float Tilt;
float Pan;
float Distance;
float TotalDistance;
} CAMERA;
////////////////////////////////////////////////////////////////////////////////////
function InitiateCamera(CAMERA* pCam)
{
pCam.Pivot = pPlayer;
pCam.Mode = 1;
pCam.Tilt = 15;
pCam.Pan = 0;
pCam.Height = 50;
pCam.Distance = 0;
pCam.TotalDistance = 400;
while(pCam)
{
// CalculatePosition(pCam);
// ManipulatePosition(pCam);
g_CameraMode = pCam.Mode;
g_CameraPan = pCam.Pan;
g_CameraTilt = pCam.Tilt;
g_CameraHeight = pCam.Height;
g_CameraDistance = pCam.Distance;
g_CameraTotalDistance = pCam.TotalDistance;
wait(1);
}
}
////////////////////////////////////////////////////////////////////////////////////
main()
{
...
CAMERA MyCam;
InitiateCamera(MyCam);
}
////////////////////////////////////////////////////////////////////////////////////
 ^^ ???? Kann mir das jemand erklären, warum die Variablen völlig andere Werte besitzen? Sieht mir irgendwie nach Definitionsbereich aus.
|
|
|
Re: Wrong Values/Falsche Werte
[Re: Lukas]
#235875
11/10/08 17:23
11/10/08 17:23
|
Joined: Aug 2003
Posts: 127 Berlin, Germany
CHaP
OP
Member
|
OP
Member
Joined: Aug 2003
Posts: 127
Berlin, Germany
|
Ahja, wobei ich sagen muss, wenn ich den Kommentar bei CalculatePosition() wegnehme, es den Anschein hat, als ob die Werte wirklich in diesem Bereich liegen bzw. in den Bereich kommen. Allerdings auch nur dann, sobald das ganze in einer while Schleife läuft. Wird die Funktion nur einmal aufgerufen, stimmt die Kamera Position. Wird sie in einer Schleife immer wieder aufgerufen, stürzt das Programm direkt nach wenigen Sekunden ab. Deshalb hab ich schnell das Debug Panel erzeugt, um zu schauen ob da der Fehler liegt. Hier mal die CalculatePosition() und ManipulatePosition() Funktionen:
////////////////////////////////////////////////////////////////////////////////////
function CalculatePosition(CAMERA* pCam)
{
pCam.Distance = (cos(pCam.Tilt) * pCam.TotalDistance);
vCamera.x = (pCam.Pivot.x - cos(pCam.Pan) * pCam.Distance);
vCamera.y = (pCam.Pivot.y - sin(pCam.Pan) * pCam.Distance);
vCamera.z = ((pCam.Pivot.z + sin(pCam.Tilt) * pCam.TotalDistance) + pCam.Height);
vCamera.pan = pCam.Pan;
vCamera.tilt = -(pCam.Tilt);
vCamera.roll = 0;
}
////////////////////////////////////////////////////////////////////////////////////
function ManipulatePosition(CAMERA* pCam)
{
pCam.Pan += (mickey.x * time_step);
pCam.Tilt += (mickey.y * time_step);
pCam.TotalDistance -= (mickey.z * time_step);
}
////////////////////////////////////////////////////////////////////////////////////
|
|
|
Re: Wrong Values/Falsche Werte
[Re: CHaP]
#235877
11/10/08 17:34
11/10/08 17:34
|
Joined: Jan 2002
Posts: 4,225 Germany / Essen
Uhrwerk
Expert
|
Expert
Joined: Jan 2002
Posts: 4,225
Germany / Essen
|
Ich würde Dir empfehlen einfach mal alle Variablen, die Du als float definiert hast als "fixed" oder "var" zu deklarieren.
Always learn from history, to be sure you make the same mistakes again...
|
|
|
Re: Wrong Values/Falsche Werte
[Re: Uhrwerk]
#235882
11/10/08 18:45
11/10/08 18:45
|
Joined: Aug 2003
Posts: 127 Berlin, Germany
CHaP
OP
Member
|
OP
Member
Joined: Aug 2003
Posts: 127
Berlin, Germany
|
Hier passiert irgendwas ganz, ganz komisches. Also ich habe jetzt nochmals die float's in var's gewandelt. Und jedesmal, wenn ich eine while-Schleife benutze, erhöhen/verändern sich die Werte bis das Programm abstürzt. Wie gesagt, float ist jetzt var und die Werte werden nich geändert. Die Funktionen Calculate und Manipulate werden ebenfalls nicht aufgerufen. Nach dem erzeugen des Camera Objektes, werden die Werte für Tilt = 15 und Pan = 0 übergeben und anschließend folgt die while Anweisung.
...
while(pCam)
{
g_CameraPan = pCam.Pan;
g_CameraTilt = pCam.Tilt;
wait(1);
}
...
Ergebnis: - Mit while führt zu Fehlerwerte (Pan und Tilt jeweils 400 [?!?!?]) - Ohne while stimmen die Werte Kann das sein, dass der Fehler wo ganz anders liegt? Vielleicht bei den Funktionen und dessen Parameter? Hab ich was falsch initialisiert? Können struct-Objekte per Pointer übergeben werden (So wie ich das tue)?
|
|
|
Re: Wrong Values/Falsche Werte
[Re: CHaP]
#235913
11/10/08 21:48
11/10/08 21:48
|
Joined: Aug 2003
Posts: 127 Berlin, Germany
CHaP
OP
Member
|
OP
Member
Joined: Aug 2003
Posts: 127
Berlin, Germany
|
Wie es scheint, liegt es an den Übergaben.
CAMERA MyCam;
...
function(MyCam);
Der Parameter wird jetzt an die Funktion übergeben und erstellt einen Zeiger aus dem MyCam Objekt:
function(CAMERA* pCam)
{
...
}
Und ab genau nach dem 2.Frame stimmt da irgendetwas nicht mehr.
Lasse ich die Übergabe zu einer anderen Funktion weg und erledige alles in einem Schritt, funktioniert es:
function fROOT_Init()
{
level_load("root.wmb");
wait(2);
Root_CreatePlayer();
CAMERA MyCam;
MyCam.Tilt = 15;
MyCam.Pan = 0;
MyCam.Height = 0;
MyCam.TotalDistance = 400;
MyCam.Pivot = pPlayer;
while(1)
{
MyCam.Distance = (cos(MyCam.Tilt) * MyCam.TotalDistance);
vCamera.x = (MyCam.Pivot.x - cos(MyCam.Pan) * MyCam.Distance);
vCamera.y = (MyCam.Pivot.y - sin(MyCam.Pan) * MyCam.Distance);
vCamera.z = ((MyCam.Pivot.z + sin(MyCam.Tilt) * MyCam.TotalDistance) + MyCam.Height);
vCamera.pan = MyCam.Pan;
vCamera.tilt = -(MyCam.Tilt);
vCamera.roll = 0;
MyCam.Pan += mickey.x;
MyCam.Tilt += mickey.y;
MyCam.TotalDistance -= mickey.z;
g_CameraPan = MyCam.Pan;
g_CameraTilt = MyCam.Tilt;
g_CameraTotalDistance = MyCam.TotalDistance;
wait(1);
}
// InitiateCamera(MyCam);
}
////////////////////////////////////////////////////////////////////////////////////
Aber es muss doch möglich sein, ein struct Objekt im Code hin und her schubsen zu können. Erzeuge ich das Objekt falsch?
|
|
|
Re: Wrong Values/Falsche Werte
[Re: CHaP]
#235921
11/10/08 22:26
11/10/08 22:26
|
Joined: Jan 2002
Posts: 4,225 Germany / Essen
Uhrwerk
Expert
|
Expert
Joined: Jan 2002
Posts: 4,225
Germany / Essen
|
Nein, Du solltest grundsätzlich immer nur Pointer auf structs übergeben. Ich werde aus deinem Code insofern nicht schlau, dass Du schreibst "function(CAMERA* pCam)". Was soll das sein? Es müsste "function yourfunctionname(CAMERA* pCam)" sein. Wenn Du dann ein CAMERA struct definierst wie zum Beispiel mit CAMERA MyCam, dann musst du an die Funktion einen Pointer übergeben. also zum Beispiel "myfunction(&MyCam);". Zudem solltest Du structs fast immer auf dem Heap erstellen und dazu malloc benutzen. Ich geb Dir hier mal ein einfaches Beispiel:
typedef struct MYCAMERA
{
int somedata;
}
void xyz(MYCAMERA* mc)
{
// Do something with the camera.
}
void main()
{
MYCAMERA* mycam = malloc(sizeof(MYCAMERA));
memset(mycam,0,sizeof(MYCAMERA)); // nicht notwendig aber immer eine gute Idee.
xyz(mycam);
}
Always learn from history, to be sure you make the same mistakes again...
|
|
|
Re: Wrong Values/Falsche Werte
[Re: Uhrwerk]
#235930
11/10/08 23:42
11/10/08 23:42
|
Joined: Aug 2003
Posts: 127 Berlin, Germany
CHaP
OP
Member
|
OP
Member
Joined: Aug 2003
Posts: 127
Berlin, Germany
|
Nein wie großartig!! Es funktioniert!! Ich danke dir vielmals!! Dein Beispiel hat mir direkt geholfen. Ich hab als einziges diese Zeile:
CAMERA MyCam;
angepasst zu:
CAMERA* MyCam = malloc(sizeof(CAMERA));
---------- Uhrwerk: Zudem solltest Du structs fast immer auf dem Heap erstellen und dazu malloc benutzen.
Prinzipiell immer oder nur bei bestimmten Vorhaben mit structs? Falls letzteres, auf was kommt's drauf an und warum?
|
|
|
Re: Wrong Values/Falsche Werte
[Re: CHaP]
#235945
11/11/08 02:13
11/11/08 02:13
|
Joined: Jan 2002
Posts: 4,225 Germany / Essen
Uhrwerk
Expert
|
Expert
Joined: Jan 2002
Posts: 4,225
Germany / Essen
|
Prinzipiell immer. Es gibt Ausnahmen, in denen es nötig / sinnvoll / besser ist sie auf dem Stack zu erstellen, aber die sind sehr selten. Konkret fällt mir jetzt nicht mal ein Beispiel ein.
Grundsätzlich gilt, dass größere Datenmengen, und das sind structs ja in der Regel, immer besser auf dem Heap aufgehoben sind. Es ist natürlich auch eine Frage der gewünschten Lebensdauer der Daten. Meistens ist diese Lebensdauer länger als der Scope einer Funktion und dann bleibt schon nur noch der Heap. Wenn Du einfach mal nach Heap und Stack googlest wirst Du Tonnen an Informationen zu dem Thema finden. Nicht vergessen den allokierten Speicher mit free später wieder freizugeben, sonst bekommst Du Memory leaks. Gute Angewohnheiten sind es ausserdem mit malloc / realloc allocierten Speicher immer mit memset(adresse,0,länge) zu initialisieren und nach dem Freigeben von Speicher mit free den entsprechenden Pointer auf NULL zu setzen. Kann einem im Zweifeslfall eine Menge Kopfschmerzen ersparen.
Always learn from history, to be sure you make the same mistakes again...
|
|
|
|