如何传递一个二维数组来使用像 C 中的 M*i 这样的行偏移量?
How to pass a 2D array to function with a row offset like M*i in C?
for(int i=0; i < n; ++i){
//Find the leading element in a+M*i
if(!find_leading_element((a+M*i),n-i,m,&rowLead,&columnLead)){
return;
}
//Get the dividable from a[rowLEad][columnLead]
divide = (double)1/a[rowLead][columnLead];
printf("The divide from current matrix is %d\n\n",divide);
//Swap the current row = i with rowLead in matrix a+M*i
swap_rows((a+M*i),n-i,m,i,rowLead);
}
我正在做一个小型学校项目来减少矩阵,但在传递带有偏移量的二维数组时遇到了一些麻烦。
我需要 find_leading_element
来获取二维数组,并且 return 通过指针获取该矩阵中前导元素的行和列。
所以find_leading_element
return是相对于它得到的矩阵的行和列,没关系我稍后再处理。现在的问题是传递具有行偏移量的二维数组。
所以每次迭代我都会传递矩阵但少一行。因为我不能改变find_leading_element
的声明,所以我需要用double a[][M]
传递函数,这是否意味着它是按值传递的?
bool find_leading_element(double a[][M], int n, int m, int * row, int * column) {
printf("In Find Leader got the matrix\n");
print_matrix((double (*)[M])a,n,m);
for(int i=0; i < m; ++i){
for(int j=0; j < n; ++j){
if(*(&a[0][0]+j*M+i) != 0){
*row = j;
*column = i;
return true;
}
}
}
return false;
}
double a[N][M];
printf("Enter matrix:\n");
if (!read_matrix((double (*)[M]) a, n, m)) {
printf("Invalid matrix!\n");
return ERROR;
}
最好的方法是什么?我在这里做的方式它只在第二次迭代中接收一行。
注意指针算法不是原始地址算法。
由于 a
是一个声明为 double a[N][M];
的二维数组,它将衰减为指向一行的指针。这意味着第 i 行的地址是 a+i
而不是 a+M*i
.
当您用一维数组模拟二维数组时使用后者:int aa[N*M];
。这里 aa
将衰减为 int
指针,第 i 行的开头将在 aa+M*i
.
调用应该是:
//Find the leading element in a+M*i
if(!find_leading_element((a+i),n-i,m,&rowLead,&columnLead)){
return;
}
for(int i=0; i < n; ++i){
//Find the leading element in a+M*i
if(!find_leading_element((a+M*i),n-i,m,&rowLead,&columnLead)){
return;
}
//Get the dividable from a[rowLEad][columnLead]
divide = (double)1/a[rowLead][columnLead];
printf("The divide from current matrix is %d\n\n",divide);
//Swap the current row = i with rowLead in matrix a+M*i
swap_rows((a+M*i),n-i,m,i,rowLead);
}
我正在做一个小型学校项目来减少矩阵,但在传递带有偏移量的二维数组时遇到了一些麻烦。
我需要 find_leading_element
来获取二维数组,并且 return 通过指针获取该矩阵中前导元素的行和列。
所以find_leading_element
return是相对于它得到的矩阵的行和列,没关系我稍后再处理。现在的问题是传递具有行偏移量的二维数组。
所以每次迭代我都会传递矩阵但少一行。因为我不能改变find_leading_element
的声明,所以我需要用double a[][M]
传递函数,这是否意味着它是按值传递的?
bool find_leading_element(double a[][M], int n, int m, int * row, int * column) {
printf("In Find Leader got the matrix\n");
print_matrix((double (*)[M])a,n,m);
for(int i=0; i < m; ++i){
for(int j=0; j < n; ++j){
if(*(&a[0][0]+j*M+i) != 0){
*row = j;
*column = i;
return true;
}
}
}
return false;
}
double a[N][M];
printf("Enter matrix:\n");
if (!read_matrix((double (*)[M]) a, n, m)) {
printf("Invalid matrix!\n");
return ERROR;
}
最好的方法是什么?我在这里做的方式它只在第二次迭代中接收一行。
注意指针算法不是原始地址算法。
由于 a
是一个声明为 double a[N][M];
的二维数组,它将衰减为指向一行的指针。这意味着第 i 行的地址是 a+i
而不是 a+M*i
.
当您用一维数组模拟二维数组时使用后者:int aa[N*M];
。这里 aa
将衰减为 int
指针,第 i 行的开头将在 aa+M*i
.
调用应该是:
//Find the leading element in a+M*i
if(!find_leading_element((a+i),n-i,m,&rowLead,&columnLead)){
return;
}