我试图改变不同功能的2D数组值,以满足我的需要。 对于下面代码中的示例,我尝试通过更改为" 1"来尝试将Matrix更改为自反。
我有一个问题是返回新数组并将其替换为主程序中的旧数组,以便我可以再次使用它。
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数组返回给主程序。
答案 0 :(得分:1)
在函数reflexive
中,return语句位于循环内。这会导致在到达return语句时立即终止该函数。如果您正确格式化代码,您将能够轻松地看到此行为。
进一步注意,数组中的第一个元素的索引为0,最后一个元素的索引是数组-1的大小。这是因为数组索引是元素&#34; offset&#34;。这意味着
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);
......
}
答案 1 :(得分:0)
使用vector<vector<int>>
并通过引用传递
答案 2 :(得分:-2)
在这里使用数组很繁琐且容易出错。因此:
#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
。
在任何情况下,您都应该找到一个基本的教程来讨论它们并阅读所有内容。重要标准。
也就是说,特别是如果你想使用动态大小的数组,你无法保证每个子数组都具有相同的大小(“a 锯齿状的 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;
}
(如果允许修改原始矩阵,则使其无效)