2012-02-07 30 views
1

我想创建一个返回数组的函数(在一个项目中)。我不太确定我该怎么做。如何从函数中正确返回数组?

int worker::*codebook(UnitType type){ 
    int code[12]; 
    if (type == UnitTypes::center){ 
     int temp[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; 
     code=temp; 
    } 
    return code; 
} 

其中worker是类和unitType枚举。我在头文件中定义的功能如下:

int *codebook(UnitType type); 

我的问题是这样的:

cannot convert from 'int' to 'int Worker::* 

这个任何想法?

+0

可能重复的[C++返回数组从函数](http:// stackoverflow .com/questions/8745260/c-return-array-from-function) – 2012-02-07 16:16:42

回答

5

代码中的第一个问题是语法。签名应该是:

int* worker::codebook(UnitType type) 

然后,指派给磁盘阵列:

code=temp; 

这只是不是由语言允许的。

最后,它返回一个指向局部变量:

return code; 

的阵列将不复存在当函数返回时,因此任何试图使用它从外部将导致不确定的行为。

现在,回答主要问题,如何从函数中正确返回数组?

一种选择是使用std::vector

std::vector<int> worker::codebook(UnitType type) { 
    std::vector<int> code(12); // vector with 12 zeros 
    if (type == UnitTypes::center){ 
     code[11] = 1; 
    } 
    return code; 
} 

另一种是使用std::array

std::array<int, 12> worker::codebook(UnitType type) { 
    std::array<int, 12> code = {{}}; 
    if (type == UnitTypes::center){ 
     code[11] = 1; 
    } 
    return code; 
} 
+0

好男人谢谢,我明白了! – 2012-02-07 15:01:57

0

这应该是int* worker::codebook(UnitType type)。该*int,使其成为一个指针 - intint*)。

但是,你真的不想return code这样的 - 当函数退出,code将指向垃圾(因为是堆栈上分配)。

+0

呃......挑剔:'代码'并不仅仅因为它被分配到堆栈而指向垃圾。如果是这样的话,堆栈就没用了。这是因为'code'是一个本地分配的数组,当函数返回时它会超出范围。 – 2012-02-07 14:45:16

+0

@SaniHuttunen这就是为什么我说“何时退出”。错字。 – Borealid 2012-02-07 15:59:58

2

您不能返回本地数组,它将在函数退出时超出范围。

最好使用实际的数据结构,例如std::vector也许。如果你想使用纯粹的C级数组,你必须动态地分配内存,并为函数添加一个方法来表示数组的长度,也许还需要参数size_t& length

+0

所以我的两个选择是要么使用向量或在函数中定义数组的大小? – 2012-02-07 14:44:10

1

签名应该是:

int* worker::codebook(UnitType type) 

注意,你遇到不确定的行为。

int code[12]; 

是一个局部变量,当函数退出时它将被销毁。你正在返回它。永远不要这样做。您应该通过new动态分配阵列。

2

你有错误的函数原型:

int worker::*codebook(UnitType type){ 

应该

int* worker::codebook(UnitType type){ 

而且这是不正确的,因为code被分配在堆栈和破坏,当它超出范围。

你应该在堆上分配这个code数组。那么这个函数的身体看起来是这样的:

int* code = new int[12]; 

if (type == UnitTypes::center){ 

    int temp[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; 
    memcpy(code, temp, 12*sizeof(int)); 
} 
return code; 

但随后调用者应该调用delete[]当它与这阵完成:

int* array = codebook(type); 
delete[] array; 

丑陋的内存管理与这种解决方案连接。既然你使用的是C++,你应该使用一些对象来简化它(例如std::vector)。

希望这会有所帮助。

0

您的指针声明位于错误的地方。

int* worker::codebook(UnitType type) 

然而,予以警告,要创建您在栈上数组,将得到当摧毁了你的函数退出。您需要在new的堆上创建它,并在完成时记住delete

0

你不想这样做,因为这里的数组内存是在函数内部分配的,并且在函数完成时会消失。将函数的内存/数组分配给另一个参数,并将该数组作为指针传入。

0

可以埋葬一个结构里面的数组,然后通过返回值的结构 - 在经典的C风格:

struct my_array 
{ 
int code[12]; 
}; 

my_array worker::codebook(UnitType type){ 
    my_array arr = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; 
    if (type == UnitTypes::center){ 
     arr.code[11] = 1; 
    } 
    return arr; 
}