Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c语言中,如何从函数返回矩阵?_C - Fatal编程技术网

在c语言中,如何从函数返回矩阵?

在c语言中,如何从函数返回矩阵?,c,C,我的矩阵加法c代码如下所示: mat(int n,int a[][5],b[][5] ){ int i,c[5][5]; for(i=0;i<5;i++){ for(j=0;j<5;j++) c[i][j]=a[i][j]+b[i][j]; return c; } 您可以通过引用传递 我不能用你的矩阵,因为我认为代码不是100%正确的。代码应该是这样的 int mat(int x, int y, const int *m_

我的矩阵加法c代码如下所示:

mat(int n,int a[][5],b[][5] ){
   int i,c[5][5];

   for(i=0;i<5;i++){
       for(j=0;j<5;j++)
           c[i][j]=a[i][j]+b[i][j];

    return c;
}

您可以通过引用传递

我不能用你的矩阵,因为我认为代码不是100%正确的。代码应该是这样的

int mat(int x, int y, const int *m_a, const int *m_b, int *m_out);
其中:

  • 函数返回的int是一种状态代码
  • x和y是矩阵的宽度和高度
  • m_a,m_b是输入矩阵。它们是常量
  • m_out是输出矩阵
您可以通过如下方式返回矩阵来“升级”函数:

int *mat(int x, int y, const int *m_a, const int *m_b, int *m_out){
    // do some work
    if (something is not OK)
        return NULL;
    else
        return m_out;
}

// in main()
int a[5 * 6];
int b[5 * 6];
int result[5 * 6];
mat(5, 6, a, b, result);
// use result.
第三种选择,可能更糟糕——分配内存,并返回分配的内存。以后需要释放内存

int *mat(int x, int y, const int *m_a, const int *m_b){
    int *m_out = malloc( x * y * sizeof int);

    if (m_out == NULL)
        return NULL;

    // do some work

    if (something is not OK){
        free(m_out);
        return NULL;
    }else
        return m_out;
}

// in main()
int *m = mat(5, 6, a, b);
// use m
free(m);
如有疑问,请发表评论

在所有示例中,我都假定为一维数组。您可以轻松地将二维坐标转换为一维坐标,请选中此处:

这里是完整的,工作的例子,我会这样做

#include <stdio.h>

int *mat(int x, int y, const int *m_a, const int *m_b, int *m_out){
    int i;
    for(i = 0; i < x * y; ++i)
        m_out[i] = m_a[i] + m_b[i];

    return m_out;
}

void print_mat(int x, int y, const int *m){
    int i, j;
    for(i = 0; i < x; ++i){
        for(j = 0; j < y; ++j)
            printf("| %4d ", m[i * y + j]);

        printf("|\n");
    }
}

#define X   2
#define Y   2

int main(){
    int a[X * Y] = { 1, 2, 3, 4 };
    int b[X * Y] = { 1, 2, 3, 4 };
    int result[X * Y];

    int *r = mat(X, Y, a, b, result);

    print_mat(X, Y, r);

    return 0;
}

不能在C中返回数组! 调用函数需要定义输出矩阵(示例中为c[]),并将其作为参数传递给乘法函数

您的代码中还有更多错误需要修复。

这是您的代码(刚刚格式化并添加了缺少的右括号):

#包括
mat(整数n,整数a[][5],整数b[][5])
{
int i,c[5][5];

对于(i=0;iI,在您的程序中,有许多其他错误与您的问题无关。请先开始更正它们。为什么-1?我看不到我的代码有任何问题不是我的否决票,而是
int a[5,6];
是错误的。如果需要的话,函数参数仍然可以是OP中的固定大小数组,尽管将它们设置为指针+大小确实会使事情更加通用。拼写错误,固定。这就是为什么需要typedef,但我决定不加混淆。好吧,现在它甚至可以编译了。(免费完成家庭作业)嘿,尼克,我可以用c来声明变量维数组吗?…比如“int array[n][n]?”这并不能回答这个问题。一旦你有足够的数据,你就可以;相反,-当然,“你不能用c来返回数组”不需要提问者的澄清吗?我喜欢这种语法。不知道是否有可能
作废打印材料(int r,int c,int m[r][c])
@Nick Yep这很好;在数组使用它之前,请确保声明中有
r
c
!这是原始的C99还是C11?@Nick非常确定C99,我用
-std=C99
编译,我在许多编译器上使用过它,其中一些至少不支持所有的C11。@Nick Yep,显然这是C99的一个功能,ma在C11中可选(参见这里:)。它也不是在C++ O.O中。
#include <stdio.h>

int *mat(int x, int y, const int *m_a, const int *m_b, int *m_out){
    int i;
    for(i = 0; i < x * y; ++i)
        m_out[i] = m_a[i] + m_b[i];

    return m_out;
}

void print_mat(int x, int y, const int *m){
    int i, j;
    for(i = 0; i < x; ++i){
        for(j = 0; j < y; ++j)
            printf("| %4d ", m[i * y + j]);

        printf("|\n");
    }
}

#define X   2
#define Y   2

int main(){
    int a[X * Y] = { 1, 2, 3, 4 };
    int b[X * Y] = { 1, 2, 3, 4 };
    int result[X * Y];

    int *r = mat(X, Y, a, b, result);

    print_mat(X, Y, r);

    return 0;
}
[nmmm@zenbook HM3]$ gcc -Wall -Wpedantic x.c
[nmmm@zenbook HM3]$ ./a.out 
|    2 |    4 |
|    6 |    8 |
[nmmm@zenbook HM3]$