使用 arrayfire 的未声明标识符

undeclared identifier using 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() 并尝试提取变量 CD 并希望使用 [=16= 打印它们时], 给出错误:

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

请提供任何解决方案。

此致

在 C 中,基本上可以定义三个作用域变量:

  • 全局范围,当变量在任何函数之外定义时。
  • 局部作用域,当在函数中声明变量时,此作用域包括函数参数。
  • 块范围,这适用于嵌套在函数中的块中定义的变量,例如在 if 语句的主体中。

一个作用域中的变量只在当前作用域和嵌套作用域中可用。它们根本不存在于并行作用域或更高级别的作用域中。

更多"graphically"可以看到这样的东西:

+---------------------+
| Global scope        |
|                     |
| +-----------------+ |
| | Function scope  | |
| |                 | |
| | +-------------+ | |
| | | Block scope | | |
| | +-------------+ | |
| |                 | |
| | +-------------+ | |
| | | Block scope | | |
| | +-------------+ | |
| +-----------------+ |
|                     |
| +-----------------+ |
| | Function scope  | |
| |                 | |
| | +-------------+ | |
| | | Block scope | | |
| | +-------------+ | |
| +-----------------+ |
+---------------------+

上图中,有两个函数作用域。在一个函数作用域中声明的变量不能被任何其他函数作用域使用,它们是该函数的 local

与块作用域相同,块中声明的变量只能在该块及其子块中使用。


现在说明这与您的问题有什么关系:变量 CD 在函数 ABC 中定义,这意味着它们的范围在 ABC仅函数,其他函数(如您的 main 函数)无法查看或访问 ABC 中定义的变量,这些变量在 ABC 函数的范围内是局部的。

有很多方法可以解决从其他函数访问这些变量的问题,最常见的初学者方法是将那些变量的定义放在全局范围内。然后在你分配给变量的函数中,比如

array C;
array D;

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

其他解决方案涉及通过引用传递参数并分配给它们。或者将数据放入 结构 classstruct)并返回此结构的实例。