Как передать двумерный массив в функцию со смещением строки, как M * i в C? - PullRequest
0 голосов
/ 04 января 2019
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);
}

Я работаю над небольшим школьным проектом по уменьшению матриц, но у меня есть некоторые проблемы при передаче 2D-массива со смещением.

Мне нужно find_leading_element, чтобы получить двумерный массив и вернуть через указатели строку и столбец ведущего элемента в этой матрице.

Следовательно, find_leading_element возвращает строку и столбец относительно матрицы, которую он получил, и все в порядке, я буду обрабатывать это позже.Теперь проблема заключается в передаче двумерного массива со смещением строки.

Так что с каждой итерацией я буду проходить матрицу, но с одной строкой меньше.Поскольку я не могу изменить объявление для 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;
}

Каков наилучший способ сделать это?То, как я это делаю, на второй итерации получает только одну строку.

1 Ответ

0 голосов
/ 04 января 2019

Осторожно, арифметика указателей не является необработанной арифметикой адресов.

Поскольку 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...