Vector* Pointer Problem

Posted By: maslone1

Vector* Pointer Problem - 11/13/08 11:37

Hi!

Ich habe ein kleines aber störendes Problem mit Vector* Pointer. (Mit der Suchfunktion habe ich im Forum keine brauchbare Antwort gefunden.)

Folgendes Beispiel:

////////////////////////////////////////
function Shiff()
{
VECTOR* speed;

while(1)
{

my.speed += 10*time_step;

....
...
.
wait(1);
}}
////////////////////////////////////////

Dies nur zur Veranschauung...

Wenn ich diese Funktion nur einer Entity zuweise, gibts keine Probleme, weise ich jedoch diese Funktion x-beliebe Entitys zu,
dan taucht eine Fehlermeldung auf, die beschreibt, dass hier ein Pointer-Fehler vorliegt.
Kann mann Vector* nur global schreiben?
Dann müsste ich aber für jede Entity einen eigenen Vector* schrieben frown ....

Wenn ich nun die funktion so schreibe:
////////////////////////////////////////
function Shiff()
{
var speed[3];

while(1)
{

speed[1] += 10*time_step;

....
...
.
wait(1);
}}
////////////////////////////////////////
... funktionert das Programm ohne probleme. Egal ob ich nur einer Entity oder 100erten Entitys diese Funktion zuweise.

Gibt es nicht eine Möglichkeit auch Vector* lokal zu nutzen?
Ich möchte aus "optischen" gründen nicht var-arrays verwenden.

Danke für Eure Antworten!

Cheers
Marcel
Posted By: Hazardos

Re: Vector* Pointer Problem - 11/13/08 11:53

lite-c stellt leider nur 64 Vektoren zur Verfügung, daher wirst du um dreidimensionale variablen nicht herumkommen. Problem ist der gleichzeitige Zugriff jeder Funktion auf eben die verfügbaren Vektoren, daher die Fehlermeldung.
Ich hatte damit auch Probleme und musste die vec_rotate-Funktion komplett neu schreiben, damit ich keine Vektoren verwenden muss.

Gruß, Jörn
Posted By: MMike

Re: Vector* Pointer Problem - 11/13/08 12:05

hey marcel., i did not know you could use vector* and then my.speed.. seams a little odd.
Posted By: Uhrwerk

Re: Vector* Pointer Problem - 11/13/08 14:20

Code:
function Shiff()
{ 
VECTOR* speed;

while(1)
{

my.speed += 10*time_step;

....
...
.
wait(1);
}}


Also das mit den 64 Vektoren vergiss bitte, das ist Blödsinn. Dein Irrtum ist folgender: Wenn Du VECTOR* schreibst deklarierst Du damit nur einen Pointer auf einen Vector. Sonst nichts. Wenn Du dann my.speed schreibst greifst Du auf irgendeinen Entity skill zu und nicht auf den deklarierten Vector Pointer. Wenn Du wirklich einen eigenen Vektor haben willst musst Du VEKTOR myvektor; schreiben. Dann kannst Du mit myvektor.x = 1337; darauf zugreifen
Posted By: maslone1

Re: Vector* Pointer Problem - 11/13/08 19:34

oh sorry!
Hab hier mist geschrieben (in der eile passiert sowas...)

Den Vector* speed hab ich natürlich weiter per speed.x verwendet. Trotzallem,... hier funktioniert der Code nicht. Pointer-Fehler.

Auch wenn ich es über eine struktur-pointer verwende, passiert das gleiche?.... Außer, wie bereits beschrieben, ich verwende die var-arrays.

(Der Code ist vom grundprinzip so wie von dir beschrieben Uhrwerk,.. danke dass du mich auf meinen SCHWEREN flüchtgkeitsfehler aufmerksam gemacht hast.)


Gibts hier Lösungsansätze?

Posted By: maslone1

Re: Vector* Pointer Problem - 11/13/08 19:37

Hey mike! Yes, you are right! I just wanted to test you wink
i dont know why i wrote this sh.. . maybe the alcohol is the reason.... smile
Posted By: Uhrwerk

Re: Vector* Pointer Problem - 11/13/08 21:16

Originally Posted By: maslone1
danke dass du mich auf meinen SCHWEREN flüchtgkeitsfehler aufmerksam gemacht hast.

Aber gerne doch. :P Lösungsansätze gibt es auch. Du musst den Pointer initialisieren.
Code:
VECTOR* speed = malloc(sizeof(VECTOR));
memset(speed,0,sizeof(VECTOR));

// do whatever you want with the speed vector.

free(speed);

Posted By: maslone1

Re: Vector* Pointer Problem - 11/14/08 09:52

Uhrwerk.... du bist mein HELD!

Der größte Held, gleich nach Super- und Spiderman!

Danke vielmals!
Ich werde es heute abend testen...
Posted By: Uhrwerk

Re: Vector* Pointer Problem - 11/14/08 15:03

Originally Posted By: maslone1
Der größte Held, gleich nach Super- und Spiderman!


*lol* Da kommen schon die ersten Einschränkungen... ;-)
Posted By: maslone1

Re: Vector* Pointer Problem - 11/14/08 17:44

Hallo Uhrwerk!

Nochmals danke für Deine Hilfe.

Keine Sorge, du gehörst jetzt zu den top 3 Super-Hero's!! wink

Ich werd jetzt mal dein codebeispiel testen.
Und versuchen zu verstehen was es mit sizeof und memset sowie dem free() auf sich hat.....


thanx
Posted By: maslone1

Re: Vector* Pointer Problem - 11/14/08 17:49

...... WOOOOOOW MAN!!!!!

Das funktioniert ja wie geschmiert!

Jetzt bist du glatte 2 Plätze nach oben gerutscht (in der Hero-Reihung -> Platz 1).

Danke nochmals!

Wenn du eventuell so gütig wärst mir kurz zu beschreiben was es mit memset() und free() auf sich hat.

Klar, initialisieren.... aber was machen diese beiden funktionen im detail??

thanx a lot
Marcel
Posted By: Uhrwerk

Re: Vector* Pointer Problem - 11/14/08 18:48

Also wenn Du VECTOR* schreibst definierst Du damit einen Pointer auf einen Vektor. Mehr nicht. Der Pointer zeigt irgendwo hin, also mit Sicherheit irgendwo dahin wo er besser nicht hinzeigen sollte. Daher sollte man Pointer immer initialisieren. Zum Beispiel mit
Code:
VECTOR* myvector = NULL;

Jetzt hast Du also einen Pointer der auf NULL zeigt. Jetzt hätte man ja aber gerne einen Pointer, der auf was Sinnvolles zeigt, also einen Vektor, den man dann auch verwenden kann. Dafür ist malloc da. Mallox reserviert so viele Bytes auf dem Heap, wie Du als Parameter übergibst. Jetzt hättest Du ja gerne soviel Speicher, wie ein Vektor benötigt. Das sind 12 Bytes. Da es aber nicht unbedingt bequem ist die Byte Größe von allen möglichen Datentypen im Kopf zu haben kann man hier den sizeof Opereator benutzen. Der gibt die Größe des übergebenen structs in Bytes zurück.
Code:
VECTOR* myvector = malloc(sizeof(VECTOR));

gibt also einen Pointer zurück, der auf soviele freie Bytes auf dem Heap zeigt, wie Vektor groß ist. Nächstes Problem: Was an der Speicherstelle mit den 12 Bytes, die Du jetzt reserviert hast steht ist rein zufällig. Deswegen sollte man den allokierten Speicher initialisieren. memset schreibt schreibt an die Stelle des ersten Parameters soviele Bytes wie im dritten Parameter angegeben. Geschrieben wird jeweils der zweite Parameter.
Code:
memset(myvector,0,sizeof(VECTOR));

schreibt also dahin wo myvector zeigt sizeof(VECTOR) (also wieder 12) 0en.
Du kannst das gleich auch mit
Code:
vec_set(myvector,nullvector);

oder mit
Code:
vec_fill(myvector,0);

oder mit
Code:
myvector->x = 0;myvector->z = 0;myvector->y = 0;

erreichen, memset ist aber die schnellste Variante.

Bleibt noch free übrig. Wenn Du den Vektor nicht mehr brauchst und die entsprechende Funktion verlässt, kannst Du myvector ja nicht mehr ansprechen weil Du den Gültigkeitsbereich der Variablen verlässt. Die 12 reservierten Bytes lungern aber trotzdem noch im Hauptspeicher rum, obwohl Du sie nicht mehr gebrauchen kannst. Das nennt man ein "Memory Leak". Mit free(myvector); erreichst Du, dass die 12 Bytes wieder zurück an das Betriebssystem übergeben werden und dann wieder als freier Speicher gelten. Danach darfst Du sie nicht mehr benutzen, versteht sich.

Eine noch einfachere Lösung ist einfach
Code:
VECTOR myvector;

zu schreiben. Dann kannst Du dir malloc und free sparen, allerdings landet der von dem Vektor reservierte Speicher auf dem Stack und nicht mehr auf dem Heap, was meistens ungünstiger ist. Einfach mal bei Bedarf nach Heap + Stack googlen.

Quote:
Jetzt bist du glatte 2 Plätze nach oben gerutscht (in der Hero-Reihung -> Platz 1).

*lol* Ich glaub ich mach nen Screenshot und nehm das als Desktop Hintergrund. Besser als Spiderman, wie cool ist das denn? ;-)
Posted By: maslone1

Re: Vector* Pointer Problem - 11/14/08 19:03

Sag ich doch, den Platz Nr. 1 hast du dir eindeutig verdient!

Du hast es jetzt so gut erklärt, dass selbst so'n Blödi wie ich es kapiert hat wink

Vielen vielen Dank! Jetzt sieht mein Code gleich viel besser aus, danke dir!!!!
© 2024 lite-C Forums