I need to overwrite values in a 2D vector, where the new values is simply just equal to an integer I am counting up. But as soon as I exit this if-statement, the value resets to the original value? I think it may have something to do with the indexing, but I just can't figure it out
So I fill up the vector with either -1 or 0's
vector<vector<int>> P(225, vector<int>(225, 0));
for (int i = 0; i < 225; i ) {
for (int j = 0; j < 225; j ) {
if (img.at<uchar>(i, j) >= 220) {
P[i][j] = -1;
}
else {
P[i][j] = 0;
}
}
}
Where
img.at<uchar>(i, j)
is essentially just an array I check values from, with the same size as the vector. This works fine
Then I go through the vector again, to check for all -1's, and each time if either the vector index above or to the left of [i][j] is 0, I count up integer "bin", which I now want to place as the value on spot [i][j]
for (int i = 1; i < 225; i ) {
for (int j = 1; j < 225; j ) {
if ((P[i][j - 1] == 0) && (P[i - 1][j] == 0) && P[i][j] == -1) {
bin ;
P[i][j] = bin;
}
cout << P[i][j] << endl;
}
}
But right after it exits the if-statement, it just forgets the new value assigned to it? I know the bin integer goes up too, I have printed that out at well, so atleast some of the vector values should be changed, when the specific situation occurs. But they all just go back to 0's and -1's again, as if it never went through the if-statement
I hope my explanation is understandable
Minimalistic test-program: When I run this code that uses basic iostream components, same problem occurs. I think it may be a bug from my side at this point
#include <iostream>
using namespace std;
using namespace cv;
int main() {
int bin = 0;
vector<vector<int>> P(20, vector<int>(20, 0));
for (int i = 0; i < 20; i ) {
for (int j = 0; j < 20; j ) {
if (j > 15) {
P[i][j] = 0;
}
if (j <= 14 && j >= 9) {
P[i][j] = -1;
}
if (j < 9) {
P[i][j] = 0;
}
}
}
for (int i = 1; i < 20; i ) {
for (int j = 1; j < 20; j ) {
if ((P[i][j-1] == 0) && (P[i-1][j] == 0) && P[i][j] == -1) {
bin ;
P[i][j] = bin;
}
cout << P[i][j] << endl;
}
}
}
CodePudding user response:
Here
if ((P[i][j - 1] == 0) && P[i][j] == -1) {
you are looking for a 0
that comes before -1
, but you fill those vectors with -1
followed by 0
CodePudding user response:
Here:
if (j > 120) {
P[i][j] = 0;
}
if (j < 120) {
P[i][j] = -1;
}
You assing -1
to all elements with j<120
and 0
to elements with j > 120
(element at j=120
is already 0
).
This means you have P[i][119] == -1
and P[i][120] == 0
:
j ---> ... 119 120 ...
-1 -1 -1 -1 -1 -1 0 0 0 0 0
Then you try to find an element where P[i][j - 1] == 0) && P[i][j] == -1)
, ie a 0
followed by a -1
, but such element does not exist.
You can verify this by using a debugger or by adding some print outs:
if ((P[i][j - 1] == 0) && P[i][j] == -1) {
std::cout << "this will never be printed, because condition is never true\n";
bin ;
P[i][j] = bin;
}