15. september 2004 - 17:45
Der er
12 kommentarer og 1 løsning
Hvorfor virker den her std::map ikke ?
Jeg har den std map til at gemme brugere online, men den smider ingen data i den. min LoginMap.h fil: #define WIN32_LEAN_AND_MEAN // disable map warnings for std::map #pragma warning (disable: 4786) #pragma warning (disable: 4788) #include <windows.h> #include <string> #include <memory.h> #include <map> #include "Types.h" using namespace std; struct usersonline { int accountid; string username; }; class LoginMap { private: map<unsigned int,struct usersonline> m; struct usersonline uo; public: //************************ // std::map remove a map //************************ void removeMap(unsigned int keyid) { m.erase(keyid); } //************************ // std::map setters / getters //************************ //** Account ID ** void setAccountid(unsigned int key, int accountid) { map<unsigned int,struct usersonline>::iterator it = m.find(key); if(it != m.end()) it->second.accountid = accountid; else { uo.accountid = accountid; m.insert(make_pair(key, uo)); } } //** Account ID ** int getAccountid(unsigned int key) { int accountid = m[key].accountid; return accountid; } //** User name ** void setUsername(unsigned int key, string username) { map<unsigned int,struct usersonline>::iterator it = m.find(key); if(it != m.end()) it->second.username = username; else { uo.username = username; m.insert(make_pair(key, uo)); } } //** User name ** string getUsername(unsigned int key) { string username = m[key].username; return username; } }; min database check fil: int database::checklogin(DWORD ptr, char * username, char * password) { CConnection* c = reinterpret_cast <CConnection*> (ptr); char cip[15]; unsigned int cp = 0; c->PeerInfo (&cip[0], 15, &cp); unsigned int num_rows; char* query = new char[100]; sprintf(query,"SELECT * FROM account WHERE name='%s' && password='%s'", username, password); if(mysql_query(pConn,query)) { // error doing the query Log2File(TRUE, "(MySQL) ERROR : %s\n", mysql_error(pConn)); return 0; } else { result = mysql_store_result(pConn); // fetch all the rows from the query. num_rows = mysql_num_rows(result); row = mysql_fetch_row(result); // the username and password match, return accountid if(num_rows >= 1) { int accountid = (int)atoi((char *)row[0]); dblmap.setAccountid(cp, accountid); dblmap.setUsername(cp, (string)row[1]); mysql_free_result(result); return 1; } // no such username else if(num_rows == 0) { mysql_free_result(result); return 0; } mysql_free_result(result); } return 0; } den henter data'en ud ok, men gemmer den ikke i mappen, nogen der kan se fejlen ?
Annonceindlæg fra DE-CIX
15. september 2004 - 18:38
#1
Ikke lige umiddelbart. Men kan du ikke prøve at udskrive hele mappen på udvalgte steder så du hele tiden kan se hvad der sker ?
15. september 2004 - 19:23
#2
prøvede : // the username and password match, return accountid if(num_rows >= 1) { int accountid = (int)atoi((char *)row[0]); string myname = (string)row[1]; char * accname = strdup(myname.c_str()); Log2File(TRUE, "Account ID : %i, Name %s\n", accountid, accname); dblmap.setAccountid(cp, accountid); dblmap.setUsername(cp, myname); int testid = dblmap.getAccountid(cp); string testname = dblmap.getUsername(cp); char * chaname = strdup(testname.c_str()); Log2File(TRUE, "TEST Account ID : %i, Name %s\n", testid, chaname); mysql_free_result(result); return 1; } der siger den : [19:20:02] Account ID : 1, Name admin [19:20:02] TEST Account ID : 1, Name admin så der er den ok så prøvede jeg i min main fil (efter bruger logger ud) void CloseCallback (DWORD ptr) { CConnection* c = reinterpret_cast <CConnection*> (ptr); char cip[15]; unsigned int cp = 0; c->PeerInfo (&cip[0], 15, &cp); statusbarmsg("remove"); // testing int testid = Login.getAccountid(cp); string name = Login.getUsername(cp); char * username = strdup(name.c_str()); com.RemoveUserOnline(hdwnd, username); Log2File(TRUE, "TEST Account Logout : %i, Name %s\n", testid, username); com.WriteDataStr(hdwnd , "Connection was closed from %s", cip); Log2File(TRUE, "Connection was closed from %s on socket %i\n", cip, cp); Login.removeMap(cp); } der siger den [19:28:21] TEST Account Logout : -858993460, Name
15. september 2004 - 19:33
#3
Er dblmap og Login samme instans af LoginMap ?
15. september 2004 - 19:35
#4
ja, da jeg har den her i de filer jeg skal bruge: #include "LoginMap.h" derefter f.eks i min mainserver.cpp fil har jeg: LoginMap Login; i min database.cpp LoginMap dblmap;
15. september 2004 - 19:36
#5
visual c++ 6 hyler op om jeg har allerede diffineret en sådan instans hvis jeg bruger samme navn.
15. september 2004 - 19:50
#6
Det ligner altså 2 instanser af samme klasse !?!?
15. september 2004 - 19:52
#7
ja, i 2 forskellige source filer (ikke i samme self). det er problemet ?
15. september 2004 - 19:54
#8
Ja. Det tror jeg. Prøv at lade mainserver.cpp have: LoginMap dblmap; og database.cpp have: extern LoginMap dblmap;
15. september 2004 - 19:59
#9
[20:03:34] TEST Account Logout : 1, Name admin du har dælme ret (self).... jeg forstår bare ikke hvorfor, jeg mener, hvis jeg skifter instans så skifter jeg mappens memory location eller hvad sker der ? og smid også lige et svar :)
15. september 2004 - 20:02
#10
svar
15. september 2004 - 20:03
#11
Ja. 2 forskellige navne => 2 forskellige variable => 2 forskelige steder i memory (ligesom i alle andre mulige sammenhænge)
15. september 2004 - 20:03
#12
takker
15. september 2004 - 20:04
#13
extern = brug den der er defineret et andet sted med samme navn
Kurser inden for grundlæggende programmering