Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Fehler: switch-Größe ist keine Ganzzahl

130 views
Skip to first unread message

Maik Wöhl

unread,
Dec 30, 2011, 5:44:31 AM12/30/11
to
Hallo Community,

ich habe hier eine Klasse: http://pastebin.com/aLzbLPnT

Der Compiler gibt folgendes aus:

> In file included from intelligent_program.cpp:11:0:
> person.class.h: In Elementfunktion »std::string > Person::getAttribute(std::string)«:
> person.class.h:35:17: Fehler: switch-Größe ist keine Ganzzahl
> Kompilierung fehlgeschlagen.

Ich habe die Switch-Case Schleife richtig erstellt. Ich habe ihr den
Parameter übergeben der nach Übereinstimmung untersucht werden soll.

Könnt ihr mir helfen?

Maik

Maik Wöhl

unread,
Dec 30, 2011, 9:51:34 AM12/30/11
to
Am 30.12.2011 11:44, schrieb Maik Wᅵhl:
> Hallo Community,
>
> ich habe hier eine Klasse: http://pastebin.com/aLzbLPnT
>
> Der Compiler gibt folgendes aus:
>
>> In file included from intelligent_program.cpp:11:0:
>> person.class.h: In Elementfunktion ᅵstd::string > Person::getAttribute(std::string)ᅵ:
>> person.class.h:35:17: Fehler: switch-Grᅵᅵe ist keine Ganzzahl
>> Kompilierung fehlgeschlagen.
>
> Ich habe die Switch-Case Schleife richtig erstellt. Ich habe ihr den
> Parameter ᅵbergeben der nach ᅵbereinstimmung untersucht werden soll.
>
> Kᅵnnt ihr mir helfen?
>
> Maik

Hallo Community,

mittlerweile kenne ich den Fehler. Ich habe vergessen, oder eher nicht
gewusst, dass switch nur Ganzzahlen oder char-Zeichen annimmt.

Ich werde das also ein bisschen modifizieren mᅵssen.

Maik Wᅵhl

Bernd Nawothnig

unread,
Dec 30, 2011, 11:38:50 AM12/30/11
to
Erstmal ist switch-case keine Schleife, sondern eine Verzweigung. Dann
bemängelt der Compiler hier zu Recht, dass Du über einen String verzweigen
willst, was nun mal in C/C++ nicht geht. Das muss, wie Du oben auch
lesen kannst, immer eine Ganzzahl sein.




Bernd

--
"Die Antisemiten vergeben es den Juden nicht, dass die Juden Geist
haben - und Geld." [Friedrich Nietzsche]

Stefan Haller

unread,
Dec 30, 2011, 2:55:40 PM12/30/11
to
Maik Wöhl wrote:

> ich habe hier eine Klasse: http://pastebin.com/aLzbLPnT
>
> Der Compiler gibt folgendes aus:
[...]
>> person.class.h:35:17: Fehler: switch-Größe ist keine Ganzzahl
[...]
> Könnt ihr mir helfen?

Die Antwort steht schon ziemlich Klartext im Betreff:
Deine Switch-Größe ist keine Ganzzahl.
Deine Switch-Größe "name" ist ein String, und das geht nicht.
Erlaubt wären hier z.B. bool, integer, char oder auch Werte aus einem
enum.

Gruß
Stefan

Thomas Koller

unread,
Dec 30, 2011, 3:40:51 PM12/30/11
to
Steht doch alles in der Fehlermeldung.
case "firstName" funktioniert in C und C++ nicht.

Für switch-case darfst du nur Zahlen nehmen. Und strings
sind nunmal keine Ganzzahlen.

Tom

Thomas Maeder

unread,
Dec 30, 2011, 10:42:34 AM12/30/11
to
Maik Wöhl <maik....@googlemail.com> writes:

> Könnt ihr mir helfen?

Reduziere bitte, bis zu beim kleinstmöglichen Programm bist, für
welches der Compiler diese Fehlermeldung produziert.

Wenn Du bis da den Fehler nicht gefunden hast, poste dieses
kleinstmögliche Programm hier.

--- Posted via news://freenews.netfront.net/ - Complaints to ne...@netfront.net ---

Thorsten Nitz

unread,
Dec 30, 2011, 12:46:47 PM12/30/11
to
Am 30.12.2011 11:44, schrieb Maik Wöhl:

> ich habe hier eine Klasse: http://pastebin.com/aLzbLPnT

Dort steht:

string Person::getAttribute(string name)
{
switch (name)
{
case "firstName":
return this->firstName;
break;
[...]

> Der Compiler gibt folgendes aus:
>> person.class.h:35:17: Fehler: switch-Größe ist keine Ganzzahl

Genau. name ist keine Ganzzahl, sondern ein String. Und das ist genau
der Fehler: in der switch-Anweisung sind nur Ganzzahl-Typen zulässig. In
den case-Labeln sind nur Ganzzahl-Compilezeit-Konstanten zulässig.
Ganzzahltypen sind short, int, long, char, bool und die signed- und
unsigned-Varianten davon.

Das, was Du vorhast, geht nicht. Im einfachsten Fall behilfst Du Dir
stattdessen mit if-Anwisungen:

if( name == "firstName" )
{
return this->firstName;
}
else if( name =0 "lastName" )
{
return this->lastName;
} // usw.

> Ich habe die Switch-Case Schleife richtig erstellt.

Eine switch-Anweisung ist keine Schleife. Schleifen sind Programmteile,
die wiederholt ausgeführt werden. Der allgemeine Begriff für
Anweisungen, die Programmteile bedingt ausführen, ist "Steueranweisung".

Tschö, wa!
Thorsten

Martin Winkler

unread,
Dec 30, 2011, 1:01:33 PM12/30/11
to
On 30.12.2011 11:44, Maik Wöhl wrote:
> Hallo Community,
>
> ich habe hier eine Klasse: http://pastebin.com/aLzbLPnT
>
> Der Compiler gibt folgendes aus:
>
>> In file included from intelligent_program.cpp:11:0:
>> person.class.h: In Elementfunktion »std::string> Person::getAttribute(std::string)«:
>> person.class.h:35:17: Fehler: switch-Größe ist keine Ganzzahl
>> Kompilierung fehlgeschlagen.
>
> Ich habe die Switch-Case Schleife richtig erstellt.

Nein. Wie die von dir zitierte Fehlermeldung aussagt, braucht switch
einen Ganzzahltyp (also int oder einen Aufzählungstyp) als Selektor.
Das, was du erreichen möchtest (eine vergleichbare Logik mit Strings),
kannst du mit if/else erreichen, also etwa so:

if ( name == "firstname" )
{
// irgendwas
}
else if ( name = "lastname" )
{
// irgendwas
}
else if ( // usw...

> Könnt ihr mir helfen?
>
> Maik


Ich hoffe, damit ist das klarer.

Kleine Stilkritik zu deinem Beispiel am Rande:

Da du in einzelnen case-Zweigen return-Statements hast, welche die
Funktion sofort verlassen, ist der darauffolgende break bedeutungslos,
weil er nie erreicht wird.

Falls keine Übereinstimmung gefunden wird, machst du ein "return 0;".
Der Rückgabewert deiner Funktion ist aber (std:: ? ) string.
Wahrscheinlich möchtest du eher return "" (oder return std::string() ),
um einen Leerstring zurückzugeben.

Gruß
Martin

Maik Wöhl

unread,
Dec 30, 2011, 4:22:31 PM12/30/11
to
Ach Gott, wieso spuckt Thunderbird die ganzen Meldungen alle erst heute
Abend aus?

Mittlerweile habe ich auch begriffen, was es mit Switch-Case auf sich
hat. Sollte vorher eigentlich mal nachschauen. Habe das ganze jetzt per
int-Zahlen gelöst.

Ich habe mir auch das Buch "C++ - Grundlagen" von Galileo Computing
gekauft, gerade ganz billig für 9,90€ zu haben. Und als Nachschlagewerk
reicht das.

Aber danke für die Tolle Hilfe.

Maik

Stefan Reuther

unread,
Dec 31, 2011, 6:25:19 AM12/31/11
to
Maik Wöhl wrote:
> Am 30.12.2011 21:40, schrieb Thomas Koller:
>>Maik Wöhl <maik....@googlemail.com> wrote:
>>>Könnt ihr mir helfen?
>>
>>Für switch-case darfst du nur Zahlen nehmen. Und strings
>>sind nunmal keine Ganzzahlen.
>
> Ach Gott, wieso spuckt Thunderbird die ganzen Meldungen alle erst heute
> Abend aus?

Weil das eine Newsgroup ist, eine moderierte noch dazu, und kein Chat :-)

> Mittlerweile habe ich auch begriffen, was es mit Switch-Case auf sich
> hat. Sollte vorher eigentlich mal nachschauen. Habe das ganze jetzt per
> int-Zahlen gelöst.

Wenn du dem Nutzer deiner Methode die Auswahl aus einer begrenzten Menge
Werte geben willst, ist üblicherweise ein enum die beste Wahl.

enum Attribute {
firstName,
lastName,
age,
birthday
};

Gute Compiler warnen dann auch, wenn du ein Attribut hinzufügst und dann
in irgendeinem switch() über die Attribute vergisst, dieses zu behandeln.

Ansonsten würdest du für die Dateien "std_lib_facilities.h" und
"person.class.h" in realen Projekten gesteinigt.
<https://github.com/daemonTutorials/dt_tutorial_listings/tree/2fe367824eaff055b705a0067692244459bee9b4/c++/intelligent_program.d>
- 'using namespace std' in Headern ist verboten[tm]
- '#include <iostream>' in Headern ist zu vermeiden
- "person.class.h" definiert eine Klasse und dazugehörige Member.
Das passt nicht zusammen.
+ entweder die Member in eine "person.class.cpp"
+ oder die Member inline
+ oder die Datei umbenennen in "person.class.cpp" und die Klasse in
einen anonymen Namensraum
So, wie das dasteht, gibt das Linkerfehler, sobald zwei .cpp's die
"person.class.h" einbinden, weil du dann zwei Definitionen der
Member hast.

(Ansonsten ist es in Newsgroups gern gesehen, den Code auf ein
compilierfähiges Minimalbeispiel zu reduzieren und dieses zu posten,
anstatt auf eine Webseite zu verlinken. Oftmals findet man den Fehler
dadurch auch selbst. Vielleicht auch deswegen ist hier weniger los als
in bunten Foren und Chats.)

> Ich habe mir auch das Buch "C++ - Grundlagen" von Galileo Computing
> gekauft, gerade ganz billig für 9,90€ zu haben. Und als Nachschlagewerk
> reicht das.

Zu Galileo fällt mir spontan nur
<http://openbook.galileocomputing.de/c_von_a_bis_z/>, was zwar nicht
perfekt war, aber auch nicht ganz schlecht.

Unübertroffen als Referenz ist immer noch der Stroustrup.


Stefan

Maik Wöhl

unread,
Dec 31, 2011, 8:27:07 AM12/31/11
to
Am 31.12.2011 12:25, schrieb Stefan Reuther:
> Maik W�hl wrote:
>> Am 30.12.2011 21:40, schrieb Thomas Koller:
>>> Maik W�hl <maik....@googlemail.com> wrote:
>>>> K�nnt ihr mir helfen?
>>>
>>> F�r switch-case darfst du nur Zahlen nehmen. Und strings
>>> sind nunmal keine Ganzzahlen.
>>
>> Ach Gott, wieso spuckt Thunderbird die ganzen Meldungen alle erst heute
>> Abend aus?
>
> Weil das eine Newsgroup ist, eine moderierte noch dazu, und kein Chat :-)
>
>> Mittlerweile habe ich auch begriffen, was es mit Switch-Case auf sich
>> hat. Sollte vorher eigentlich mal nachschauen. Habe das ganze jetzt per
>> int-Zahlen gel�st.
>
> Wenn du dem Nutzer deiner Methode die Auswahl aus einer begrenzten Menge
> Werte geben willst, ist �blicherweise ein enum die beste Wahl.
>
> enum Attribute {
> firstName,
> lastName,
> age,
> birthday
> };
>
> Gute Compiler warnen dann auch, wenn du ein Attribut hinzuf�gst und dann
> in irgendeinem switch() �ber die Attribute vergisst, dieses zu behandeln.
>
> Ansonsten w�rdest du f�r die Dateien "std_lib_facilities.h" und
> "person.class.h" in realen Projekten gesteinigt.
> <https://github.com/daemonTutorials/dt_tutorial_listings/tree/2fe367824eaff055b705a0067692244459bee9b4/c++/intelligent_program.d>
> - 'using namespace std' in Headern ist verboten[tm]
> - '#include <iostream>' in Headern ist zu vermeiden
> - "person.class.h" definiert eine Klasse und dazugeh�rige Member.
> Das passt nicht zusammen.
> + entweder die Member in eine "person.class.cpp"
> + oder die Member inline
> + oder die Datei umbenennen in "person.class.cpp" und die Klasse in
> einen anonymen Namensraum
> So, wie das dasteht, gibt das Linkerfehler, sobald zwei .cpp's die
> "person.class.h" einbinden, weil du dann zwei Definitionen der
> Member hast.
>
> (Ansonsten ist es in Newsgroups gern gesehen, den Code auf ein
> compilierf�higes Minimalbeispiel zu reduzieren und dieses zu posten,
> anstatt auf eine Webseite zu verlinken. Oftmals findet man den Fehler
> dadurch auch selbst. Vielleicht auch deswegen ist hier weniger los als
> in bunten Foren und Chats.)
>
>> Ich habe mir auch das Buch "C++ - Grundlagen" von Galileo Computing
>> gekauft, gerade ganz billig f�r 9,90� zu haben. Und als Nachschlagewerk
>> reicht das.
>
> Zu Galileo f�llt mir spontan nur
> <http://openbook.galileocomputing.de/c_von_a_bis_z/>, was zwar nicht
> perfekt war, aber auch nicht ganz schlecht.
>
> Un�bertroffen als Referenz ist immer noch der Stroustrup.
>
>
> Stefan


So, jetzt habe ich die Klasse Person in den namespace PersonNS gepackt.
Ich habe die std_lib_facilities gel�scht.
Der einzige include in der person.class.h ist die f�r <string>.

Jetzt ist alles sch�n getrennt.

Kurze Frage: Wie macht man in diesem Fall mit dem Switch-Case Problem,
was ja kein Problem mehr ist, ein Minimalbeispiel?

Bernd Nawothnig

unread,
Dec 31, 2011, 5:53:17 AM12/31/11
to
On 2011-12-30, Maik Wöhl wrote:

> Ach Gott, wieso spuckt Thunderbird die ganzen Meldungen alle erst
> heute Abend aus?

Weil das eine moderierte Gruppe ist. Jedes Posting muss erst durch
einen Moderator genehmigt werden, bevor es öffentlich lesbar wird.

Maik Wöhl

unread,
Dec 31, 2011, 7:34:17 AM12/31/11
to
Am 31.12.2011 12:25, schrieb Stefan Reuther:
Ich werde deine Ratschläge befolgen. Mittlerweile hat sich das
switch-Problem gelöst. Nun liegt der Fehler aber in der Klasse selbst.

Ich werde mal die Optimierungen durchführen und dann mal schauen, ob es
ein Linkerfehler war oder nicht.

Maik

Martin Winkler

unread,
Dec 31, 2011, 8:30:10 AM12/31/11
to
On 30.12.2011 19:01, Martin Winkler wrote:
> else if ( name = "lastname" )
Ich meine natürlich:
else if ( name == "lastname" )

Böser Tippfehler...
Gruß
Martin
0 new messages