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 tema
Cloud & AI
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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