![](/img/trans.png)
[英]How to pass array 2d as parameter from function and return array 2d this function?
[英]How to pass and return 2d array to a function
我正在嘗試在不同的函數中更改2D數組的值,以使其適合我的需要。 例如,在下面的代碼中,我試圖通過將Matrix更改為自反,將其更改為“ 1”。
我在返回新數組並將其替換為主程序中的舊數組時遇到問題,因此可以再次使用它。
int reflexive(int m, int n, int matrix[100][100])
{
for(int i = 1;i <= m; i++)
{
for(int j = 1; j <= n; j++)
{
if(i == j)
{
if(matrix[i][j] != 1)
matrix[i][j] = 1;
}
return matrix;
}
}
}
int main()
{
int matrix[100][100];
int m , n;
for(int i = 1;i <= m; i++)
{
for(int j = 1; j <= n; j++)
{
cin>>matrix[i][j];
}
}
matrix[m][n] = reflexive(m,n,matrix);
return 0;
}
我想修復此代碼,以便它可以將完整的2D數組返回到主程序。
在reflexive
函數中,return語句位於循環內部。 這導致該函數在到達return語句時立即終止。 如果您可以正確格式化代碼,則可以輕松看到此行為。
還要注意,數組中的第一個元素的索引為0,最后一個元素的索引為數組-1的大小。 這是因為數組索引是元素“偏移量”。 這意味着
a[i]
和
*(a + i)
訪問相同的數組元素。
for(int i = 1;i <= m; i++) // <--- should be for(int i=0; i<m; i++)
{
for(int j = 1; j <= n; j++) // <--- should be for(int j=0; j<n; j++)
{
if(i == j)
{
if(matrix[i][j] != 1)
matrix[i][j] = 1;
}
return matrix; // <--- here the function is terminated
}
}
數組是通過指針而不是通過值傳遞給函數的。 這意味着,如果函數的形式參數是數組,則並非實際參數的所有值都被復制到數組中。 僅傳遞一個指向函數參數值的指針。
因此,您的情況不需要任何返回值。
下面的代碼應執行所需的操作:
int reflexive(int m, int n, int matrix[100][100])
{
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
if(i == j)
{
if(matrix[i][j] != 1)
matrix[i][j] = 1; // <----- write to the data by pointer
}
}
}
}
int main()
{
int matrix[100][100];
......
reflexive(m,n,matrix);
......
}
使用vector<vector<int>>
並通過引用傳遞
在這里使用數組是乏味且容易出錯的。 因此:
#include <vector>
std::vector<std::vector<int> > reflexive(std::vector<std::vector<int> > matrix)
{
for(int i = 0; i < matrix.size; i++){
for(int j = 0; j < matrix[i].size; j++){
....
int main()
{
std::vector<std::vector<int> > matrix(100, std::vector<int>(100));
int m , n; //<<whereever they come from I guess? Saw no cin in your code. Have no set value right now.
for(int i = 0; i < m; i++)
{
for(int j =0; j < n; j++)
{
cin>>matrix[i][j];
}
}
}
要么
#include<array>
...
std::array<std::array<int, 100>, 100> matrix;
std::array
具有固定大小, std::vector
是動態的。 同時,還可以了解std::list
。
無論如何,您都應該找到有關它們的基礎教程並閱讀所有內容。 重要標准。
就是說,特別是如果您要使用動態大小的數組,則不能保證每個子數組都具有相同的大小(“ 鋸齒 2d數組”),這在小程序中是可以的,但在大型程序中則應避免圖片,方法是使用確保該屬性的類。
在矩陣的情況下,一個簡單的選擇是使用一個處理矩陣的庫,例如Eigen。
編輯:
如果需要在const-correct中使用以上代碼:
std::vector<std::vector<int> > reflexive(const std::vector<std::vector<int> >& input)
{
std::vector<std::vector<int> > output = input;
....
return output;
}
(如果允許修改原始矩陣,則使其無效)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.