Variable ändert sich, obwohl es nicht sein dürfte
Verfasst: 18.03.2010, 22:40
Auch wenn ich das Problem mit nem kleinen Trick umgehen konnte, würde es mich schon interessieren, warum es so passiert ist, wie es ist.
Ich arbeite gerade an einem Inventarbereich. Wenn man nun eine Waffe anwählt und auf "Waffe anlegen" klickt wird die Funktion waffe_wechseln aufgerufen. Hier wird die Waffe, die man in der Hand hat in das Inventar zurückgelegt und die neue vom Inventar entfernt und in die Hand genommen.
Jetzt würde ich erwarten, das die beiden char-Arrays "character.waffe.objektname" und "name" unverändert bleiben. "character.waffe.objektname" tut das auch, jedoch ändert sich "name".
Die Ausgabe ist also:
Der Vollständigkeit halber hier noch mal der Code von inventar.add:
Ich arbeite gerade an einem Inventarbereich. Wenn man nun eine Waffe anwählt und auf "Waffe anlegen" klickt wird die Funktion waffe_wechseln aufgerufen. Hier wird die Waffe, die man in der Hand hat in das Inventar zurückgelegt und die neue vom Inventar entfernt und in die Hand genommen.
Code: Alles auswählen
void waffe_wechseln(char name[256])
{
[...]
messageboxEx("Alter Objname: %s Neuer Name: %s",character.waffe.objektname,name);
//Alte Waffe dem Inventar hinzufügen
inventar.add(character.waffe.objektname);
messageboxEx("Alter Objname: %s Neuer Name: %s",character.waffe.objektname,name);
[...]
}
Die Ausgabe ist also:
Da ich bei inventar.add(char obj_name[256]) ja nur einen char Array und keine Zeiger übergebe und auch nicht auf eine Variable "name" zugreife, dürfte sich doch nichts ändern, oder seh ich das falsch?1. Aufruf MessageboxEx: Alter Objname: Schwert Neuer Name: Axt
2. Aufruf MessageboxEx: Alter Objname: Schwert Neuer Name: Schwert
Der Vollständigkeit halber hier noch mal der Code von inventar.add:
Code: Alles auswählen
void inventar_manager::add(char obj_name[256])
{
//Gibt es Item schon?
for(int i=0;i<num_items;i++)
{
if(strcmp(obj_name,this->items[i].name)==0)
{
this->items[i].anzahl++;
this->RebuildVarlist();
return;
}
}
//Es befindet sich das Item noch nicht im Inventar
//Freien Slot suchen
int aktl_slot=-1;
for(int i=0;i<num_items;i++)
{
if(this->items[i].anzahl<=0)
{
aktl_slot=i;
break;
}
}
//Item hinzufügen
if(aktl_slot==-1)
{
this->num_items++;
this->items=(item *) realloc(this->items,num_items*sizeof(item));
aktl_slot=num_items-1;
}
sprintf(this->items[aktl_slot].name,obj_name);
this->items[aktl_slot].anzahl=1;
this->RebuildVarlist();
}