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-cGenerell 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