从已传递给函数的数组中复制

问题描述 投票:1回答:3
int getWinnableTwo(char thisArray[9]) { 
    char oneArray[9];

    std::copy(std::begin(thisArray), std::end(thisArray), std::begin(oneArray));

由于某种原因,这不会编译,而使用全局数组。我想这是因为数组是通过引用传递的,但是我能做些什么才能使它工作?

错误:

不匹配的类型'const std :: valarray <_Tp>'和'char *'

c++ arrays
3个回答
4
投票

将数组作为参数传递给函数时,它会衰减为原始指针。如果你将一个不同大小的数组传递给你的函数,你可以看到这个,你可能会惊讶于它编译:

char test[1];
getWinnableTwo(test);

你甚至不需要传递一个数组:

char test;
getWinnableTwo(&test);

你的功能相当于:

int getWinnableTwo(char* thisArray) { 
    char oneArray[9];
    std::copy(std::begin(thisArray), std::end(thisArray), std::begin(oneArray));
    return 0;
}

您不能在原始指针上调用std::beginstd::end,因为编译器无法知道指针指向的数据大小。

一种解决方案是通过引用传递数组:

int getWinnableTwo(char(&thisArray)[9]) { 
    char oneArray[9];

    std::copy(std::begin(thisArray), std::end(thisArray), std::begin(oneArray));
    return 0;
}

这有额外的好处,你现在只能传递char [9]而不是任何其他类型。

更多的c ++解决方案是使用std::array,您可以选择通过引用或值传递,并且不会衰减到指针:

int getWinnableTwo(std::array<char, 9>& thisArray) { 
    std::array<char, 9> oneArray;

    std::copy(std::begin(thisArray), std::end(thisArray), std::begin(oneArray));
    return 0;
}

3
投票

试试这个:

int getWinnableTwo(char thisArray[9])
{
    char oneArray[9];
    std::copy(thisArray, thisArray + 9, oneArray);
    return 0;
}

2
投票

您可以使用std :: array作为容器来实现此目的。

#include <array>
#include <algorithm>

int getWinnableTwo(const std::array<int, 9>& arrayToCopy) {
    std::array<int, 9> destinationArray;

    std::copy(std::begin(arrayToCopy), std::end(arrayToCopy), std::begin(destinationArray));
}

int main()
{
    std::array<int, 9> arrayToCopy{ 1,2,3,4,5,6,7,8,9 };
    int result = getWinnableTwo(arrayToCopy);
}
© www.soinside.com 2019 - 2024. All rights reserved.