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

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

11

29.08.2008, 16:12

Ja, das sind Member einer Klasse, die Klasse selber ist allerdings kein Template. Der gcc ist eigtl ein mingw den ich hier habe um zu testen, ob der Code denn auch unter linux zumindest kompilieren würde.

Ich hab das ganze Projekt jetzt mal neu ausgechekt und nun ist das verhalten von Debug und Releasemodus immerhin wieder konsistent, aber falsch ^^ Die Methode sieht momentan so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
        template<>
        bool getKeyAs(const std::string& section, const std::string& key)
        {
            // Retrieve the value of the key and transform it to lowercase

            std::string value = getKey(section, key);
            std::transform(value.begin(), value.end(), value.begin(), tolower);

            std::clog << "Converting " << section << "|" << key << "(=>" << value << ") to bool ...";
 
            // Everything "true" or not "0" means true 

            std::clog << " returning " << (value == "true" || value != "0") << std::endl;
            return (value == "true" || value != "0");
        }
Ausgabe:

Quellcode

1
Converting WoRD|debug(=>false) to bool ... returning 1
Die Angabe hinter dem Pfeil ist folglich der ausgelesene Wert ("false"). 1 entspricht aber leider true ...

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

12

29.08.2008, 16:16

Afaik kann der GCC keine Templatespezialisierungen von Funktionen im Klassenscope. Ich habe auf jeden fall schon sehr häufig Probleme damit gehabt. Ich weiß nicht ob das Bugbedingt ist oder vielleicht auch bewusst.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

29.08.2008, 16:44

Zitat von »"Das Gurke"«

Die Angabe hinter dem Pfeil ist folglich der ausgelesene Wert ("false"). 1 entspricht aber leider true ...


C-/C++-Quelltext

1
(value == "true" || value != "0")


überleg mal was das tut wenn value == "false" is ;)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

14

29.08.2008, 16:48

Zitat von »"dot"«

Zitat von »"Das Gurke"«

Die Angabe hinter dem Pfeil ist folglich der ausgelesene Wert ("false"). 1 entspricht aber leider true ...


C-/C++-Quelltext

1
(value == "true" || value != "0")


überleg mal was das tut wenn value == "false" is ;)


Ist halt ein bisschen suboptimal ausgedrückt! ;)
@D13_Dreinig

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

15

30.08.2008, 08:41

Autsch! Danke ^^ Ich prüf dann doch mal lieber auf False, das kann ja nur in zwei Fällen eintreten.

Edit: Jetzt bin ich platt ... Der umgestellte Code tuts auch nicht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        template<>
        bool getKeyAs(const std::string& section, const std::string& key)
        {
            // Retrieve the value of the key and transform it to lowercase

            std::string value = getKey(section, key);
            std::transform(value.begin(), value.end(), value.begin(), tolower);

            std::clog << "Converting " << section << "|" << key << "(=>" << value << ") to bool ...";
 
            // Everything "false" or "0" means false 

            bool ret;
            if (value == "false" || value == "0")
                ret = false;
            else 
                ret = true;

            std::clog << " returning " << ret << std::endl;
            return (ret);
        }
Der Code funktioniert, wenn ich statt "false" einfach "0" schreibe, aber ansonsten ...

Quellcode

1
2
Converting WoRD|debug(=>0) to bool ... returning 0
Converting WoRD|debug(=>false) to bool ... returning 1
Was kann ich denn jetzt noch übersehen haben?

Und wegen dem gcc: Weiß hier jemand, ob der Spezialisierungen von "reinen" Methodentemplates echt nicht beherrscht? Ich hab jetzt einige Varianten ausprobiert, aber die kompilieren entweder garnicht erst oder rufen die spezialisierte Variante nicht auf.

16

30.08.2008, 10:43

Komisch :D

C-/C++-Quelltext

1
const bool result(value == "true" || value == "1");
.... ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

17

30.08.2008, 10:53

Hmm, war das ironisch gemeint und ich hatte wieder Tomaten auf den Augen? Auf jeden Fall geht das so :oops:

Muss ich nur noch den gcc überzeugen. Ich fürchte fast, ich muss die Template Spezialisierung gegen eine "echte" Methode austauschen (womit der Threadtitel bis auf das "zu doof" dann endgültig ad absurdum geführt worden wäre).

Werbeanzeige