簡體   English   中英

如何傳遞二維數組並將其返回給函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM