необъявленный идентификатор с использованием arrayfire

Я пишу функцию с использованием arrayfire следующим образом:

int ABC()
{

static const int Q = 5;
double A[]  = { 0.0,  1.0,  0.0, 1.0, 1.0};
double B[]  = { 0.0, -1.0, -1.0, 1.0, 0.0 };
array C (Q, 1, A);
array D (Q, 1, B);

return 0;
}

Когда я пытаюсь вызвать эту функцию как: ABC() в основной программе и попробуйте извлечь переменные C а также D и хотите распечатать их, используя af_print(C)выдаёт ошибку:

error C2065: 'C' : undeclared identifier
error C2065: 'D' : undeclared identifier
IntelliSense: identifier "C" is undefined
IntelliSense: identifier "D" is undefined

Основная функция:

#include <cstdio>
#include <math.h>
#include <cstdlib>
#include "test.h"// test.h contains the function ABC() and
// arrayfire.h and
// using namespace af;

int main(int argc, char *argv[])

{
ABC(); // function
// here I am calling the variables defined in ABC()
af_print(C);
af_print(D);
#ifdef WIN32 // pause in Windows
if (!(argc == 2 && argv[1][0] == '-')) {
printf("hit [enter]...");
fflush(stdout);
getchar();
}
#endif

return 0;
}

Любое решение, пожалуйста.

С уважением

1

Решение

В C, в основном, есть три области видимости переменных, которые могут быть определены в:

  • Глобальная область, когда переменные определены вне каких-либо функций.
  • Локальная область, когда переменные объявляются в функциях, эта область включает аргументы функции.
  • Область видимости блока, это для переменных, определенных в блоках, вложенных в функции, например, в тело if заявление.

Переменные в одной области доступны только в текущей области и вложенных областях. Они просто не существуют в параллельных областях или областях более высокого уровня.

Более «графически» это можно увидеть примерно так:

+---------------------+
| Глобальная сфера |
| |
| + ----------------- + |
| | Область действия функции | |
| | | |
| | + ------------- + | |
| | | Блок сфера | | |
| | + ------------- + | |
| | | |
| | + ------------- + | |
| | | Блок сфера | | |
| | + ------------- + | |
| + ----------------- + |
| |
| + ----------------- + |
| | Область действия функции | |
| | | |
| | + ------------- + | |
| | | Блок сфера | | |
| | + ------------- + | |
| + ----------------- + |
+ --------------------- +

На рисунке выше показаны две области действия. Переменные, объявленные в одной из областей действия функции, не могут использоваться никакими другими областями функций, они местный к этой функции.

То же самое с областью блока, переменные, объявленные в блоке, могут использоваться только в этом блоке и дочерних элементах этого блока.


Теперь о том, как это относится к вашей проблеме: переменные C а также D определены в функции ABCэто означает, что их область находится в ABC только функция, другие функции (например, ваш main функция) не может видеть или получить доступ к переменным, определенным в ABCпеременные являются локальными в области ABC функция.

Есть много способов решить проблему доступа к этим переменным из других функций, и самый распространенный способ для начинающих — поместить определение этих переменных в Глобальный объем. Затем в функции, которую вы назначаете переменным, что-то вроде

array C;
array D;

void ABC()
{
...
C = array(Q, 1, A);
D = array(Q, 1, B);
}

Другие решения включают передачу аргументов по ссылке и присваивание им. Или поместив данные в состав (class или же struct) и возвращая экземпляр этой структуры.

1

Другие решения