• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

"case label does not reduce to an integer constant"

cormare

Golden Delicious
Registriert
07.02.09
Beiträge
10
Hallo,

ich suche schon seit einer weile nach der lösung für ein problem.
und zwar habe ich vor zwei wochen mit xcode angefangen mal ein bisschen was auszuprobieren.und jetzt habe ich mein erstes größeres problem...

das ist mein quelltext dazu:

#include <iostream>
using namespace std;
int main (int argc, char * const argv[])

{ anfang:

char masseinheit [20];
char Koerper;
int seitenlaenge;
int oberflaecheninhalt;
int volumen;

cout << "was für eine maßeinheit benutzen sie? ";
cin >> masseinheit;
cout << "was für einen körper wollen sie berechnen? ";
cin >> Koerper ;

switch ( Koerper)
{
case "wuerfel":
cout << "wie ist die seitenlänge ihres würfels? ";
cin >> seitenlaenge;
break;
case "quader":
cout << "wieso kein würfel quader kann ich noch nicht";
break;
}

oberflaecheninhalt = seitenlaenge * seitenlaenge * 6;
volumen = seitenlaenge * seitenlaenge * seitenlaenge;

cout << "der oberflächeninhalt beträgt " << oberflaecheninhalt << masseinheit << "^2" << endl;
cout << "das volumen beträgt " << volumen << masseinheit << "^3" << endl;



return 0;
}


und jetzt mein problem:
es gibt in den roten zeilen die fehlermeldung "case label does not reduce to an integer constant" was muss ich ändern damit das projekt funktioiert?

ich hoffe einer kann mir helfen...

danke,
lg cormare
 
Zuletzt bearbeitet:

bezierkurve

Halberstädter Jungfernapfel
Registriert
12.06.05
Beiträge
3.860
Abend!

switch kannst du nicht mit Strings verwenden, nur char oder int würden funktionieren. Wenn du bei deiner Variante bleiben willst, musst du das switch-Statement durch if-Abfragen ersetzen.
 

s23

Seidenapfel
Registriert
23.11.08
Beiträge
1.333
Also switch sollte schon mit Strings verwendbar sein. Nur macht er oben eine Auswahl via Switch über "Körper" udn hat das als Integer definiert. Die Abfrage macht er dann aber über Strings. Daran scheitert es.
 

cormare

Golden Delicious
Registriert
07.02.09
Beiträge
10
boa wie schnell ihr hier seid... o_O

ja am anfang hatte ich das mal mit if probiert aber da kam auch irgendein fehler.
ich probiers nochmal und guck was der dann sagt...
 

Jamsven

London Pepping
Registriert
21.11.07
Beiträge
2.046
Ist es aber nicht.

MacApple

Sehe ich auch so, ein String ist ja kein primitiver Datentyp, den man so einfach vergleichen kann.

  1. Ist char EIN Zeichen
  2. Wenn man ein char-Array über den Bezeichner vergleichen will, nimmt der Compiler die Speicheradresse.

Ich würde bei char-Arrays das so schreiben:
Code:
char* Koerper;
.
.
.
if(strcmp(Koerper, "wuerfel"))
....usw schreiben
 
Zuletzt bearbeitet:

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
Ein Switch funktioniert in der Tat nicht über Strings. Das macht er aber auch nicht. Obiger Code hat nämlich nicht den Vergleich von Strings als Semantik, sondern den Vergleich von String-Zeigern. Das will er mutmaßlich aber nicht.

In der Tat liegen hier zudem die bereits benannten Fehler vor: Es wird ein Char (der wiederum ein Int ist), mit einem Zeiger verglichen.

@OP: Wenn du wirklich hier den Text vergleichen willst, musst du

a) entweder mit if und strncmp arbeiten
b) Stringkonstanten definieren, die zugewiesen werden.

*C* ist nicht PHP.
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Und wie immer zeigt sich: Die Fehlermeldungen von gcc sind vollkommen ausreichend ;)

Natürlich lässt sich ein String nicht auf eine Intergerkostante reduzieren.

Alex
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
ich hoffe einer kann mir helfen...

Also, die bisherigen Antworten waren schon richtig. std::string erlaubt den Vergleich von Strings mit Zeichenketten, so daß man das Problem ungefähr so formulieren kann.
Code:
#include <iostream>
#include <string>

using namespace std;

int main () {
        std::string     Koerper;

        char    masseinheit [20];
        int             seitenlaenge;
        int             oberflaecheninhalt;
        int             volumen;

        cout << "was für eine maßeinheit benutzen sie? ";
        cin >> masseinheit;
        cout << "was für einen körper wollen sie berechnen? ";
        cin >> Koerper ;

        if (Koerper == "wuerfel") {
                cout << "wie ist die seitenlänge ihres würfels? ";
                cin >> seitenlaenge;
        } else if (Koerper == "quader") {
                cout << "wieso kein würfel quader kann ich noch nicht";
        }

        oberflaecheninhalt = seitenlaenge * seitenlaenge * 6;
        volumen = seitenlaenge * seitenlaenge * seitenlaenge;

        cout << "der oberflächeninhalt beträgt " << oberflaecheninhalt << masseinheit << "^2" << endl;
        cout << "das volumen beträgt " << volumen << masseinheit << "^3" << endl;
}
 

cormare

Golden Delicious
Registriert
07.02.09
Beiträge
10
Ja, das war alles schon sehr hilfreich, danke.
Aber eins hab ich noch wenn ich das jetz so schreibe:


if (strcmp(Koerper,"wuerfel"))
{
oberflaecheninhalt = seitenlaenge * seitenlaenge * 6;
volumen = seitenlaenge * seitenlaenge * seitenlaenge;

cout << "der oberflächeninhalt beträgt " << oberflaecheninhalt << masseinheit << "^2" << endl;
cout << "das volumen beträgt " << volumen << masseinheit << "^3" << endl;
}
else
{
cout << "ungültig " << endl;
}

dann sagt er mir wenn ich als Körper wuerfel eingebe "ungültig" wie krieg ich das noch hin, dann is alles gut.

lg cormare
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Internet-Doku: (--> Link)

Return Value

Returns an integral value indicating the relationship between the strings:
A zero value indicates that both strings are equal.
A value greater than zero indicates that the first character that does not match has a greater value in str1 than in str2; And a value less than zero indicates the opposite.

Die if-Verzweigung führt den Code unter if aus, wenn die Bedingung 1 ergibt, den Code unter else, wenn sie 0 ergibt. Jetzt ist es so, dass strcmp() 0 zurückgibt, wenn die strings gleich sind. Also wäre die korrekte Verzweigung so zu formulieren, wenn du unter if den true-Code schreibst:

if (!strcmp(str1, str2)) { // "!" kehrt den Rückgabewert um... (0 --> 1 / ungleich 0 --> 0)
// True-Code​
} else {
// False-Code​
}

Gruss, ppocket
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Ich glaube, der wird vorher schon als "char *" definiert... :)
 

cormare

Golden Delicious
Registriert
07.02.09
Beiträge
10
ja genau...char*.
ich dachte das wär klar.

Aber das von poljpocket hats schon getan.
Trotzdem seid ihr mich noch nicht los^^, aber bald geb ich echt Ruhe =)

#include <iostream>
#include <string>
using namespace std;
int main (int argc, char * const argv[])
{ anfang:

char* masseinheit;
char* Koerper;
int seitenlaenge;
int oberflaecheninhalt;
int volumen;


cout << "was für eine maßeinheit benutzen sie? ";
cin >> masseinheit;

cout << "was für einen körper wollen sie berechnen? ";
cin >> Koerper ;

if (!strcmp(Koerper, "wuerfel"))
{
cout << "was für eine seitenlänge hat ihr würfel? ";
cin >> seitenlaenge;

oberflaecheninhalt = seitenlaenge * seitenlaenge * 6;
volumen = seitenlaenge * seitenlaenge * seitenlaenge;

cout << "der oberflächeninhalt beträgt " << oberflaecheninhalt << masseinheit << "^2" << endl;
cout << "das volumen beträgt " << volumen << masseinheit << "^3" << endl;
}
else
{
cout << "ungültig " << endl;
}


goto anfang;
return 0;
}
so siehts jetzt aus ,aber sobald ich die Seitenlänge eingegeben habe, bricht der ab...
warum das nun wieder?

danke...
lg cormare

p.s.: soooo sieht das dann aus:

[Session started at 2009-02-09 16:17:30 +0100.]

was für eine maßeinheit benutzen sie? zentimeter
was für einen körper wollen sie berechnen? wuerfel
was für eine seitenlänge hat ihr würfel? 3

wvjewn has exited due to signal 10 (SIGBUS).
 
Zuletzt bearbeitet:

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
ja genau...char*.
ich dachte das wär klar.
Das ist nicht klar, weil das unsinnig ist. "char*" ist ein Zeiger auf einen C-String, den Du aber gar nicht definierst! Ergo, kommt da nur Unfug bei raus. Wenn es zufällig funktioniert, dann ist das um so schlimmer.

Nochmals
Entweder Du nutzt std::string zum Einlesen der Texte, oder Du mußt anfangen Inputbuffer zu definieren. Dabei ist es wichtig die maximale Länge des Buffers mit anzugeben, da es andernfalls zu Buffer Overflows kommt -> Sicherheitslöcher.
Code:
#include <iostream>
#include <string>
using namespace std;
int main (int argc, char * const argv[]) {

anfang:

    char masseinheit[81]; // 80 Zeichnen + '\0'
    char Koerper[81]; // 80 Zeichnen + '\0'
    int seitenlaenge;
    int oberflaecheninhalt;
    int volumen;


    cout << "was für eine maßeinheit benutzen sie? ";
    cin >> std::setw(81) >> masseinheit;

    cout << "was für einen körper wollen sie berechnen? ";
    cin >> std::setw(81) >> Koerper ;

if (!strcmp(Koerper, "wuerfel")) {
    cout << "was für eine seitenlänge hat ihr würfel? ";
    cin >> seitenlaenge;

    oberflaecheninhalt = seitenlaenge * seitenlaenge * 6;
    volumen = seitenlaenge * seitenlaenge * seitenlaenge;

    cout << "der oberflächeninhalt beträgt " << oberflaecheninhalt << masseinheit << "^2" << endl;
    cout << "das volumen beträgt " << volumen << masseinheit << "^3" << endl;
} else {
    cout << "ungültig " << endl;
}

goto anfang;
}
 

cormare

Golden Delicious
Registriert
07.02.09
Beiträge
10
Naja,
tut mir ja leid aber wie gesagt mach ich das erst seit zwei Wochen und hab
deshalb noch nich so wirklich n Peil davon.

aber ist schon echt cool wie viele hier antworten und
wirklich auch helfen mit ihren Posts und mich nicht nur
runtermachen auf grund meiner großen Unwissenheit.... =)
danke nochmal...

lg cormare
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
Naja,
tut mir ja leid aber wie gesagt mach ich das erst seit zwei Wochen und hab
deshalb noch nich so wirklich n Peil davon.
Auf Grund Deiner Postings sieht man sofort, daß Du Dich noch nicht lange mit C++ beschäftigst.
In C++ kann man die C-Strings oder die std::string benutzen. Während C-Strings so einiges an Wissen abverlangen, wie man sich richtig verwendet, kümmert sich std::string um die meisten elemantaren Dinge, zum Beispiel die Speicherverwaltung. Im Falle von "cin >> koerper", ist das Verhalten extrem davon abhängig, welchen Typ "koerper" hat. Als std::string wird automatisch Speicher reserviert und die Eingabe kann so lang sein, wie das der Nutzer will. Bei einem "char*" muß vorher Speicher reserviert werden, und "cin" darf nur maximal soviel Zeichen liefern, wie der Speicher groß ist. Anschließend muß man den Speicher wieder selbst freigeben. Die Alternative, die ich Dir im letzten Beispiel gezeigt hatte, war mit einem char[] mit fester Größe. Auch hier gibt es das Problem mit der maximalen Länge der Eingabe, aber dafür muß man sich ebenfalls nicht um die Speicherverwaltung kümmern.

Bevor Du mit "char*" anfängst solltest Du Dir in Deinem Lehrmaterial das Kapitel mit Zeiger durchlesen. Für den Anfang ist aber die Benutzung von std::string definitiv vorzuziehen.