Toon posts:

[C++] switch from own class...

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb hier al iets gevonden:
C++:
1
2
3
4
#define sswitch(a) {char* _p = a; if (0)
#define scase(x) } else if ( !stricmp(_p, x) ) {
#define sdefault } else {
#define sendswitch }

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char *psz = ...;

sswitch( psz )
{
  scase( "geval1" )
    //  code voor geval 1

  scase( "geval2" )
    //  code voor geval 2

  // etc

  sdefault
    //  default code 
}
sendswitch


Maar nu

C++:
1
2
3
4
5
6
7
8
9
10
11
Integer CBeest::Getvariable ( KString CreatureName )
{
  switch ( CreatureName.Mid( 0, 3 ) )
  {
    case "flo":     return Var1;
    case "poe":     return Var2;
    case "qua":     return Var3;
    case "tro":     return Var4;
    default:        return 0;
  }
}


* Conversie KString -> char* bestaat...
* .Mid pakt vanaf het param1-ste character tot het param1 + param2 character & returned KString
* Kstring(char *) is gedefined...

En natuurlijk de fout:
cbeest.cpp(7) : error C2450: switch expression of type 'class KString' is illegal
Ambiguous user-defined-conversion
cbeest.cpp(8) : error C2051: case expression not constant
cbeest.cpp(9) : error C2051: case expression not constant
cbeest.cpp(10) : error C2051: case expression not constant
cbeest.cpp(11) : error C2051: case expression not constant
cbeest.cpp(13) : warning C4065: switch statement contains 'default' but no 'case' labels

[ Voor 25% gewijzigd door Verwijderd op 05-03-2003 14:03 . Reden: fout vergeten ;) ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

een switch werkt alleen met integral types, en de case labels moeten constant zijn

[ Voor 37% gewijzigd door .oisyn op 05-03-2003 14:05 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
ja, weet ik ^_^

Maar is er geen enkele manier (buiten die ik hier op't forum gevonden heb) om die in die functie te gieten???

of hoe kan ik van mijn KString een const int type maken?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 05 maart 2003 @ 14:06:
Maar is er geen enkele manier (buiten die ik hier op't forum gevonden heb) om die in die functie te gieten???
C++:
1
inline KString::operator const char*() { return RawPointer; }

En je sswitch zooi werkt meteen.
of hoe kan ik van mijn KString een const int type maken?
Hoe wil je dat nu weer doen? :?

Professionele website nodig?


Verwijderd

heb je ook al conversie: KString -> const char* geprobeerd?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

wat is er mis met een if () else if () else ... constructie :?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

.oisyn schreef op 05 March 2003 @ 14:21:
wat is er mis met een if () else if () else ... constructie :?
Vind ik ook 10x charmanter, maja als hij zonodig wil switchen op een non-constant, zijn feestje :)

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

(ik heb niets te doen)

C++:
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
typedef void (*commandfunc_t) ();
typedef std::map<std::string, commandfunc_t> command_map;

command_map commands;

void aap ()
{
    cout << "aap";
}

void noot ()
{
    cout << "noot";
}

void mies ()
{
    cout << "mies";
}

void initMap ()
{
    commands["aap"] = aap;
    commands["noot"] = noot;
    commands["mies"] = mies;
}

void checkCommand (const std::string & pCommand)
{
    command_map::iterator it = commands.find (pCommand);
    if (it == commands.end ())
    {
        // .. command bestaat niet, doe iets met een error
    }

    it->second ();
}


:P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
hmmmm :)
effe es iet simpel uit aan't proberen .oisyn? ;-)

nou ja ... een if-then-else is beperkt in het aantal sub-iteraties dat je kan doen (wel heel veel, maar toch beperkt door de stack).

Een switch is voor zover ik mee bekend ben niet beperkt...

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Verwijderd schreef op 05 March 2003 @ 14:38:
hmmmm :)
effe es iet simpel uit aan't proberen .oisyn? ;-)

nou ja ... een if-then-else is beperkt in het aantal sub-iteraties dat je kan doen (wel heel veel, maar toch beperkt door de stack).

Een switch is voor zover ik mee bekend ben niet beperkt...
Huh? Dat klinkt vaag... lijkt me dat dat gewoon geimplementeerd wordt als een if-else node in je AST. Een node met 1 child en 1 optioneel child, die dan op hun beurt beide weer if-else nodes kunnen zijn. Waarom zou daar een maximum aan vast zitten? (buiten dat de ast in je geheugen moet passen)

Veel viezer dan die #define troep kan je het trouwens lastig maken :P

[ Voor 6% gewijzigd door Zoijar op 05-03-2003 14:48 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 05 maart 2003 @ 14:38:
nou ja ... een if-then-else is beperkt in het aantal sub-iteraties dat je kan doen (wel heel veel, maar toch beperkt door de stack).

Een switch is voor zover ik mee bekend ben niet beperkt...
Wtf heb je het over?!? 8)7

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 05 maart 2003 @ 14:38:
hmmmm :)
effe es iet simpel uit aan't proberen .oisyn? ;-)
mijn oplossing is
1) netter
2) eleganter
3) sneller

std::map is een binaire zoekboom. Als je een string opzoekt heb je dus maar maximaal log (n) vergelijkingen. Bij een if/else constructie is dat maximaal n (n is het aantal elementen)
nou ja ... een if-then-else is beperkt in het aantal sub-iteraties dat je kan doen (wel heel veel, maar toch beperkt door de stack).

Een switch is voor zover ik mee bekend ben niet beperkt...


que :?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • BCC
  • Registratie: Juli 2000
  • Laatst online: 08:37

BCC

Verwijderd schreef op 05 March 2003 @ 14:38:
hmmmm :)
nou ja ... een if-then-else is beperkt in het aantal sub-iteraties dat je kan doen (wel heel veel, maar toch beperkt door de stack).

Een switch is voor zover ik mee bekend ben niet beperkt...
He's got a point there... :)

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

BCC schreef op 05 March 2003 @ 15:01:
[...]

He's got a point there... :)


oh? misschien kan jij dan uitleggen wat z'n punt is?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
dat if-then-else beperkt is & switch niet...
alhoewel na enig bestuderen uw functie wel beter (en sneller is).

Zelf moet ik maar 4 vergelijkingen maken. Dus dat maakt dan niet veel uit. Heb het al rap even naar if-then-else gezet.

Maar ik wou het graag in switch-case zien staan...
Zeker van dat daar geen mogelijkheid toe is? Dat zou de max zijn :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 05 March 2003 @ 15:09:
dat if-then-else beperkt is & switch niet...


ja, dat snapten we ook wel dat je dat bedoelde, maar waarom is if-else beperkt volgens jou?

want dat is dus gewoon niet zo

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 05 March 2003 @ 15:09:
Maar ik wou het graag in switch-case zien staan...
Zeker van dat daar geen mogelijkheid toe is? Dat zou de max zijn :)
Lees Je Eigen Topic.

[rml]curry684 in "[ C++] switch from own class..."[/rml]

Professionele website nodig?


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

.oisyn schreef op 05 March 2003 @ 15:10:

ja, dat snapten we ook wel dat je dat bedoelde, maar waarom is if-else beperkt volgens jou?

want dat is dus gewoon niet zo
Ok, sorry. Het is wel zo in Visual C++ .NET in ieder geval, die heeft een max van 247. "Nesting levels of compound statements, iteration control structures, and selection control structures [256] (247). " Maar dat geldt dan dus net zo goed voor switch statements.

Vreemde manier om je compiler te schrijven...maar goed, zijn we gewend :P

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Zoijar schreef op 05 maart 2003 @ 15:23:
[...]


Ok, sorry. Het is wel zo in Visual C++ .NET in ieder geval, die heeft een max van 247. "Nesting levels of compound statements, iteration control structures, and selection control structures [256] (247). " Maar dat geldt dan dus net zo goed voor switch statements.

Vreemde manier om je compiler te schrijven...maar goed, zijn we gewend :P
Else is net zomin als een case een nesting.

Nesting betekent dit:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
if(...)
  {
  // Nesting 1
  if(...)
    {
    // Nesting 2
    if(...)
      {
      // Nesting 3, etc.
      }
    }
  }

ps. lijkt me sterk dat GCC of andere 'established' compilers geen harde limiet hebben op de hoeveelheid toegestane nests. Mijn record staat op 19 en dat was debugcode die later opgesplitst is in 5 functies met 3-5 nests per stuk.

Zodra een functie over de 5 nests gaat ben je aan het klooien.

[ Voor 19% gewijzigd door curry684 op 05-03-2003 15:26 . Reden: post scriptum ]

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zoijar: fijne code, als iemand pakweg 200 if's nestelt :P

Curry: een if-else if constructie wordt ook genest:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if ()
{
}
else
{
    if ()
    {
    }
    else
    {
        if ()
        {
        }
        else { }
    }
}

[ Voor 70% gewijzigd door .oisyn op 05-03-2003 15:27 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

.oisyn schreef op 05 March 2003 @ 15:25:
Zoijar: fijne code, als iemand pakweg 200 if's nestelt :P

Curry: een if-else if constructie wordt ook genest
Lijkt me sterk dat een compiler else-if als een nesting leest ipv als 1 keyword (* curry684 zou het iig niet zo parsen juist om die reden). Als ie het wel doet en hij applied die limiet erop: knap stom.

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

zo zit C(++) nou eenmaal in elkaar :)
else if is niet 1 constructie, die if is een geneste statement in de scope van de else

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
curry684> ik weet dat het zo werkt ;) Maar ik zou het in switch willen zien...
Spijtig werkt da precies dus totaal nie :|

Maar wacht eens???
C++:
1
2
3
4
5
6
string a("123");
switch (a)
{
  case "12": ...
  case "123": ...
}


Werkt dat niet (nog niet geprobeerd...)?

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

.oisyn schreef op 05 March 2003 @ 15:25:
Zoijar: fijne code, als iemand pakweg 200 if's nestelt :P
Code generators willen dat soort (rare) dingen nog wel is doen. Kan me voorstellen dat een naive parser generator het doet.

En C++ kent idd geen "else-if", dan zou je een ast node met een variabel aantal kinderen moeten maken. Kan wel, maar dat andere werkt lekkerder.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

.oisyn schreef op 05 March 2003 @ 15:32:
zo zit C(++) nou eenmaal in elkaar :)
else if is niet 1 constructie, die if is een geneste statement in de scope van de else
Dat C++ het zo definieert is leuk (luiheid toegestaan voor lamme compilerbouwers), maar de compiler is niet verplicht het vervolgens op die manier te implementeren. Ik zou zelf een if-else statement compileren als een sequentiele lijst van conditions met optionele catch all aan het einde. Eea. om het geemmer met grote hoeveelheden stackframes and unwind handlers te voorkomen.

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 05 March 2003 @ 15:33:
curry684> ik weet dat het zo werkt ;) Maar ik zou het in switch willen zien...
Spijtig werkt da precies dus totaal nie :|

Maar wacht eens???
C++:
1
2
3
4
5
6
string a("123");
switch (a)
{
  case "12": ...
  case "123": ...
}


Werkt dat niet (nog niet geprobeerd...)?
Nee dat werkt niet.

Professionele website nodig?


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
.oisyn schreef op 05 March 2003 @ 14:29:
(ik heb niets te doen)

C++:
1
2
3
typedef void (*commandfunc_t) ();
typedef std::map<std::string, commandfunc_t> command_map;
...

:P
Niets te doen? Lezen wat een hash_map doet, zul je bedoelen. Dat trage O(ln N) ook altijd... :P

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

De enige manier waarop je strings in een switch zou kunnen proppen, is als je constante strings gebruikt in je switch, en in je strings, en de pointers omzet naar long. Maar goed, talk about dirty code ;).

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
En bovendien werkt het niet. Of "A"=="A" waar is , dat hangt af van de compiler. Op VC7 is het zelfs een gevolg van compiler settings.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

MSalters schreef op 05 maart 2003 @ 18:09:
[...]

Niets te doen? Lezen wat een hash_map doet, zul je bedoelen. Dat trage O(ln N) ook altijd... :P


hash_map is niet ANSI C++, als ik me niet vergis :P

[ Voor 5% gewijzigd door .oisyn op 06-03-2003 10:15 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

MSalters schreef op 06 March 2003 @ 10:07:
En bovendien werkt het niet. Of "A"=="A" waar is , dat hangt af van de compiler. Op VC7 is het zelfs een gevolg van compiler settings.
Je hebt gelijk dat het niet werkt. Maar technisch gezien kan het wel, omdat de linker ervoor zorgt dat er maar één exemplaar van elke constante string aanwezig is, dus in principe is ("A" == "A") waar.
C++:
1
2
3
4
5
6
7
8
9
10
#include <iostream>

int main(int argc, char **argv)
{
   char *pszString = "blaat";

   if (pszString == "blaat") cout << "Equal!" << endl; else cout << "!Equal" << endl;

   return 0;
}
Als je deze code uitvoert, zul je zien dat de vergelijking klopt, en dat dus de adressen gelijk zijn. Maw, technisch gezien kan het wel, en eigenlijk is het nmm fout dat je een error krijgt ipv een warning als je constante strings in een switch zet.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Hohoho. Een linker mag er voor zorgen dat duplicate strings worden samengevoegd. Dat hoeft niet. Het enige wat je bewijst is dat jouw compiler op jouw machine, met jouw settings ten minste eenmaal een executable heeft aangemaakt waarin tenminste een duplicate string literal geelimineerd is. :)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1