我自学自学从书中编程。手头的任务是我必须通过一个不返回任何内容的函数(我假设的void函数)放置一个带有两个下标的数组,并递归打印每个元素。
#include <iostream>
#include <array>
#include <iomanip>
#include <string>
#include <cstddef>
using namespace std;
void printArray (int source, int a, int b){
if (a < b){
cout << source[a] << " ";
printArray(source, a + 1, b);
}
}
int main (){
const array<int, 10> theSource = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int al = 0;
int bl = theSource.size();
printArray(theSource, al, bl);
}
当我尝试这样做时,我得到两个错误。
11|error: invalid types 'int[int]' for array subscript|
22|error: cannot convert 'const std::array<int, 10u>' to 'int' for argument '1' to 'void printArray(int, int, int)'|
所以我尝试将虚空更改为......
void printArray (int source[], int a, int b)
还有...
void printArray (int *source, int a, int b){
但仍然得到错误......
22|error: cannot convert 'const std::array<int, 10u>' to 'int' for argument '1' to 'void printArray(int, int, int)'|
是否有不同的方法将数组放入函数中?
任务是......
(打印数组)编写一个递归函数printArray,它将一个数组,一个起始子脚本和一个结束下标作为参数,不返回任何内容并打印该数组。该函数应该停止处理并在起始下标等于结束下标时返回。
答案 0 :(得分:4)
我认为你将std::array
与C风格&#34;阵列&#34;纠缠在一起。如果您将theSource
的定义更改为
const int theSource[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
然后最后两个表单中的任何一个都可以工作(假设您修复了编译器会抱怨的constness),因为theArray
具有const int的类型数组,并且可以传递给&#的函数39; s正在寻找const int*
。
当有人使用数组作为递归练习时,几乎可以肯定他们正在寻找的东西。
当然,对于真正的 C ++,std::array<int, 10> theArray
更合适,应该传递给期望const std::array<int, 10>&
作为其第一个参数的函数。
答案 1 :(得分:3)
将签名更改为:
void printArray (const array<int, 10> &source, int a, int b)
这就是编译器想要的! :)
答案 2 :(得分:0)
虽然您作为学术练习对数组进行递归处理,但您也可以通过重载$ make
mkdir w/
mkdir w/h/
mkdir w/h/a/
mkdir w/h/a/t/
mkdir w/h/a/t/e/
mkdir w/h/a/t/e/v/
mkdir w/h/a/t/e/v/e/
mkdir w/h/a/t/e/v/e/r/
echo whatever happens > w/h/a/t/things.dat
echo whatever happens > w/h/a/t/e/v/e/r/things.dat
运算符来方便地将std::array
传递给cout
:
<<
此模板适用于任何template<typename T, size_t S>
std::ostream& operator<<(std::ostream& stream, const std::array<T,S>& ary) {
for(const auto e& : ary){
stream << e << " ";
}
return stream;
}
元素可以std::array
&#39;到<<
。
cout