[英]Passing 2d arrays without knowing the size?
誰能幫我? 我想傳遞firstMatrix,secondMatrix和finalMatrix。 到目前為止,我有這個。 我可以將其設置為全局變量,但我仍然不知道實際大小
int matrixSummation(int firstMatrix[][matrixSize],int secondMatrix[][matrixSize], int finalMatrix[][matrixSize], int matrixSize){
for(int row=0; row< matrixSize; row++){
for(int col=0; col< matrixSize; col++){
finalMatrix[row][col]=firstMatrix[row][col]+secondMatrix[row][col];
}
}
}
int main(int argc, char** argv) {
int matrixSize;
cout << "Enter size of your matrices: " <<endl;
cin >> matrixSize;
int firstMatrix[matrixSize][matrixSize];
int secondMatrix[matrixSize][matrixSize];
int finalMatrix[matrixSize][matrixSize];
cout <<"Enter numbers for the 1st matrix: "<<endl;
for(int row = 0; row < matrixSize; row++){
for(int col=0; col< matrixSize; col++){
cin >> firstMatrix[row][col];
}
}
cout <<"Enter your numbers for the 2nd matrix: "<<endl;
for(int row = 0; row < matrixSize; row++){
for(int col=0; col< matrixSize; col++){
cin >> secondMatrix[row][col];
}
}
matrixSummation(firstMatrix,secondMatrix,finalMatrix,matrixSize);
}
您可以使用功能模板:
template<std::size_t A, std::size_t B>
int matrixSummation(int (&firstMatrix)[A][B], int (&secondMatrix)[A][B], int (&finalMatrix)[A][B])
這樣您就可以在函數內部訪問A
的行數和B
的列數,而無需傳遞大小。
無法做到這一點。 在編譯時,函數
int matrixSummation(int firstMatrix[][matrixSize],int secondMatrix[][matrixSize], int finalMatrix[][matrixSize], int matrixSize){
應該知道矩陣的維數(至少在列中)。
參見此處: 將未知大小的數組傳遞給函數
您可以使一維數組代表您的二維數組:
代替
array[ROW][COL];
采用
array[ROW*COL];
並且在訪問時:
a[r][c]; //r<5,c<5
采用:
a[r*ROW+c];
我也一直在為我的圖像文件處理動態數組大小,最后我只是使用int **傳遞數組。
#include <iostream>
using namespace std;
void printMatrix(int** val, int row, int col)
{
int new_val[row][col];
int i, j;
for(i = 0; i < row; i++)
{
for(j = 0; j < col; j++)
{
new_val[i][j] = val[i][j];
cout<<new_val[i][j]<<" ";
}cout<<endl;
}
cout<<"test!"<<endl;
}
int main ()
{
int i, j, k;
int row, col;
row = 3;
col = 5;
int** array = new int*[row];
for(int i = 0; i < row; ++i)
{
array[i] = new int[col];
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
array[i][j] = k;
k++;
cout << array[i][j]<< " ";
}
cout<<endl;
}
cout<<endl;
printMatrix(array, row, col);
return 0;
}
問題的根源是在標准C ++中不允許這樣做:
cin >> matrixSize;
int firstMatrix[matrixSize][matrixSize];
到目前為止,有些編譯器允許這種方式通過。 但是,當您嘗試使用firstMatrix
時,您會遇到困難。 例如,您曾試圖將其傳遞給函數的問題。
實際上,在標准C ++中不允許這樣做的原因是,到目前為止,沒有人能提出一個遲早不會遇到困難的建議。
最好的做法是以與Standard C ++兼容的方式對數組進行不同的聲明。
在標准C ++中,C樣式的數組必須在編譯時知道其維數。 因此,您必須使用其他容器。
最簡單的代碼版本如下所示:
vector< vector<int> > firstMatrix(matrixSize, vector<int>(matrixSize));
這將創建一個二維數組,每個維度為matrixSize
,然后您可以按照訪問C樣式數組的相同方式對其進行訪問。
重要的是,您可以將firstMatrix
傳遞給函數的方式與傳遞任何其他變量的方式完全相同,並且可以通過向量的成員函數訪問其大小,例如firstMatrix.size()
是行數, firstMatrix[0].size()
是列數。
由於每行存儲在單獨的分配中,因此該版本在運行時效率較低。 要擁有連續的存儲,您可以編寫:
vector<int> firstMatrix(matrixSize * matrixSize);
然后,您可以模擬該分配中的行和列,例如,在此解決方案中,先前代碼的firstMatrix[2][3]
將為firstMatrix[2 * matrixSize + 3]
。
這里最大的事情是初始化動態分配的二維數組。 我建議使用“向量”,但是我展示了一種指針方法。 無需將大小的設置值傳遞給函數。
int[][] matrixSummation(int firstMatrix[][],int secondMatrix[][]){
if(firstMatrix.length != secondMatrix.length
|| firstMatrix[].length !=secondMatrix[].length)
return NULL;
int **finalMatrix;
finalMatrix= new int*[firstMatrix.length];
for (int i = 0; i < 10; ++i) {
finalMatrix[i] = new int[firstMatrix.length];
//make sure you initialize each int[]__ with proper length.
}
for(int row=0; row< matrixSize; row++){
for(int col=0; col< matrixSize; col++){
finalMatrix[row][col]=firstMatrix[row][col]+secondMatrix[row][col];
}
}
return finalMatrix;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.