Как решить «Необъявленную ошибку идентификатора» в блоке «если»? - PullRequest
0 голосов
/ 08 октября 2019

Я создаю vector в строительном mex файле. Мне нужно создать vector<vector<int>>, размер которого соответствует входной переменной. Часть создания или объявления находится в блоке if. Мне нужно использовать эту переменную за пределами if. Тогда он имеет ошибку «необъявленный идентификатор». Я обнаружил, что должен предварительно определить переменную. Но я не знаю размер таким образом. Нужно ли определять глобальную переменную? Или любое другое предложение? Мой код ниже.

void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
int i;
if ( i == 0) // if block
    {
        mwSize Num = mxGetNumberOfElements(prhs[i]);
        vector<vector<int>> V0(Num);
    }
cout << V0.size()<<"\n"; // error
}

Это упрощенный пример кода. Мне действительно нужен блок if. Я думаю, что проблема из области переменных. Но я не нашел хороший способ ее решить.

Ответы [ 3 ]

2 голосов
/ 08 октября 2019

Ваша интуиция верна. Срок службы V0 заканчивается у закрывающей фигурной скобки вмещающей if. Объект уничтожен, а имя не отображается во внешней области видимости.

Вы можете решить проблему, переместив его за пределы if.

void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
    vector<vector<int>> V0;
    int i; // hey, this is uninitialized!
    if (i == 0) // if block
    {
        mwSize Num = mxGetNumberOfElements(prhs[i]);
        V0.resize(Num);
    }
    cout << V0.size() << "\n"; // the vector is visible here
}
1 голос
/ 08 октября 2019

Вектор V0 объявлен в вашем блоке if и существует только в этой области. Вы получаете доступ к нему за пределами этой области.

Кроме того, вы оставили парены вне вызова на size().

0 голосов
/ 08 октября 2019

vector< vector<int>> V0(Num); Это объявлено внутри if, вы пытаетесь использовать его вне if. В этом проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...