Home > Net >  C : Vector value resets efter exiting if-statement
C : Vector value resets efter exiting if-statement

Time:09-23

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;
        }
  • Related