1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

"case label does not reduce to an integer constant"

Dieses Thema im Forum "OS X-Developer" wurde erstellt von cormare, 07.02.09.

  1. cormare

    cormare Golden Delicious

    Dabei seit:
    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
     
    #1 cormare, 07.02.09
    Zuletzt bearbeitet: 07.02.09
  2. bezierkurve

    bezierkurve Danziger Kant

    Dabei seit:
    12.06.05
    Beiträge:
    3.861
    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.
     
  3. s23

    s23 Seidenapfel

    Dabei seit:
    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.
     
  4. cormare

    cormare Golden Delicious

    Dabei seit:
    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...
     
  5. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Ist es aber nicht.

    MacApple
     
  6. Jamsven

    Jamsven London Pepping

    Dabei seit:
    21.11.07
    Beiträge:
    2.046
    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
    
     
    #6 Jamsven, 08.02.09
    Zuletzt bearbeitet: 08.02.09
  7. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    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.
     
  8. s23

    s23 Seidenapfel

    Dabei seit:
    23.11.08
    Beiträge:
    1.333
    Ja, in der Tat. C ist schon ein wenig her. Das kommt davon, wenn man nur noch mit PHP arbeitet. o_O
     
  9. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    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
     
  10. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.252
    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;
    }
    
     
  11. cormare

    cormare Golden Delicious

    Dabei seit:
    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
     
  12. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    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
     
  13. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.252
    Der Typ von Koerper ist nicht im Codeschnipsel enthalten.
     
  14. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
    Ich glaube, der wird vorher schon als "char *" definiert... :)
     
  15. cormare

    cormare Golden Delicious

    Dabei seit:
    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 =)

    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:

     
    #15 cormare, 09.02.09
    Zuletzt bearbeitet: 09.02.09
  16. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.252
    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;
    } 
    
     
  17. cormare

    cormare Golden Delicious

    Dabei seit:
    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
     
  18. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.252
    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.
     

Diese Seite empfehlen