Как динамически выделить матрицу в C? - PullRequest
1 голос
/ 11 марта 2012

Мне нужно выполнить это упражнение:

Выполнить приложение на C, которое управляет матрицей целых чисел с именем «M» и списком целых чисел с именем «L».M - квадратная матрица [nxn], где n выбирается пользователем динамически.Затем выполните эту функцию:

  • Сериализация: с учетом матрицы "M" она возвращает список L с n ^ 2 элементами.Элементами списка являются элементы M, упорядоченные по строке от первого ко второму.

Вторая функция:

  • Десериализация: задан список L с n^ 2 элемента, он возвращает матрицу [nxn] с элементами L, упорядоченными по столбцу.

Итак main() должно быть:

  • Пользователь задает размер матрицы(n) и заполните матрицу некоторым целым числом.
  • Затем вызовите функцию сериализации, напечатайте сериализованный список
  • , добавьте значение 5 к каждому значению списка
  • и вызовите десериализацию.функцию
  • и распечатать матрицу, заданную последней функцией.

( Все распределение должно быть динамическим. )

Я пробовал это:

#include <stdio.h>
#include <stdlib.h>

int main(){
    int n,i,j;
    printf("Give the dimension of matrix [nxn]: ");
    scanf("%d",&n);
    int **M;
    M = (int**)malloc(n*sizeof(int*));
    for(i=0;i<n;i++){
        M[i] = (int*)malloc(n*sizeof(int*));
    }
    int *L = serialize(M,n);
    int size = n*n;

    for(i=0;i<size;i++){
        printf("L[%d]= %d",i,L[i]);
    }
    for(i=0;i<size;i++){
        L[i] = L[i]+5;
    }
    int **M2 = deserialize(L,n);
    for(i=0;i<n;i++){
        printf("\n");
        for(j=0;j<n;j++){
            printf("%d",M2[i][j]);
        }
    }
    free(M);
    free(M2);
    free(L);
}

int serialize(int** M,int n){
    int *L;
    int i,j;
    int size = n*n;
    L = (int*)malloc(size*sizeof(int));
    for(i =0;i<size;i++)
        L[i]=M[i/size][(int)i%size];

return L;
}

int deserialize(int* L,int n){
    int** M;
    int i,j;
    M = (int**)malloc(n*sizeof(int*));
    for(i=0;i<n;i++){
        M[i] = (int*)malloc(n*sizeof(int*));
    }
    int size = n*n;
    for(i=0;i<size;i++)
        M[i/size][i%size]=L[i];

    return **M;
}

Компилятор выдаст мне ошибки:

Esercizio.c: In function ‘main’:
Esercizio.c:22: warning: initialization makes pointer from integer without a cast
Esercizio.c:31: warning: initialization makes pointer from integer without a cast
Esercizio.c: At top level:
Esercizio.c:43: error: conflicting types for ‘serialize’
Esercizio.c:22: error: previous implicit declaration of ‘serialize’ was here

Что я могу сделать?

Ответы [ 2 ]

3 голосов
/ 11 марта 2012

при десериализации вы должны вернуть M, а не **M:

int** deserialize(int* L,int n){
    int** M;
    //....    
    return M;
}

Кроме того, вам необходимо объявить функции перед их вызовом. До main добавить:

int* serialize(int** M,int n);
int** deserialize(int* L,int n);
2 голосов
/ 11 марта 2012

Вы забыли объявить свои функции, прежде чем использовать их. Добавить

int serialize(int** M,int n);
int deserialize(int* L,int n);

до вашего звонка на main.

Также

int **M2 = deserialize(L,n);

M2 - это int**, но deserialize возвращает int. Каково ваше намерение?

...