我怎样才能返回数组?

时间:2009-05-10 18:28:29

标签: c++ arrays return-value

有没有办法从函数返回一个数组?更具体地说,我创建了这个函数:

char bin[8];

for(int i = 7; i >= 0; i--)
{
    int ascii='a';
    if(2^i-ascii >= 0)
    {
        bin[i]='1';
        ascii=2^i-ascii;
    }
    else
    {
        bin[i]='0';
    }
}

我需要一种方法来返回bin[]

9 个答案:

答案 0 :(得分:8)

你不能这样做,但你可以:

  • 返回一个动态分配的数组 - 最好由智能指针拥有,这样调用者就不必关心为它释放内存了 - 你也可以这样返回类似std :: vector的东西。
  • 通过指针(建议)或非const引用填充传递给您的数组/向量作为参数。

答案 1 :(得分:3)

您的数组是在堆栈上分配的本地变量。您应该使用new []在堆上分配它。然后你可以说:return bin;。请注意,完成后,您必须使用delete []明确释放它。

答案 2 :(得分:2)

你真的在问错误的问题。如果要在C ++中进行字符串处理,请使用std :: string和/或std :: vector类,而不是char数组。然后你的代码变成:

vector <char> func() {
    vector <char> bin(8);
    for( int i = 7; i >= 0; i-- ) {
       int ascii='a';
       if ( 2 ^ i - ascii >= 0 ) {
          bin[i] = '1';
          ascii = 2^i - ascii;
       }
       else {
        bin[i] ='0';
       }
    }
    return bin;
}

答案 3 :(得分:1)

我认为你最好的选择是使用矢量。它可以在许多方面起作用,如阵列,并有几个上升(长度存储类型,自动内存管理)。

void Calculate( std::vector<char>& bin) {
  for(int i = 7; i >= 0; i--)
  {
    int ascii='a';
    if(2^i-ascii >= 0)
    {
        bin.push_back('1');
        ascii=2^i-ascii;
    }
    else
    {
        bin.push_back('0');
    }
  }
}

答案 4 :(得分:1)

如果要返回数组的副本(可能对小数组有意义)并且数组具有固定大小,则可以将其包含在结构中;

struct ArrayWrapper {
   char _bin[8];
};

ArrayWrapper func()
{
    ArrayWrapper x;

    // Do your stuff here using x._bin instead of plain bin

    return x;
}

或者只使用已经建议过的std :: vector。

答案 5 :(得分:1)

类似于@ ari的回答,我想说已经有一个提升解决方案,boost::array解决了你的问题:

boost::array<char, 8> f() {
    boost::array<char, 8> bin;
    for(int i = 7; i >= 0; i--) {
        int ascii = 'a';
        if(2 ^ i-ascii >= 0) {
            bin[i] = '1';
            ascii = 2 ^ i-ascii;
        } else {
            bin[i] = '0';
        }
    }
}

...
boost::array<char, 8> a(f());

[我不知道你想用这个算法做什么,但请注意我认为你想做1 << i(逐位移位)而不是2 ^ i在C ++中取幂。]

Boost数组是一个普通的数组,只是包含在一个struct中,所以你不会失去任何性能。它也将在下一个C ++版本中以std::array的形式提供,如果您不需要begin() / size() / data() - 糖,您可以轻松自行完成它增加了(成为一个容器)。只需使用最基本的一个:

template<typename T, size_t S>
struct array { 
    T t[S];
    T& operator[](ptrdiff_t i) { return t[i]; }
    T const& operator[](ptrdiff_t i) const { return t[i]; }
};

但是像往常一样,使用其他人已经编写的工具,在本例中为boost::array。它还具有聚合的优势(这就是它没有用户声明构造函数的原因),因此它允许使用括号括起的列表进行初始化:

boost::array<int, 4> a = {{ 1, 2, 3, 4 }};

答案 6 :(得分:0)

您需要将数组bin作为函数中的参数传递。 数组总是按地址传递,因此您无需返回任何值。 它会自动显示主程序中的所有更改

void FunctionAbc(char bin[], int size);


void FuncationAbc(bin, size)
{
for(int i = 7; i >= 0; i--)
{
    int ascii='a';
    if(2^i-ascii >= 0)
    {
        bin[i]='1';
        ascii=2^i-ascii;
    }
    else
    {
        bin[i]='0';
    }
}

}

答案 7 :(得分:0)

您希望通过引用传递,如下所示:

void modifyBin(char (&bin)[8])
{
    /* your function goes here and modifies bin */
}

int main() 
{
    char bin[8];
    modifyBin(bin);
    /* bin has been updated */
    return 0;
}

答案 8 :(得分:0)

我认为其他人都回答了这个...使用容器而不是数组。这是std::string版本:

std::string foo() {
    int ascii = 'a';
    std::string result("00000000");
    for (int i=7; i>=0; --i) {
        if (2^i-ascii >= 0) {
            result[i] = '1';
            ascii = 2^i-ascii;
        }
    }
    return result;
}

我不确定2^i-ascii是否是你想要的。这将被解析为(2 ^ (i - ascii)),这有点奇怪。