Avatar billede bjering Nybegynder
03. september 2004 - 00:06 Der er 10 kommentarer og
1 løsning

Videre spørgsmål til min gamle omkring memory map std::map

okay, har nu det her ik'

struct usersonline
{
    unsigned int socket;
    string username;
};

smider data ind i den sådan her

struct usersonline test;
test.socket = cp;
test.username = lp.username;
pair<int,struct usersonline> p(cp,test);
m.insert(p);

og vil hente ud sådan her

map<int,struct usersonline> m;
struct usersonline test;

string s = m[cp].username;
const char * username = s.c_str();

problemet er bare, min username jeg tager ud, er tom (?)

cp = socketid (unsigned int) brugeren er på
username er en string som brugeren er logger ind med.

nogen der kan se hvor fejlen er ?

btw, jeg søgte på en fejl jeg fik (32 eller sådan) nogen med truncate chars 256 eller sådan noget og fandt at man bare skulle skrive det her i toppen

#pragma warning (disable: 4786)
#pragma warning (disable: 4788)

så var den warning væk..

kan det være noget med det ?
Avatar billede bertelbrander Novice
03. september 2004 - 00:44 #1
Jeg kan ikke lige se nogen fejl i din kode, så jeg lavede det om til et lille program:

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

using namespace std;

struct usersonline
{
    unsigned int socket;
    string username;
};

map<int,struct usersonline> m;

void add(int cp, string un)
{
  struct usersonline test;
  test.socket = cp;
  test.username = un;
  pair<int ,struct usersonline> p(cp,test);
  m.insert(p);
}

int main()
{
  add(1, "Ole");
  add(22, "Peter");

  string S = m[1].username;
  cout << S << endl;

  S = m[22].username;
  cout << S << endl;

  // Note, will create a user with id 1234
  S = m[1234].username;
  cout << S << endl;
}

Det ser ud til at virke, også med Visual C++ som vist er den du bruger.
Bemærk at hvis man slår et entry op i mappen der ikke findes vil det blive lavet.
Du kan bruge map.find til at undersøge om id'et findes.
Det er normalt at få et hav af warnings når man bruger stl med visual C++ 6.0
Avatar billede bertelbrander Novice
03. september 2004 - 00:48 #2
F.ex:

  // Check to see if user 21 exist
  map<int, struct usersonline>::iterator it = m.find(21);
  if(it == m.end())
      cout << "User 21 does not exist" << endl;
  else
      cout << it->second.username << endl;
Avatar billede bjering Nybegynder
03. september 2004 - 01:32 #3
kan ikke rigtig få det til at virke, min username ser tom ud..
wierd...
Avatar billede segmose Nybegynder
03. september 2004 - 08:47 #4
Dette virker ikke så godt:
const char * username = s.c_str();
username er (potentielt) ugyldigt når du når ;
brug
const char * username = strdup(s.c_str());
eller lignede, ihvertfald kopier det hvis du vil have char *.
Avatar billede bjering Nybegynder
03. september 2004 - 08:59 #5
virkede ikke, har endda prøvet med at skrive en key ind manuelt.

prøver lige at kigge om den storer en cp og det bare er usernavnet det er galt med.
Avatar billede bjering Nybegynder
03. september 2004 - 09:07 #6
den får den rigtige username & socketid til at smide in i mappen, men om det så gør det.. mm
Avatar billede bjering Nybegynder
03. september 2004 - 09:10 #7
okay, hvis jeg henter den ud liiige efter jeg har smidt den i, virker den, men det kan jeg så bare ikke i mit program... hum... prøver lige lidt..
Avatar billede bjering Nybegynder
03. september 2004 - 09:17 #8
yessss!! nu virker det, skulle røkke en smule rundt, men det er jo så oxo første gang jeg leger med std::map
Avatar billede bjering Nybegynder
03. september 2004 - 09:19 #9
ups, bertelbrander's ide hjalp mig i den rigtige retning, men at lave en void adduser() osv.

så det er kun fair han får points'ne
Avatar billede bertelbrander Novice
03. september 2004 - 19:55 #10
Jeg vil stadig ikke have point.
Avatar billede bjering Nybegynder
04. september 2004 - 16:15 #11
så får segmose dem, så vi kan få den her lukket
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