Avatar billede bjering Nybegynder
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 ?
Avatar billede arne_v Ekspert
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 ?
Avatar billede bjering Nybegynder
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
Avatar billede arne_v Ekspert
15. september 2004 - 19:33 #3
Er dblmap og Login samme instans af LoginMap ?
Avatar billede bjering Nybegynder
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;
Avatar billede bjering Nybegynder
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.
Avatar billede arne_v Ekspert
15. september 2004 - 19:50 #6
Det ligner altså 2 instanser af samme klasse !?!?
Avatar billede bjering Nybegynder
15. september 2004 - 19:52 #7
ja, i 2 forskellige source filer (ikke i samme self).

det er problemet ?
Avatar billede arne_v Ekspert
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;
Avatar billede bjering Nybegynder
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 :)
Avatar billede arne_v Ekspert
15. september 2004 - 20:02 #10
svar
Avatar billede arne_v Ekspert
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)
Avatar billede bjering Nybegynder
15. september 2004 - 20:03 #12
takker
Avatar billede arne_v Ekspert
15. september 2004 - 20:04 #13
extern = brug den der er defineret et andet sted med samme navn
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