如何在C中动态分配矩阵? [英] How to dynamically allocate a matrix in C?

查看:73
本文介绍了如何在C中动态分配矩阵?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须做这个练习:

在C中执行一个应用程序,该应用程序管理一个名为"M"的整数矩阵和一个名为"L"的整数列表. M是一个方阵[nxn],其中n由用户动态选择.然后执行以下功能:

Do an application in C that manages a matrix of integer named "M" and a list of integer named "L". M is a square matrix [nxn] with n chosen by user dynamically. Then do this function:

  • 序列化:给定"M"矩阵,它将返回具有n ^ 2个元素的列表L.列表的元素是从第一个到第二个按行排序的M元素.

第二个功能:

  • 反序列化:给定具有n ^ 2个元素的列表L,它将返回一个矩阵[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

我该怎么办?

推荐答案

反序列化时,您应该返回M而不是**M:

in deserialize, you should return M, not **M:

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

此外,您需要在调用函数之前声明它们.在main之前添加:

Also, you need to declare the functions before calling them. Before main add:

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

这篇关于如何在C中动态分配矩阵?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆