Avatar billede bjering Nybegynder
30. august 2004 - 20:13 Der er 11 kommentarer og
1 løsning

Memory management (ala java's hashmap, array)

Hejsa alle sammen, nu har jeg sat og rodet en del med java (i eclipse), og vil så over og legge lidt mere med c++, så løber jeg ind i et mindre problem.

I java, for at gemme data i memory, og hente data baseret på en unik ID gjorde jeg sådan her, meget nemt.

--- JAVA ---
public class LevelUpData
{
    private static Logger _log = Logger.getLogger(LevelUpData.class.getName());
   
    private static LevelUpData _instance;
   
    private HashMap _lvltable;
   
    public static LevelUpData getInstance()
    {
        if (_instance == null)
        {
            _instance = new LevelUpData();
        }
        return _instance;
    }
   
    private LevelUpData()
    {
        _lvltable = new HashMap();
        LineNumberReader lnr = null;
        try
        {
            File spawnDataFile = new File("data/lvlupgain.csv");
            lnr = new LineNumberReader(new BufferedReader( new FileReader(spawnDataFile)));
           
            String line = null;
            while ( (line=lnr.readLine()) != null)
            {
                if (line.trim().length() == 0 || line.startsWith("#"))
                {
                    continue;
                }

                L2LvlupData lvlupData = parseList(line);
                _lvltable.put(new Integer(lvlupData.getClassid()), lvlupData);
            }

            _log.config("created " + _lvltable.size() + " Lvl up data templates");
        }
        catch (FileNotFoundException e)
        {
            _log.warning("lvlupgain.csv is missing in data folder");
        }
        catch (Exception e)
        {
            _log.warning("error while creating npc data table "+e);
        }
        finally
        {
            try
            {
                lnr.close();
            }
            catch (Exception e1)
            {
                // ignored
            }
        }
    }

    private L2LvlupData parseList(String line)
    {
        StringTokenizer st = new StringTokenizer(line,";");
       
        L2LvlupData lvlDat = new L2LvlupData();
        lvlDat.setClassid(Integer.parseInt(st.nextToken()) );
        lvlDat.setDefaulthp(Double.parseDouble(st.nextToken()) );
        lvlDat.setDefaulthpadd(Double.parseDouble(st.nextToken()) );
        lvlDat.setDefaulthpbonus(Double.parseDouble(st.nextToken()) );
        lvlDat.setDefaultmp(Double.parseDouble(st.nextToken()) );
        lvlDat.setDefaultmpadd(Double.parseDouble(st.nextToken()) );
        lvlDat.setDefaultmpbonus(Double.parseDouble(st.nextToken()) );

       
        return lvlDat;
    }
   
    /**
    * @param template id
    * @return
    */
    public L2LvlupData getTemplate(int classId)
    {
        return (L2LvlupData) _lvltable.get(new Integer(classId));
    }
}

----- getter og setter -----
public class L2LvlupData
{
    private int _classid;
    private double _defaulthp;
    private double _defaulthpadd;
    private double _defaulthpbonus;
    private double _defaultmp;
    private double _defaultmpadd;
    private double _defaultmpbonus;

   
   
    /**
    * @return Returns the classid.
    */
    public int getClassid() {
        return _classid;
    }
    /**
    * @return Returns the defaulthp.
    */
    public double getDefaulthp() {
        return _defaulthp;
    }
    /**
    * @return Returns the defaulthpadd.
    */
    public double getDefaulthpadd() {
        return _defaulthpadd;
    }
    /**
    * @return Returns the defaulthpbonus.
    */
    public double getDefaulthpbonus() {
        return _defaulthpbonus;
    }
    /**
    * @return Returns the defaultmp.
    */
    public double getDefaultmp() {
        return _defaultmp;
    }
    /**
    * @return Returns the defaultmpadd.
    */
    public double getDefaultmpadd() {
        return _defaultmpadd;
    }
    /**
    * @return Returns the defaultmpbonus.
    */
    public double getDefaultmpbonus() {
        return _defaultmpbonus;
    }
    /**
    * @param classid The classid to set.
    */
    public void setClassid(int classid) {
        _classid = classid;
    }
    /**
    * @param defaulthp The defaulthp to set.
    */
    public void setDefaulthp(double defaulthp) {
        _defaulthp = defaulthp;
    }
    /**
    * @param defaulthpadd The defaulthpadd to set.
    */
    public void setDefaulthpadd(double defaulthpadd) {
        _defaulthpadd = defaulthpadd;
    }
    /**
    * @param defaulthpbonus The defaulthpbonus to set.
    */
    public void setDefaulthpbonus(double defaulthpbonus) {
        _defaulthpbonus = defaulthpbonus;
    }
    /**
    * @param defaultmp The defaultmp to set.
    */
    public void setDefaultmp(double defaultmp) {
        _defaultmp = defaultmp;
    }
    /**
    * @param defaultmpadd The defaultmpadd to set.
    */
    public void setDefaultmpadd(double defaultmpadd) {
        _defaultmpadd = defaultmpadd;
    }
    /**
    * @param defaultmpbonus The defaultmpbonus to set.
    */
    public void setDefaultmpbonus(double defaultmpbonus) {
        _defaultmpbonus = defaultmpbonus;
    }
}

----

okay, det den gjorde (denne her om ikke andet), var at hente alle linier ind fra en fil, og så gemme den i memory, så kunne man super hurtig hente noget fra memory med

LvlupData data = new L2LvlupData.getTemplate(id)

så kunne man få adgang til at guffet deri med (f.eks)

double hp = data.getDefaulthp();

ville have feltet hp, fra filen, taget fra ID (uniq) sted.

MEN, hvordan kan man gøre noget ligende i visual c++ 6 ?
jeg har prøvet lidt forskelligt og søgt på nettet, men det bedste svar jeg kunne finde var..

det kan man ikke bare lige sådan (nemt som java), man skulle selv til at skrive hashmap's og array definationer osv osv, lød som om man næsten skulle skrive hele windows om på dem.

er der ikke en "easy" metode til at gøre det ?

jeg skal bruge det til en winsock application jeg er ved at lave, den skal så have

socket (den brugeren er på, som den unique id)
key1 (encrypt key)
key2 (encrypt key)
key3 (encrypt key)
key4 (encrypt key)
ip (clienten)
username (clienten)

nogen ide'er ?
Avatar billede bertelbrander Novice
30. august 2004 - 20:30 #1
Uden at kende til jaa vil jeg tro at det er std::map eller std::multimap du er ude efter:

http://www.cppreference.com/cppmap.html
Avatar billede bjering Nybegynder
30. august 2004 - 20:52 #2
hmm, er det mulig med std::map at added data senere til samme id

jeg mener, server starter op, en connecter, jeg smider så

socket->id(map)
clientip->ip(map)

senere hen i programmet, kan jeg så added

name->username(map) where id = socket

du ved hvad jeg mener, har svært ved at forklare det hehe..

man kan opdatere indholdet af mappen som det passer en (altså ændre en ting uden at skulle ændre hele map).
Avatar billede bertelbrander Novice
30. august 2004 - 20:58 #3
Jeg er ikke sikker på at jeg ved hvad du mener.

En map mapper et id til nogle data. Man kan f.ex. mappe en int til en streng eller mappe en int med et array af f.ex. int's

Ved den sidste metode kan man tilføje/fjerne til arrayet for en given int (id) som man ønsker. Man kan altid tilføje/fjerne entries i mappern.

En std::map er et binært træ af arbitrære data.
Avatar billede bjering Nybegynder
30. august 2004 - 21:04 #4
hum okay, vil lige kigge lidt rundt efter nogle eksempler på nogle std::map ala hvad jeg skal bruge, for at se om det er det jeg kan bruge.
Avatar billede arne_v Ekspert
30. august 2004 - 21:06 #5
Her er et super simpelt eksempel jeg tidligere har postet her:

#include <iostream>
#include <map>
#include <string>

using namespace std;

struct my
{
  string s;
};

int main()
{
  map<int,struct my> m;
  struct my test;
  test.s = "abc";
  pair<int,struct my> p(123,test);
  m.insert(p);
  string s = m[123].s;
  cout << s << endl;
  return 0;
}
Avatar billede arne_v Ekspert
30. august 2004 - 21:08 #6
Java HashMap = STL map
Java ArrayList = STL vector
Java LinkedList = STL list
Avatar billede bjering Nybegynder
30. august 2004 - 22:23 #7
tak arne, det forklarer en del, jeg kan forstå det meste af din eksempel, har lige en eller 2 spørgsmål dog..

du har din struct, det fatter jeg.

så map<int,struct my> m;
siger det er en map, og den skal indeholde:
int = key (?)
data fra struct my
og den skal kaldes m (for at smide ind i den med m.)

struct my test; er bare for at man kan smide data i structuren med test.
test.s = "abc"; hvad string s skal indeholde

pair<int,struct my> p(123,test); ??? den her ved jeg ikke liige hvad gør,

smider den 123 som key(?) og alt efter det (structure my kaldet test) ind som data i din map?

m.insert(p); smid det du har lavet (?) ind i mappen (gjorde vi ikke lige det før eller?)
string s = m[123].s; hente din data out, hvor key = 123, fra structuren ind i s

resten er simpel, skriver bare hvad der er i s på skærmen
Avatar billede bertelbrander Novice
30. august 2004 - 22:43 #8
m er en instans af mappen, int'en er key (eller ->first) og my er data (eller ->second)
test er en instans af stuct'en my
test.s sættes til at være strengen "abc"
en map indholder pair's (af first/key, second/data) p er et sådan par
disse indsættes i mappen m med insert
m[123] er parret med nøgle 123
Avatar billede bjering Nybegynder
30. august 2004 - 22:49 #9
okay tror jeg har fået det info jeg manglede, spørsmålet er bare hvordan fordeler vi pointsne... 50/50 ? eller :o

skal jo så have nogle svar så i kan få dem om ikke andet.
Avatar billede bertelbrander Novice
30. august 2004 - 22:50 #10
Point går til arne, jeg forsøger at undgå point.
Avatar billede bjering Nybegynder
30. august 2004 - 22:52 #11
o.o okay, det må du jo så om :o

arne skal smide et svar så :P
Avatar billede arne_v Ekspert
31. august 2004 - 11:21 #12
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester