structpointer in skill

Posted By: Windy_dup1

structpointer in skill - 05/14/08 09:42

Hallo,

hab da mal eine Frage. Ich möchte in einem Skill von einem entity
einen pointer eines structs speichern. bekomme dies aber nicht hin.
Kann mir jemand schreiben, wie ich die folgenden Zeilen umändern muss?

--------------------------------
typedef struct KOOR_2D_STRUCT
{
var xx;
var yy;
} KOOR_2D_STRUCT;

function dies_geht(KOOR_2D_STRUCT *zeiger)
{
zeiger.xx = 99;
}

action spieler()
{
KOOR_2D_STRUCT koor;
koor.xx = 10;
koor.yy = 20;
dies_geht(&koor);
my.skill99 = &koor; // fehler
while(1)
{
wait(1);
}
}

function test(ENTITY *objekt)
{
KOOR_2D_STRUCT *koor;
koor = objekt.skill99; // fehler
}
------------------
danke im voraus
Posted By: Fenriswolf

Re: structpointer in skill - 05/14/08 10:16

Hallo,

dieser Versuch funktioniert nicht, weil du in deiner Action keinen Speicher für dein Struct alloziert hast:

KOOR_2D_STRUCT *koor = malloc(sizeof(KOOR_2D_STRUCT));
koor.xx = 10;
...
Posted By: Windy_dup1

Re: structpointer in skill - 05/14/08 11:13

In den oberen Skript ist mir ein fehler unterlaufen. Hatte versehntlich ein Sternchen gesetzt wo ich eigentlich keins hatte. Habe das Skript jetzt so umgeändert wie ich es auch benutze. Funktionen, die ich von innerhalb der action aufrufe und ihnen den struct mitgebe, funktionieren. Problem ist die übergabe an einen Skill und das spätere auslesen in der Funktion test().
Posted By: Fenriswolf

Re: structpointer in skill - 05/14/08 12:07

Wahrscheinlich liegt es daran, dass es ein lokales Struct ist.
Deklariere es mal als static:

static KOOR_2D_STRUCT koor;

Dadurch müsste es eigentlich funktionieren.
Posted By: Windy_dup1

Re: structpointer in skill - 05/14/08 13:03

Als static macht es keinen Sinn, da ich mehreren Entity's diese action zuweise und jede unterschiedliche struct-werte hat. Hintergrund ist, ich möchte eben über die Entity an diese werte kommen. Wenn das Problem von den lokalen Struct herkommt, würde es bei einer externen Funktion auch nicht klappen.
Posted By: Fenriswolf

Re: structpointer in skill - 05/14/08 14:57

Am Entityskill liegt es jedenfalls auch nicht, denn folgender Code

KOOR_2D_STRUCT *koor_ptr = my.skill99;
error(str_for_num(str_create("#8"), koor_ptr.yy));

liefert das korrekte Ergebis (20), wenn er direkt vor der while-Schleife in der action einegfügt wird.
Wenn diese Zeilen in einer Funktion stehen und diese in der Action aufgerufen wird, funktioniert es auch noch.
Wird die genannte Funktion jedoch außerhalb der Action aufgerufen (beispielsweise in der main nach Erzeugung der Entity), erhält man einen falschen Wert.
Posted By: Windy_dup1

Re: structpointer in skill - 05/14/08 15:26

Leider benötige ich diese Werte aber in einer externen Funktion, die ich über on_a = test(..); abrufen möchte. Ich gehe davon aus, dass ich etwas mit den Pointer falsch mache. Normalerweise teilt man dem Pointer ja mit auf was er zeigt. Nur kann ich bei einem Skill dies nicht. Ich vermute, dass hierin der Fehler liegt.

Danke noch einmal für Deine Mühe.
Posted By: Windy_dup1

Re: structpointer in skill - 05/19/08 19:27

Kann den wirklich keiner hier im Forum sagen was ich hier falsch mache? oder ist es grundsätzlich nicht richtig pointer in skill's zu speichern.
Posted By: HeelX

Re: structpointer in skill - 05/19/08 20:29

Vars sind vom typ long (schau mal in die acknex header!), daher caste deinen struct pointer von deinem Typ da auf void* und das wiederum auf long und speichere das im Skill.

Zum zurückholen einfach den wert des Skills auf nen Zeiger deines Typs da casten.
Posted By: Pappenheimer

Re: structpointer in skill - 05/19/08 20:35

Nicht, dass ich Ahnung vom Programmieren hätte, ich kann nur ein wenig C-Skript, deshalb verstehe ich auch nichts von structs, aber ich weiß nicht, ob man einen pointer überhaupt in einem Skill speichern kann.
Würde man nicht normalerweise einen handle im skill speichern und ihn dann an einen Pointer übergeben? (ptr_for_handle) Oder ist ein struct einem handle vergleichbar?

(Manchmal gibt einem ja eine dumme Frage eine Idee! wink )
Posted By: Joey

Re: structpointer in skill - 05/19/08 20:39

man kann einen pointer zu var casten, also auch in einem skill speichern. dein fehler ist, dass du die variable lokal anlegst. du musst den speicher mit malloc alloziieren (steht irgendwo oben).

joey.
Posted By: HeelX

Re: structpointer in skill - 05/19/08 21:42

@Pappenheimer

Hm, son Pointer is nix anderes als ne Adresse... ne Zahl. Muss man nur sauber "runterbrechen" weil C-Script bzw. Lite-C mit den vars als Skills aufgrund der fixed Geschichte zickig sein kann. In C-Script kannst auch direkt auf var's direkt BMAP's, SOUND's, STRING's, ENTITY's usw erstellen.. kratzt keinen. Kannst dann son Kram wie

Code:
my.skill1 = str_create("#128");
str_cpy(my.skill1, "15 bit Regenbogen");
error(my.skill1);


machen was ganz nett ist. In Lite-C muss man aber da schon besser aufpassen.
Posted By: Joey

Re: structpointer in skill - 05/23/08 11:15

müsste in lite-c auch gehen. es gibt keine 31-bit-variablen soweit ich weiß. oder glaubt ihr, dass der c-compiler das erste bit absichtlich abschneidet? ich hab das ehrlich gesagt in lite-c noch nie versucht, dafür benutze ich immer hashmaps mit dem entitypointer als key.
© 2024 lite-C Forums