我的任務是創建一個函式模板,該模板將添加任何二維整數陣列的所有元素,作為編程理論語言課程練習的一部分。
我嘗試了幾種方法,但不斷收到我不明白的編譯器錯誤。
1)
template<typename T>
T addArraysOne(T rows, T cols, T arr[][cols])
{
T output;
for(int i = 0; i < rows; i )
{
for(int j = 0; j < cols; j )
{
output = arr[i][j];
}
}
return output;
}
這個錯誤是因為列數的引數是“不是常數”。
2)
int addArraysTwo(int rows, int cols, int** arr)
{
int output;
for(int i = 0; i < rows; i )
{
for(int j = 0; j < cols; j )
{
output = *arr[i*rows j];
}
}
return output;
}
當我嘗試呼叫它時,這是一個錯誤,addArraysTwo(5, 5, arr);因為它“與函式呼叫不匹配”,當“arr”是二維 int 陣列時。我在網上沒有發現任何與此特別相似的問題。任何關于如何修改這些以便我不惹惱編譯器的建議將不勝感激。謝謝!
uj5u.com熱心網友回復:
您可以使用以下使用模板非型別引數的程式。
版本 1:對于整數陣列
#include <iostream>
//a function template that takes a 2D int array by reference
template< std::size_t N, std::size_t M>
int calculateSum(const int (&arr)[N][M])
{
int sum = 0;
//iterate through rows and colums of the passed 2D int array
for(std::size_t row = 0; row < N; row)
{
for(std::size_t col = 0 ; col < M; col)
{
sum = arr[row][col];
}
}
return sum;
}
int main()
{
int arr[2][3] = {{1,2,3},{3,4,5}};
std::cout<<"Sum is: "<<calculateSum(arr)<<std::endl;
return 0;
}
版本 2:用于任意型別的陣列
#include <iostream>
//a function template that takes a 2D array(with elements of type T) by reference
template< typename T, std::size_t N, std::size_t M>
T calculateSum(const T (&arr)[N][M])
{
T sum{0};
//iterate through rows and colums of the passed 2D T array
for(std::size_t row = 0; row < N; row)
{
for(std::size_t col = 0 ; col < M; col)
{
sum = arr[row][col];
}
}
return sum;
}
int main()
{
double arr[2][3] = {{1.4,2,3},{3.6,4,5.45}};
std::cout<<"Sum is: "<<calculateSum(arr)<<std::endl;
return 0;
}
uj5u.com熱心網友回復:
您的第一種方法,可變長度陣列僅受 c99 支持(我相信 c 未采用?)。否則,必須在編譯時知道陣列的長度。而且至少在c 17及以下,任何陣列型別的引數都會被編譯器調整為對應的指標型別,所以int f(int a[5])和int f(int a[])和沒有區別int f(int* a)。 但是對于二維陣列,必須知道第二維的大小在編譯時。int f(int a[][2])(相當于int f(int(*a)[2]))可以,但int f(int a[][])不是。
您的第二種方法,二維陣列不能隱式轉換為指標指標,而是指向一維陣列的指標:
int arr[2][3];
int **p = arr; // Error
int(*p)[3] = arr; // OK
所以解決方案之一就是:
template<typename T>
T addArraysOne(T rows, T cols, T* arr)
{
T output = 0; // NOTE: initialize to 0
for(int i = 0; i < rows; i )
{
for(int j = 0; j < cols; j )
{
output = arr[i*cols j]; // NOTE: not i*rows j
}
}
return output;
}
并用以下命令呼叫它:
int arr[2][3];
addArraysOne(2, 3, &arr[0][0]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/361010.html
下一篇:理解堆疊和幀指標
