Kai
Kai

Reputation: 57

use of 'n' before deduction of 'auto' C++

I'm trying to have my function return 3 values (n, down and across) I've read online how 'auto' can be used but must be doing something wrong. The function takes in a 2D vector of integers (as well as other variables) and checks for how many numbers are connected to board[0][0] such that they are the same number. I've tried putting auto in front of the function inside the function itself, tried leaving it blank, tried just having chain = chainNodes(...) but I always seem to get an error. Here's the code:

tuple<int, int, int> chainNodes(vector<vector<int>> board, int originalNum,
                                unsigned int across, unsigned int down, int ijSum,
                                int n)
{
    struct chain {
        int n, down, across;
    };

    if(down + across > ijSum) {
        ijSum = down + across;
    } else if((down + across == ijSum) &&
              ((down - across) * (down - across) < (ijSum) * (ijSum))) {
        ijSum = down + across;
    }

    board[down][across] = 0;
    n += 1;

    // Check below
    if((down != (board.size() - 1)) && (board[down + 1][across]) == originalNum) {
        down += 1;
        auto [n, iPoint, jPoint] = chainNodes(board, originalNum, across, down, ijSum, n);
        down -= 1;
    }
    // Check right, up and left (I've removed so its not too messy here)

    return chain{n, down, across};
}

Sorry, I forgot to include the error message. error: use of 'n' before deduction of 'auto' It occurs on the line that uses auto.

Upvotes: 0

Views: 485

Answers (1)

Jarod42
Jarod42

Reputation: 217850

Issue with

auto [n, iPoint, jPoint] = chainNodes(board, originalNum, across, down, ijSum, n);

is similar to

auto n = foo(n); // `foo(n)` uses `n` from `auto n`,
                 // not the one from outer scope as function parameter

The construct int a = a + 1; is legal but lead to UB as reading uninitialized variable.

That kind of construct allows legal and valid behavior void* p = &p;.

Your code has other errors and it is not clear for me expected behavior of the function.

So not sure if following is the correct fix, but you might want:

n = std::get<0>(chainNodes(board, originalNum, across, down, ijSum, n));

Upvotes: 4

Related Questions