Suche: ds_map_find_key(id,value);

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Suche: ds_map_find_key(id,value);

      Ich habe eine Liste und eine Map. In der Liste sind die Keys der Map gespeichert, jetzt bekomme ich ein Value der Map herrein, und möchte überprüfen ob dies in der Map vorhanden ist.
      Ich habe es mit folgender Schleife gelöst, nur frage ich mich ob es nicht einen kürzeren Weg gibt.
      Ich bräuchte also den Befehl ds_map_find_key(id,value); aber den gibt es ja nicht.

      GML-Quellcode

      1. obj_Client.sort_id = buffer_read(buff_login,buffer_s32);
      2. obj_Client.sort_id_obj = 0;
      3. for(I = 0; I < ds_list_size(c_dl.all_objects_input_list); I++)
      4. { if(obj_Client.sort_id == ds_map_find_value(c_dl.all_objects_input_map, ds_list_find_value(c_dl.all_objects_input_list, I)))
      5. { obj_Client.sort_id_obj = ds_list_find_value(c_dl.all_objects_input_list, I);
      6. }
      7. }


      Vielleicht weis ja jemand etwas an das ich nicht denke oder so :)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Balls of Steel ()

    • Also, du hast mit deiner Befürchtung schon recht, dass das herrlich ineffizient ist. Aber der Code gibt ja noch keinen so rechten Hinweis, was dich überhaupt dazu bewegt, das so zu lösen.

      Was genau hast du für eine Situation? Was für Daten willst du wie abspeichern buw. auslesen?
    • Danke für die Antwort :)

      Also der Client bekommt vom Server eine ID geschickt (z.B. 100001) Der Client überprüft ob er diese ID schon kennt.
      var_Prüfwert = ds_map_find_value(input_map, server_id);

      Wenn nein (var_Prüfwert == 0) legt er ein neues Objekt an welches die dazugehörigen werte bekommt.
      client_id = instance_create(x,y,client_obj);
      ds_map_add(input_map, server_id, client_id);

      Die server_id hat er ja geschickt bekommen, und die client_id hat er vom gerade erstellten Objekt.
      ds_list_add(input_list, server_id);
      Gleichzeitig ergänzt er eine Liste in der die IDs der Client Objekte gespeichert sind.

      Wenn ja (var_Prüfwert > 100000) legt er kein neues Objekt an sondern übergibt die Werte an das bereits vorhandene Objekt.

      for(i = 0; i < ds_list_size(input_list), i++)
      { client_id = ds_list_find_value(input_list, i);
      ...weiterverarbeitung mit Hilfe der client_id...
      }


      Hmm... irgenwie kommt es mir jetzt ganz einfach vor und ich frage mich was da gestern Nacht in meinem Kopf los war... ok, es war auch mal wieder nach Mitternacht.
      Eigentlich müsste es wie nachfolgend auch gehen. Werde das mal prüfen sobald ich zuhause bin :)

      GML-Quellcode

      1. obj_Client.sort_id = buffer_read(buff_login,buffer_s32); // client_id wird gelesen
      2. obj_Client.sort_id_obj = ds_map_find_value(c_dl.all_objects_input_map, obj_Client.sort_id); // 0 wenn nicht vorhanden, > 100000 wenn vorhanden

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Balls of Steel ()

    • Ja, du hast dir die Frage gerade selbst beantwortet. ;)

      Der GM gibt zwar meines Wissens nach nie eine Instanz-Id von 0 aus, aber das liegt daran, dass diese für Objects reserviert ist. Falls sich irgendwann mal Object-Ids in deine Map verirren sollten, solltest du zur Sicherheit daher alle Werte um eins inkrementieren.
      Du könntest das ganze auf diese Funktionen reduzieren:

      GML-Quellcode

      1. ///ds_map_add_instance(map, key, id)
      2. // adds an instance id to the given map at the given map with the given key
      3. // returns if successful
      4. return ds_map_add(argument0, argument1, argument2 + 1);


      GML-Quellcode

      1. ///ds_map_find_instance(map, key)
      2. // returns the instance id found at key in map,
      3. // returns noone otherwise
      4. var v = ds_map_find_value(argument0, argument1);
      5. if (v == 0) {
      6. return noone;
      7. }
      8. else {
      9. return v - 1;
      10. }
      Alles anzeigen


      Der Vorteil liegt einerseits darin, dass du es schön gekapselt hast, andererseits aber den Wiedergabewert auch gefahrloser anderweitig verwenden kannst. Viele Funktionen, die eine Instance-Id nehmen, tun bei der Konstante noone nämlich gar nichts, anstatt die Instanz mit der Id 0 zu modifizieren. Die 0 zeigt dann leider auf alle Instanzen deines ersten Objects (sofern noch im Projekt vorhanden) und plötzlich hast du ganz spannende Fehler.
    • Benutzer online 1

      1 Besucher