tutorials.de Buch-Aktion 05/2012
Like Tree3Danke
  • 1 Beitrag von deepthroat
  • 1 Beitrag von Endurion
  • 1 Beitrag von MCoder
ERLEDIGT
JA
ANTWORTEN
5
ZUGRIFFE
253
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    cwriter cwriter ist offline Mitglied Gold
    Registriert seit
    Mar 2010
    Beiträge
    242
    Hallo Welt

    Ich habe, wie der Titel schon sagt, ein Problem mit den Standard Template Library maps.

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    #include "stdio.h"
    #include "stdlib.h"
    #include "windows.h"
    #include <map>
     
    using namespace std;
     
     
    int main()
    {
         char String[256];
         
         strcpy(String,"Test");
         
         map< int, char* > MeineMap;
         map< int,char* >::iterator it;
         
         MeineMap.insert(make_pair(0,String));
     
         printf("%s\n",MeineMap);
         
         strcpy(String,"Test2");
        
         printf("%s\n",MeineMap);
     
         getch();
         return 0;
    }

    Die von mir erwartete Ausgabe:
    Code :
    1
    2
    
    Test
    Test

    Und die Tatsächliche:
    Code :
    1
    2
    
    Test
    Test2

    Ich schliesse daraus, dass die Map kein Speicher, sondern eine Art Linker ist, die nur auf andere Speicheradressen verweist.
    Wie kann ich das verhindern? Gibt es eine Alternative zur map, oder gibt es für die map eine eigene Funktion, die direkt Werte speichert? Oder wisst ihr, wie man trotzdem den "String"-Speicher weiterverwenden kann?

    Gruss
    cwriter
     
    Intel inside - Idiot outside :-)

    Ich schreibe in C und bin Anfänger.
    ______________________________

    Falls ich eines Tages einen guten Beitrag schreiben werde, bitte bewerten und/oder Danke sagen.
    Danke

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von cwriter Beitrag anzeigen
    Ich schliesse daraus, dass die Map kein Speicher, sondern eine Art Linker ist, die nur auf andere Speicheradressen verweist.
    Die std::map verweist auf genau das, was du als zweiten Template-Parameter angibst. Du hast spezfiziert, das die Schlüssel ints und die Werte Zeiger auf char sind - und genau das sind sie dann eben auch...

    Verwende doch einfach std::map<int, std::string>.

    Gruß
    cwriter bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Hölle, entweder ich habe eine Revolution verschlafen oder du massig Glück:

    Du kannst doch nicht eine Map als String mit printf ausgeben**** Das sollte dir eigentlich um die Ohren fliegen.

    Gib die korrekt aus, dann siehst du auch wirklich das zweite Ergebnis (wie deepthroat erklärt hat):

    Code :
    1
    2
    3
    4
    5
    6
    
    map<int,char*>::iterator  it( MeineMap.begin() );
    while ( it != MeineMap.end() )
    {
      printf( "%s\n", it->second );
      ++it;
    }
    Geändert von Endurion (21.07.11 um 08:11 Uhr)
    cwriter bedankt sich. 

  4. #4
    cwriter cwriter ist offline Mitglied Gold
    Registriert seit
    Mar 2010
    Beiträge
    242
    @deepthroat

    Aber ich würde sehr gerne mit den C-Strings arbeiten und einen Array akzeptiert er nicht. Und strcpy() funktioniert ja nicht mit Strings, da gibt's doch die Zuweisung String="Text" ?


    @Endurion

    Oh, ja . Meinte ich auch nicht so. Es sollte
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    char String[256];
         
         strcpy(String,"Test");
         
         map< int, char* > MeineMap;
         map< int, char* >::iterator it;
         
         MeineMap.insert(make_pair(0,String));
     
         it = MeineMap.find(0);
     
         printf("%s\n",it->second);
         
         strcpy(String,"Test2");
        
         printf("%s\n",it->second);
     
         getch();
         return 0;
    heissen. Habe ich wohl falsch abgetippt.

    Vielen Dank für die bisherige Hilfe

    cwriter
     
    Intel inside - Idiot outside :-)

    Ich schreibe in C und bin Anfänger.
    ______________________________

    Falls ich eines Tages einen guten Beitrag schreiben werde, bitte bewerten und/oder Danke sagen.
    Danke

  5. #5
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Zitat Zitat von cwriter Beitrag anzeigen
    Aber ich würde sehr gerne mit den C-Strings arbeiten und einen Array akzeptiert er nicht.
    Für die Ablage in der map kannst du trotzdem mit std::string arbeiten - dann speicherst du eine Kopie deines C-Strings. Aus einem std::string bekommt man auch recht leicht ( mit c_str() ) wieder einen C_String.
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    char String[256];
    strcpy(String,"Test");
     
    std::map<int,std::string> MeineMap;
    MeineMap[0] = String;
     
    printf( "%s\n", MeineMap[0].c_str() );
     
    strcpy(String,"Test2");
    printf( "%s\n", MeineMap[0].c_str() );
    Gruß
    MCoder
    cwriter bedankt sich. 
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von cwriter Beitrag anzeigen
    @deepthroat

    Aber ich würde sehr gerne mit den C-Strings arbeiten
    Dann mußt du dich halt selbst um die Speicherverwaltung kümmern und strdup (POSIX) bzw. malloc + strcpy verwenden wenn du die Strings in die Map kopieren willst.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Wie weise ich nach: Browser Problem oder Code Problem?
    Von Steb im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 10.03.11, 20:09
  2. Antworten: 0
    Letzter Beitrag: 11.01.11, 21:40
  3. Antworten: 4
    Letzter Beitrag: 22.03.06, 20:50
  4. Antworten: 0
    Letzter Beitrag: 06.10.04, 14:03
  5. Antworten: 6
    Letzter Beitrag: 13.06.02, 12:29

Stichworte