我想傳遞并回傳一個未知大小的二維陣列,但我不知道該怎么做。我知道如何只回傳未知大小的陣列(指標陣列)。我知道如何傳遞未知大小的陣列(模板),但是同時傳遞和回傳一個未知大小的二維陣列對我不起作用。我有以下代碼
template<typename Value_t, size_t FirstDim, size_t SecondDim>
int** FooTakes2D_ArrayRef_to_Print(Value_t (&array2d)[FirstDim][SecondDim])
{
for(size_t i=0; i<FirstDim; i)
{
for(size_t j=0; j<SecondDim; j)
{
std::cout<<array2d[i][j]<<' ';
}
std::cout<<"\n";
}
return array2d;
}
int main()
{
double arr_d[][3]= { {1,2,3}, {4,5,6} };
int** arr=FooTakes2D_ArrayRef_to_Print(arr_d);
return 0;
}
uj5u.com熱心網友回復:
對于初學者,您宣告了一個雙精度陣列
double arr_d[][3]= { {1,2,3}, {4,5,6} };
但隨后int在the函式宣告和此陳述句中使用說明符。
int** arr=FooTakes2D_ArrayRef_to_Print(arr_d);
請注意,在運算式中使用的陣列指示符具有罕見的例外,它們被隱式轉換為指向它們的第一個元素的指標。例如,陣列arr_d可以隱式轉換為型別的指標double ( * )[3]。
該功能看起來像
template<typename Value_t, size_t FirstDim, size_t SecondDim>
Value_t ( & FooTakes2D_ArrayRef_to_Print(Value_t (&array2d)[FirstDim][SecondDim]) )[FirstDim][SecondDim]
{
for(size_t i=0; i<FirstDim; i)
{
for(size_t j=0; j<SecondDim; j)
{
std::cout<<array2d[i][j]<<' ';
}
std::cout<<"\n";
}
return array2d;
}
也就是說,它可以回傳對源陣列的參考。
或者像例如
template<typename Value_t, size_t FirstDim, size_t SecondDim>
Value_t ( * FooTakes2D_ArrayRef_to_Print(Value_t (&array2d)[FirstDim][SecondDim]) )[SecondDim]
{
for(size_t i=0; i<FirstDim; i)
{
for(size_t j=0; j<SecondDim; j)
{
std::cout<<array2d[i][j]<<' ';
}
std::cout<<"\n";
}
return array2d;
}
回傳指向陣列第一個元素的指標。
在這兩種情況下,您都可以在 main 中宣告一個指標,例如
double (* arr )[3] = FooTakes2D_ArrayRef_to_Print(arr_d);
這是一個演示程式
#include <iostream>
template<typename Value_t, size_t FirstDim, size_t SecondDim>
Value_t ( & FooTakes2D_ArrayRef_to_Print(Value_t (&array2d)[FirstDim][SecondDim]) )[FirstDim][SecondDim]
{
for(size_t i=0; i<FirstDim; i)
{
for(size_t j=0; j<SecondDim; j)
{
std::cout<<array2d[i][j]<<' ';
}
std::cout<<"\n";
}
return array2d;
}
template<typename Value_t, size_t FirstDim, size_t SecondDim>
Value_t ( * FooTakes2D_ArrayRef_to_Print2(Value_t (&array2d)[FirstDim][SecondDim]) )[SecondDim]
{
for(size_t i=0; i<FirstDim; i)
{
for(size_t j=0; j<SecondDim; j)
{
std::cout<<array2d[i][j]<<' ';
}
std::cout<<"\n";
}
return array2d;
}
int main()
{
double arr_d[][3]= { {1,2,3}, {4,5,6} };
double (* arr )[3] = FooTakes2D_ArrayRef_to_Print(arr_d);
double (* arr2 )[3] = FooTakes2D_ArrayRef_to_Print2(arr_d);
}`
程式輸出為
1 2 3
4 5 6
1 2 3
4 5 6 `
或者您可以通過以下方式使用別名來參考二維陣列
#include <iostream>
template<typename Value_t, size_t FirstDim, size_t SecondDim>
using Arr2D = Value_t ( & )[FirstDim][SecondDim];
template<typename Value_t, size_t FirstDim, size_t SecondDim>
Arr2D<Value_t, FirstDim, SecondDim>
FooTakes2D_ArrayRef_to_Print(Arr2D<Value_t, FirstDim, SecondDim> array2d )
{
for(size_t i=0; i<FirstDim; i)
{
for(size_t j=0; j<SecondDim; j)
{
std::cout<<array2d[i][j]<<' ';
}
std::cout<<"\n";
}
return array2d;
}
template<typename Value_t, size_t FirstDim, size_t SecondDim>
auto FooTakes2D_ArrayRef_to_Print2(Arr2D<Value_t, FirstDim, SecondDim> array2d )
{
for(size_t i=0; i<FirstDim; i)
{
for(size_t j=0; j<SecondDim; j)
{
std::cout<<array2d[i][j]<<' ';
}
std::cout<<"\n";
}
return array2d;
}
int main()
{
double arr_d[][3]= { {1,2,3}, {4,5,6} };
double (* arr )[3] = FooTakes2D_ArrayRef_to_Print(arr_d);
double (* arr2 )[3] = FooTakes2D_ArrayRef_to_Print2(arr_d);
}
uj5u.com熱心網友回復:
問題是您的函式的回傳型別是,但int**您回傳的是由于型別衰減array2d而衰減為 a的型別。因此,函式的指定回傳型別與您實際回傳的型別不匹配。double (*)[3]
要解決此問題,您可以使用std::vector或使用占位符型別 auto,如下所示:
template<typename Value_t, size_t FirstDim, size_t SecondDim>
//auto used here
auto FooTakes2D_ArrayRef_to_Print(Value_t (&array2d)[FirstDim][SecondDim]) -> decltype(array2d)
{
for(size_t i=0; i<FirstDim; i)
{
for(size_t j=0; j<SecondDim; j)
{
std::cout<<array2d[i][j]<<' ';
}
std::cout<<"\n";
}
return array2d;
}
int main()
{
double arr_d[][3]= { {1,2,3}, {4,5,6} };
//auto used here
auto arr=FooTakes2D_ArrayRef_to_Print(arr_d);
}
作業演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/472979.html
上一篇:讓加入C MYSQL庫
