Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

21.07.2010, 11:53

String to Bool Problem

Guten Morgen!

Also ich sitze jetzt schon seit langer Zeit an einem sicherlich ziemlich simplem Problem.
Ich habe eine Struktur in eine Datei geschrieben, die mir als Konfiguration dient.
In einer Funktion habe ich die Datei wieder in einen String eingelesen, wo ich sie auswerten will.
In der Datei stehen nur 0en und 1en, sprich es sieht wie eine Binäre Datei aus.
Die einzelnen Werte räpresentieren alle einen Bool, die in meiner Struktur stehen sollen.

Eingelesen werden sie richtig, da ich mit einer Ausgabe überprüft habe, ob in dem String das gleiche wie in der Datei steht.
Allerdingst bei der Auswertung funktioniert es nicht richtig, da er, egal ob ich eine 0 oder 1 habe, IMMER den wert false zuordnet.

Hier mal der relevante Codeausschnitt:

C-/C++-Quelltext

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
struct STileConfig
{
    bool bVisible; //Ob der Teil der Karte bereits aufgedeckt wurde
    bool bMine; //On der Teil der Karte vermient ist

    bool bLeftBlock; //Ob an der linken Seite eine Blokade ist
    bool bRightBlock; //Ob an der rechten Seite eine Blockade ist
    bool bUpBlock; //On an der oberen Seite eine Blockade ist
    bool bDownBlock; //Ob an der unteren Seite eine Blockade ist
};

int Pos = 0;

while(Pos < 1152)
        {
            if(sZwischenspeicher.at(Pos) == 1)
            {
                Tile.bVisible = true; 
                cout << "True\n";
            }
            else
            {
                Tile.bVisible = false;
                cout << "False\n";
            }
            Pos++;

            if(sZwischenspeicher.at(Pos) == 1)
            {
                Tile.bMine = true;
                cout << "True\n";
            }
            else
            {
                Tile.bMine = false;
                cout << "False\n";
            }
            Pos++;

            if(sZwischenspeicher.at(Pos) == 1)
            {
                Tile.bUpBlock = true;
                cout << "True\n";
            }
            else
            {
                Tile.bUpBlock = false;
                cout << "False\n";

            }
            Pos++;
            
            if(sZwischenspeicher.at(Pos) == 1)
            {
                Tile.bDownBlock = true;
                cout << "True\n";
            }
            else
            {
                Tile.bDownBlock = false;
                cout << "False\n";
            }
            Pos++;

            if(sZwischenspeicher.at(Pos) == 1)
            {
                Tile.bLeftBlock = true;
                cout << "True\n";
            }
            else
            {
                Tile.bLeftBlock = false;
                cout << "False\n";
            }
            Pos++;

            if(sZwischenspeicher.at(Pos) == 1)
            {
                Tile.bRightBlock = true;
                cout << "True\n";
            }
            else
            {
                Tile.bRightBlock = false;
                cout << "False\n";
            }

            //Konfigurieren
            m_MapConfig.push_back(Tile);
            Pos++;
        }       


Egal, ob in meinem String getzt eine 1 oder 0 an der aktuellen Position steht, es wird immer auf false gesetzt.
Habe schon versucht, in der if - Abfrage noch einmal den Wert umzuwandeln mit folgenen Code:

C-/C++-Quelltext

1
2
3
if((int) sZwischenspeicher.at(Pos) == 1)
//und
if(atoi(&sZwischenspeicher.at(Pos)) == 1)


Liebe Grüße und Danke im Vorhinein,
Ombalat

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

21.07.2010, 12:02

at gibt dir ein char zurück. Diesen kannst du mit einem int vergleichen, aber teste mal folgendes:
1 == '1' und schau dir mal das Ergebnis an. Und dann gibt mal den Wert von 1 und von '1' aus oder schau in dir per Debugger an.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

3

21.07.2010, 12:25

Dass eine int 1 und und ein sting 1 nicht den selben Wert haben ist mir schon klar.

Deswegen hwollte ich es ja auch mit
atoi(&sZwischenspeicher.at(Pos)) == 1
machen, und da versteh ich nicht, wieso es nicht funktioniert.

Weil wenn ich es ganz normal so teste:

C-/C++-Quelltext

1
2
3
4
5
6
7
int i = 1;
    string s = "1";

    if(i == atoi(&s.at(0)))
        cout << "True";
    else
        cout << "False";


bekomme ich ja auch die richtige zuweisung

Dass es in der Form

C-/C++-Quelltext

1
2
3
4
5
if(sZwischenspeicher.at(Pos) == 1)
            {
                Tile.bVisible = true; 
                cout << "True\n";
            }

nicht geht weiß ich schon

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

21.07.2010, 12:30

C-/C++-Quelltext

1
sZwischenspeicher.at(Pos) == '1'

fertig.

edit: wenn du die ausgabe netmehr benötigst reicht auch eine zuweisung:

C-/C++-Quelltext

1
Tile.bVisible = sZwischenspeicher.at(Pos) == '1';
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

5

21.07.2010, 13:38

Ich bilde mir ein, es schon so Probiert zu haben :rolleyes:
Wie auch immer, jetzt funktioniert es.
Vielen Dank!

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

21.07.2010, 13:41

Nebenbei erscheint mir atoi(&s.at(0))) ziemlich gefährlich, da atoi afaik ein null-terminierten String erwartet.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige