2012-03-11 60 views
1

我必須做這個練習:如何在C中動態分配一個矩陣?

在C中執行一個管理名爲「M」的整數矩陣和名爲「L」的整數列表的應用程序。 M是用戶動態選擇n的方矩陣[nxn]。然後執行此功能:

  • 序列化:給定「M」矩陣它返回帶有n^2個元素的列表L.列表中的元素是從第一個到第二個按行排序的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 

我能做些什麼?

回答

3

在反序列化,你應該返回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); 
+0

int serialize(int ** M,int n);不需要int *? – JackTurky 2012-03-11 15:55:32

+0

從你的代碼看來,它確實如此,我的錯誤。 – MByD 2012-03-11 15:56:12

+0

確定它有效,但結果是:給出矩陣[nxn]的維數:2 L [0] = 0L [1] = 1L [2] = 0L [3] = 0 0 0爲什麼L是總是0? – JackTurky 2012-03-11 16:02:05

2

你忘了你使用它們之前聲明的功能。在您致電main之前,請添加

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

此外,

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

M2int**,但deserialize返回int。你有什麼打算?

+0

這兩個函數需要*和**近int – JackTurky 2012-03-11 16:02:39