有没有办法从函数返回一个数组?更具体地说,我创建了这个函数:
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[]
。
答案 0 :(得分:8)
你不能这样做,但你可以:
答案 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))
,这有点奇怪。