Матрица перестановок?

#c #arrays #pointers #struct #permutation

#c #массивы #указатели #структура #перестановка

Вопрос:

итак, у меня есть матричная структура, и я должен заполнить ее перестановками в диапазоне от 0 ~ nr_vals в N столбцах. Я закончил часть с перестановками, но я не могу вычислить указатели с массивом. Буду признателен за любую помощь. Есть функция печати, которую я вызываю, и все, что я делаю, она печатает, и все. Предполагается, что перестановки будут напечатаны (ВЫПОЛНЕНЫ) после их выделения в матрицу. что я делаю не так, а также как мне освободить матрицу?

функция печати:

 void print_2D(matrix_ptr mat);

struct matrix_2D_struct {
    int** data_arr;
    int rows;
    int cols;
};
typedef struct matrix_2D_struct * matrix_ptr;

matrix_ptr perm_rec_2(int N, int nr_vals) {
    struct matrix_2D_struct *matrix = malloc(sizeof *matrix);
    int j = 0;
    int i = 0;
    prem_rec_helpTwoForMatrix (N, nr_vals, i, matrix->data_arr, j);
    return NULL;
}

void prem_rec_helpTwoForMatrix(int N, int nr_vals, int i, int **a[], int j)
{
    i = N - 1;
    while(a[i][j] < nr_vals){
        a[i][j]  ;
    }
    while(i >= 0 amp;amp; a[i][j] == nr_vals){
        i--;
    }
    if(i < 0)
    {
        return;
    }
    a[i][j]  ;
    while(  i < N)
    {
        a[i] = 0;
    }
    prem_rec_helpTwoForMatrix(N, nr_vals, i, **a, j);
}
  

Комментарии:

1. Где вы размещаете data_arr ?

2. При просмотре исходного кода переменная j не изменяется и остается равной 0. Одна ошибка в последнем, пока почему a[i] = 0; вместо a[i][j] ?

3. @BarmakShemirani где бы я выделил?

4. @J.Piquard ошибка записи. исправил эту строку, но ничего не меняет.

5. @Abeer другая ошибка, которая может привести к исключению Stackover, безусловно, связана с набором i = N - 1; вместо использования аргумента int i при вызове prem_rec_helpTwoForMatrix() ==> я никогда не меняю начало функции.

Ответ №1:

Это частичный ответ:

После выделения matrix вы должны выделить matrix->data_arr .

Предполагая, что массив N x N большой:

 struct matrix_2D_struct *matrix = malloc(sizeof *matrix);

if (N < 1)
{
    printf("error!n");
    return ...
}

matrix->data_arr = malloc(N*sizeof(int*));
int i, j;
for (i = 0; i < N; i  )
    matrix->data_arr[i] = malloc(N*sizeof(int));
  

Инициализация (как предложено в комментарии)

 for (i = 0; i < N; i  )
    for (j = 0; j < N; j  )
        matrix->data_arr[i][j] = 0;
  

Теперь вы можете протестировать, работает ли это:

 matrix->data_arr[2][0] = 20;
matrix->data_arr[0][4] = 4;
printf("%dn", matrix->data_arr[2][0]);
printf("%dn", matrix->data_arr[0][4]);
  

Когда вам больше не нужны данные, вы можете освободить их (данные освобождаются автоматически при выходе из программы)

 for (i = 0; i < N; i  )
    free(matrix->data_arr[i]);
free(matrix->data_arr);
free(matrix);
  

Комментарии:

1. @Abeer, после выделения 2d-массива вы должны инициализировать все ячейки с 0 перед первой while(a[i][j] < nr_vals) .

2. matrix_ptr perm_rec_2(int N, int nr_vals) { struct matrix_2D_struct *matrix = malloc(sizeof *matrix); if (N < 1) { printf("error!n"); return matrix;} int multi = N-1; multi = multi*multi; int i, j; for (i = 0; i < multi; i ){ for (j = 0; j < N; j ){ matrix->data_arr[i][j] = malloc(multi*sizeof(int));} } for (i = 0; i < multi; i ){ for (j = 0; j < N; j ){ matrix->data_arr[i][j] = 0;} } prem_rec_helpTwoForMatrix (N, nr_vals, 0, matrix->data_arr, 0); return NULL; }

3. что это, черт возьми, такое?