PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++]Compiler gcc nimmt switch mit QString-Zeichen nicht an



Sky_Luziferius
23-10-2007, 16:45
hi leute
(ich hoffe mal dieses Unterforum ist das richtige und dass ich einen anderen thread mit einem ähnlichen, bereits gelösten problem nicht übersehen habe)

also ich habe ein kleines Problem mit switch-Anweisungen und meinem Compiler(KDevelop, nutzt gcc 4.1)

also ich habe in meinem Programm einen string(QString) und möchte nun gerne nach den Zeichen im string mittels switch verzweigen:
(Qt arbeitet nunmal mit QString)

#include <QString>
void Funktion(QString meinstring)
{
unsigned int i = 0;
meinstring = "Hallo!"; // wird normalerweise vom benutzer eingegeben,
//hier eine normale zuweisung
while (i != meinstring.length())
{
switch(meinstring[i])
{
case('a'): {/*irgendwas ausführen*/} break;
case('b'): {/*irgendwas ausführen*/} break;
// .......
default: {/*irgendwas ausführen*/}
}
i++;
}
//......
}

dann spuckt mir mein Compiler eine fehlermeldung aus, dass das switch-Argument keine Ganzzahl ist...
stimmt soweit auch, ein QString-Zeichen ist wirklich keine ganzzahl(;)), nur warum soll ich keine anderen zeichen mit switch vergleichen können???
unter windoze mit DevC++ und mit std::string läuft so ein Konstrukt einwandfrei, nur gcc weigert sich, das zu komplieren.

Weiß jemand wie man das umgehen kann, bzw. woran das überhaupt liegt?

sicherlich gibt es da einige memberfunktionen zum vergleichen, wie z.B. compare() bei den STL-strings, nur ob die auch mit QString funktonieren ist dann die frage...(da müsste ich mich noch mal informieren) Das liefert mir zwar das gewünschte Ergebnis, ich habe wirklich keine lust, für alle möglichen Zeichen(gibt ja tausende^^) if-bedingungen

if(meinstring[i] == '/*das gesuchte Zeichen*/')
{/*mache irgendwas*/}
zu schrieben, noch die Zeichen in ascii-code umzuwandeln, den dann in einem in einem int-vector/array etc zu speichern, um die mit switch vergleichen zu können.
mit switch geht das insgesammt rel. einfach und ich bekomme so 4-6 zeichen in eine zeile, ohne das es unübersichtlich wird.
wie gesagt, ich würd gerne wissen woran das liegt, dass der compiler das nicht vergleichen will...
vlt findet sich ja auch eine bessere möglichkeit das zu lösen
thx im vorraus für antworten
mfg

Treehouse
23-10-2007, 17:22
Hallo,

vielleicht solltest du mal mit latin1() arbeiten. Kannst du hier nach
lesen.

http://doc.trolltech.com/4.3/qstring.html#toLatin1


#include <QString>
void Funktion(QString meinstring)
{

const char c;

unsigned int i = 0;
meinstring = "Hallo!"; // wird normalerweise vom benutzer eingegeben,
//hier eine normale zuweisung
while (i != meinstring.length())
{
c = meinstring[i].toLatin1()
switch(c)
{
case('a'): {/*irgendwas ausführen*/} break;
case('b'): {/*irgendwas ausführen*/} break;
// .......
default: {/*irgendwas ausführen*/}
}
i++;
}
//......
}

Hoffe ich konnte dir helfen..............

anda_skoa
24-10-2007, 15:26
In C und C++ kann man nur Ganzzahltypen "switchen", d.h. char, short, int, long und deren unsigned Varianten.

Wenn der String nur ein Zeichen enthält, funktioniert der von Treehouse vorgeschlagene Weg über "char"

Bei längeren Strings kann man über assoziative Container, z.B. map und Functoren/Funktionspointer/Polymorphismus arbeiten.

Ciao,
_

Sky_Luziferius
07-11-2007, 13:26
ok thx für die antworten... werde das mal ausprobieren

dann wunder ich mich nur noch über Dev-C++, was switch in verbindung mit std::string annimmt, und das auch funktioniert

normalerweise dürfte das von Treehouse nicht funktionieren:

const char c;

c = meinstring[i].toLatin1();
man KANN kein konstantes objekt (was auch immer) ändern^^
also das "const" weg, dann klappt das:)