comparision between signed unsigned in for loop



  • Hi

    Ich frage mich gerade was die richtige Vorgehensweise ist wenn ich diese Fehlermeldung bekomme:

    warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(j=0;j<im.cols;j++)
                  ^
    

    Kongret geht es um diesen Code in dem ich via OpenCV ein Image Objekt erstelle
    und mit imread() ein Bild einlese.

    im = cv::imread(filename.toStdString(), cv::IMREAD_UNCHANGED);
    

    später muss ich durch die Anzahl der Spalten des Bildes "im.cols" iterieren, ich mache das mit einem for-loop:

    unsigned int j;
    for(j=0;j<im.cols;j++)
        {...}
    

    Da aber "im.cols" negativ (-1) werden kann wenn das Bild nicht erfolgreich eingelesen werden kann vergleiche ich logischerweise signed mit unsigned. Kann ich den counter einfach signed machen oder kann da was schlechtes passieren?



  • signed ist der Regelfall für for-Schleifen. Ob etwas passieren kann hängt von ... ab.



  • Dann solltest du zwingend den Counter j als signed deklarieren, denn bei unsigned würde sonst j < -1:

    #include <iostream>
    using namespace std;
    
    int main()
    {	
    	unsigned int j = 0;
    	int cols = -1;
    
    	if (j < cols)
    	   cout << "ups" << endl;
    
    	return 0;
    }
    

    (s.a. Ideone-Code)



  • Ok, dann ändere ich das auf signed, auf jeden Fall wird in dem for-loop nichts an den "im.cols" geändert, wenn das überhaupt möglich wäre...

    Danke erstmal!



  • pauledd schrieb:

    auf jeden Fall wird in dem for-loop nichts an den "im.cols" geändert

    Das j ist an dieser Stelle viel interessanter.



  • manni66 schrieb:

    signed ist der Regelfall für for-Schleifen.

    wo hast du das denn her?



  • zufallswert schrieb:

    manni66 schrieb:

    signed ist der Regelfall für for-Schleifen.

    wo hast du das denn her?

    Mehr optimierungspotential für den Compiler, da bei unsigned immer modulo gerechnet werden muss.



  • Beispiel?



  • Zum Optimierungspotential fand ich das hier sehr erhellend:
    https://youtu.be/yG1OZ69H_-o?t=2355 (ca. 5 minuten ab dieser Stelle)

    Ansonsten noch:
    https://stackoverflow.com/questions/18795453/why-prefer-signed-over-unsigned-in-c

    Generell wäre mir auch lieber, wenn vector::size etc "signed size_t" liefern würden. Zumal auch auch eine 3rd-Pary-Komponente nutze, bei der alle Größen signed sind. Immer, wenn ich diese zusammen mit der STL verwende, gibt es dieses nervige signed/unsigned-Problem 😞


Log in to reply