将动态二维数组传递给函数

3

我正在用C语言编写一个n x n矩阵乘法程序,其中a [][]和b [][]是输入,x [][]是输出。 a,b和x都是malloc'd,但我不确定如何正确地将指针传递给乘法函数。下面是我尝试做的概述:

    void multiplication(float a, float b, float x, int n);

    void main() {

        float **a, **b, **x;
        int n;          // size of arrays (n x n)

        multiplication(a, b, x, n);
    }

   void multiplication(float a, float b, float x, int n) {

      // function

   }
4个回答

5
你想要的是 void multiplication(float *a, float *b, float *x, int n);。请注意,通常应使用size_t作为索引和数组大小,并且除非有特定原因要使用float,否则应将double作为首选浮点类型。
每个abx都指向连续的浮点值,您需要使用a[n * x + y]对它们进行解引用。
C99引入了各种有趣的优化可能性,但在我所知道的任何编译器中,几乎都不能依赖它们: 有了这些,就可以实现类似于以下内容:
void multiplication(size_t len; // <- semicolon not a mistake
    double a[len][restrict const len],
    double b[len][restrict const len],
    double c[len][restrict const len]);

这个学究式的结构会告诉编译器数组长度相同,它们是二维的,并且大小在运行时从调用代码中指定。此外,所有数组都可以缓存,因为它们不互相别名
人们只能梦想C语言继续进步,C99仍未得到充分支持,许多其他改进还没有成为主流。

0

嗯,在C语言中要做这种事情,你必须理解指针。以下是一个简单的代码:

int n = 10;

float * multiply ( float *a, float *b ) {
    float *ans;
    int i, j, k;
    ans = malloc(sizeof(float)*n*n);

    for (i=0; i<n; ++i)
        for (j=0; j<n; ++j) {
            ans[i*n+j] = 0.0;
            for (k=0; k<n; ++k)
                ans[i*n+j] += a[i*n+k] * b[k*n+j];
        }

    return ans;
}

int main() {
    float *a, *b, *ans;

    a = malloc(sizeof(float)*n*n);
    input(&a);
    b = malloc(sizeof(float)*n*n);
    input(&b);

    ans = multiply(a,b);
    output(ans);

    return 0;
}

如果您对代码理解有困难,请尝试提高指针技能。您也可以随时向我们提问。

0

这里有一种简单易行的方法,可以将动态分配的数组传递给函数。

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

void Function(int ***Array);

int main()
{
    int i, j, k, n=10;

    //Declare array, and allocate memory using malloc. ( Dimensions will be 10 x 10 x 10)
    int ***Array=(int***)malloc(n*sizeof(int**));
    for (i=0; i<n; i++)
    {
        Array[i]=(int**)malloc(n*sizeof(int*));
        for (j=0; j<n; j++)
        {
            Array[i][j]=(int*)malloc(n*sizeof(int));
        }
    }

    //Initialize array in a way that allows us to check it easily (i*j+k).
    for (i=0; i<n; i++)
    {
        for (j=0; j<n; j++)
        {
            for (k=0; k<n; k++)
            {
                Array[i][j][k]=i*j+k;
            }
        }
    }
    //Check array is initialized correctly.
    printf("%d\n", Array[4][5][6]);

    //Pass array to Function.
    Function(Array);

    //Check that Function has correctly changed the element.
    printf("%d\n", Array[4][5][6]);

    return 0;
}

void Function(int ***Array)
{
    //Check that Function can access values correctly.
    printf("%d\n", Array[4][5][6]);
    //Change an element.
    Array[4][5][6]=1000;
}

我知道这与您的矩阵乘法无关,但它应该演示如何将数组传递给函数。很可能您的函数需要知道数组的维度,因此也要将其传递给函数... void Function(int ***Array, int n) 并调用函数为 Function(Array, n);


0

在乘法方法中,您必须传递两个矩阵的第一个元素的地址。

实际上,数组的元素是像队列一样排列的,意味着一个元素跟在另一个元素后面。所以如果您知道第一个元素的地址,那么只需增加索引号,就可以轻松获取该数组的所有成员。

请查看this

它可能会对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接