1

我用这样的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希望使用 打印它们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;
}

请提供任何解决方案。

问候

4

1 回答 1

1

在 C 中,基本上可以定义三个范围变量:

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

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

更“图形化”可以看到像这样的东西:

+----------+
| 全球范围 |
| |
| +-----------------+ |
| | 功能范围 | |
| | | |
| | +--------------+ | |
| | | 块范围 | | |
| | +--------------+ | |
| | | |
| | +--------------+ | |
| | | 块范围 | | |
| | +--------------+ | |
| +-----------------+ |
| |
| +-----------------+ |
| | 功能范围 | |
| | | |
| | +--------------+ | |
| | | 块范围 | | |
| | +--------------+ | |
| +-----------------+ |
+----------+

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

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


现在了解这与您的问题有何关系:变量CD在函数中定义ABC,这意味着它们的范围仅在ABC函数中,其他函数(如您的main函数)无法查看或访问中定义的ABC变量,变量是在ABC函数范围内的本地。

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

array C;
array D;

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

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

于 2015-08-25T08:01:18.217 回答