"std::numeric_limits<int>::min()" und "Error stray 264"



  • Hallo ihr C++ Könner,

    ich bin ein wirklicher C++ Neuling und bitte euch um Hilfe. Ich benutze den Compiler Dev-C++5.11

    Folgendes Beispiel habe ich aus meinem Buch "Grundkurs C++" von Jürgen Wolf.
    Leider funktioniert es nicht. Ich würde gerne verstehen warum.

    1 //listings/003/listing005.cpp
    2 #include <iostream>
    3 #include <limits> // std::numeric_limits
    4
    5 int main() {
    6 std::cout << std::numeric_limits<int>::min() << ´\n´;
    7 std::cout << std::numeric_limits<int>::max() << ´\n´;
    8 std::cout << std::numeric_limits<int>::digits << ´\n´;
    9 std::cout << std::numeric_limits<int>::is_signed << ´\n´;
    10 std::cout << std::numeric_limits<float>::digits10 << ´\n´;
    11 std::cout << std::numeric_limits<double>::digits10 << ´\n´;
    12 std::cout << std::numeric_limits<long double>::digits10 << ´\n´;
    13 std::cout << std::numeric_limits<char>::digits << ´\n´;
    14 std::cout << std::numeric_limits<unsigned char>::digits << std::endl;
    15 return 0;
    16 }

    Meine Fragen:

    a) Was kann ich beispielsweise in die runden Klammern in Zeile 6 bzw. 7 einfügen ? Ich vermute da muss was rein !

    b) Mein Compiler sagt "[Error] stray 264" für Zeilen 6-13: Was bedeutet das ?

    Ich habe versucht das mit Google zu beantworten, bin aber nicht fündig geworden. Ich bitte daher um eure Hilfe 🙂

    Viele Grüße



  • Hi,

    nehm anstatt ´\n´ "\n" (also richitge Anführungszeichen), dann wird dein Compiler das auch schlucken.

    Zu dem Buch möchte ich dir noch zwei Threads hier ans Herzen legen:

    Bücher von Jürgen Wolf sind zum Lernen ungeeignet

    Bücher und Tutorials zu C++



  • Schlangenmensch schrieb:

    nehm anstatt ´\n´ "\n" (also richitge Anführungszeichen), dann wird dein Compiler das auch schlucken.

    Einfache Anführungszeichen ( ' ) gehen auch, aber weder ``` noch ´ .

    Der Unterschied ' zu doppelten " ist:
    ' umschließen ein einzelnes Zeichen (genau ein char)
    " umschließen eine Zeichenkette beliebiger Länge (auch 0 oder 1 Zeichen).

    Da '\n' ein Zeichen ist und man sowohl einzelne Zeichen als auch Zeichenketten ausgeben kann, funktioniert hier beides.

    PS: der Imperativ zu nehmen ist "nimm!"



  • wob schrieb:

    ' umschließen ein einzelnes Zeichen (genau ein char)

    Das ist nicht korrekt.



  • pedantischer Klaus schrieb:

    wob schrieb:

    ' umschließen ein einzelnes Zeichen (genau ein char)

    Das ist nicht korrekt.

    Spannend. Wusste ich gar nicht.

    Aus n4296 2.13.3:

    An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharacter literal, or an ordinary character literal containing a single c-char not representable in the execution character
    set, is conditionally-supported, has type int, and has an implementation-defined value.

    Was ist denn hier der Usecase?

    Ich bekomme da beim Compilieren warning: multi-character character constant [-Wmultichar] , mit Werror kompiliert es also nicht.



  • danke euch! Schlangenmensch hatte recht: mit "\n" anstatt ´\n´ kompiliert es problemlos bei mir 🙂 🙂

    Hat jmd noch eine Webseite auf der man nachsehen kann was die error stray codes (also z.B. error stray 264) bedeuten ?



  • Chikkomama schrieb:

    Hat jmd noch eine Webseite auf der man nachsehen kann was die error stray codes (also z.B. error stray 264) bedeuten ?

    264 ist der Wert des Bytes im Quelltext, mit dem der Compiler nichts anfangen kann, in oktaler Schreibweise. In dezimal wäre das 180. Das ist Unicode für das Akut-Zeichen (´).


  • Mod

    wob schrieb:

    Aus n4296 2.13.3:

    An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharacter literal, or an ordinary character literal containing a single c-char not representable in the execution character
    set, is conditionally-supported, has type int, and has an implementation-defined value.

    Was ist denn hier der Usecase?

    Du kannst dir damit zum Beispiel eine Art enum basteln, ohne den aktuellen Namespace mit unnötigen Bezeichnern zu verseuchen (denk an C, welches kein enum class kennt):

    int color = 'rot';
    
    switch(color)
    {
      case 'rot': ...
      case 'gelb': ...
      case 'blau': ...
    }
    

    Man sollte aber große Vorsicht walten lassen, wenn man dies tut. In C++ gibt es wohl immer besser Sprachmittel für den gleichen Effekt und in C muss man aufpassen, dass man nicht über die Fallstricke der Unportabilität stolpert.



  • Chikkomama schrieb:

    danke euch! Schlangenmensch hatte recht: mit "\n" anstatt ´\n´ kompiliert es problemlos bei mir 🙂 🙂

    Hat jmd noch eine Webseite auf der man nachsehen kann was die error stray codes (also z.B. error stray 264) bedeuten ?

    Aber '\n' anstatt ´\n´ ist besser.

    VG



  • Chikkomama schrieb:

    ...
    Meine Fragen:

    a) Was kann ich beispielsweise in die runden Klammern in Zeile 6 bzw. 7 einfügen ? Ich vermute da muss was rein !
    ...

    Nein, da muss nichts rein. std::numeric_limits::min() und std::numeric_limits::max() sind statische Methoden, die für den jeweiligen Template-Typen spezialisiert sind und den minmalen bzw. maximalen Wert des Template-Typen zurückgeben. Vermutlich verwechselst du die Methoden mit den Funktionen std::min und std::max , die jeweils zwei Parameter erwarten und das Minimum bzw. Maximum zurückgeben. Das ist aber etwas völlig anderes.



  • Danke 😃 Fragen beantwortet, so kann ich weiter machen ....


Log in to reply