Ein merkwürdiger Fehler

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Ein merkwürdiger Fehler

Beitrag von Kmitska » Fr Jun 15, 2012 4:00 pm

Hallo Leute,

kann mir jemand dies erklären bzw. sagen, wieso mein Compiler meckert?

Code:

Code: Alles auswählen

if(a.find("</body>") != -1){
            break;
        }
Fehler:
Vergleich zwischen vorzeichenbehafteten und vorzeichenlosen Ganzzahlausdrücken [-Wsign-compare]|
Was ich daraus verstehe:
-1 ist negativ und a.find() liefert bei Erfolg eine positive Zahl aus.
Doch, wie kann ich das sonst noch vergleichen?
Und unter MS Windows gab's kein Problem.

Danke im Voraus.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Ein merkwürdiger Fehler

Beitrag von fat-lobyte » Fr Jun 15, 2012 4:16 pm

Es geht nicht um den Wert der Zahlen, sondern um den Datentypen der Variablen.

.find() gibt einen unsigned (vorzeichenlose) Integer aus, -1 ist aber ein signed integer. Das ist die Warnung.


Warum ist das ein Problem?
Kuckst du, wie -1 binär repräsentiert ist:
0xFFFFFFFF
Das ist, je nach betrachtungsweise entweder -1, wenn die Variable vorzeichenbehaftet ist)oder 4294967295, wenn die Variable Vorzeichenlos ist.

Stell dir vor, du bekommst nun von find die Position 2147483649. Was ist das jetzt? ist es -2147483647 oder +2147483649? Ist das jetzt größer als -1 oder kleiner? Und genau hier ist das Problem.
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Ein merkwürdiger Fehler

Beitrag von Xin » Fr Jun 15, 2012 4:33 pm

Kmitska hat geschrieben: Was ich daraus verstehe:
-1 ist negativ und a.find() liefert bei Erfolg eine positive Zahl aus.
Doch, wie kann ich das sonst noch vergleichen?
Und unter MS Windows gab's kein Problem.
Was liefert a.find() denn aus, wenn es keinen Erfolg hat?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Re: Ein merkwürdiger Fehler

Beitrag von Kmitska » Fr Jun 15, 2012 4:48 pm

Xin hat geschrieben:
Kmitska hat geschrieben: Was ich daraus verstehe:
-1 ist negativ und a.find() liefert bei Erfolg eine positive Zahl aus.
Doch, wie kann ich das sonst noch vergleichen?
Und unter MS Windows gab's kein Problem.
Was liefert a.find() denn aus, wenn es keinen Erfolg hat?
Hab jetzt das ausprobiert:

Code: Alles auswählen

int main()
{
    string a;
    cout << a.find("aa");
    return 1;
}
Da kam:
18446744...
Da kommt doch kein -1...

Und
0xFFFFFFFF
ist -1? (Kenne mich da nciht aus)

Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Re: Ein merkwürdiger Fehler

Beitrag von Kmitska » Fr Jun 15, 2012 5:45 pm

Also, habe das nun so gelöst (falls es jemanden interessiert)

Code: Alles auswählen

if(a.find("</body>") < a.length() ){
            break;
        }
Weil a.find() bei Erfolg eine kleinere Zahl als a.length() bekommt hab ich mir erlaubt dies zu schreiben. :)
Aber mich interessiert das mit dem Binärsystem immernoch... :P

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Ein merkwürdiger Fehler

Beitrag von Xin » So Jun 17, 2012 9:33 am

Kmitska hat geschrieben: Hab jetzt das ausprobiert:

Code: Alles auswählen

int main()
{
    string a;
    cout << a.find("aa");
    return 1;
}
Da kam:
18446744...
Ich habe das gerade nochmal ausprobiert, bei mir kommt

Code: Alles auswählen

4294967295
was gleichbedeutend mit -1 ist.

Die korrekte Abfrage ist hier aber mit npos!

Code: Alles auswählen

#include <string>
#include <iostream>

using namespace std;

int main()
{
    string a;
    cout << a.find("aa") << endl;

    if( a.find("aa") == string::npos )
    {
      cout << "nicht gefunden\n";
    }

    return 1;
}
Kmitska hat geschrieben:Und
0xFFFFFFFF
ist -1? (Kenne mich da nciht aus)
Ich seh mal zu, dass wir bald 'nen Artikel darüber haben. Hex sollte schon im Wiki zu finden sein.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten