2011-04-19 66 views
3

我正在写一个n×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

你想void multiplication(float *a, float *b, float *x, int n);轮廓。请注意,除非您有特定的理由使用float,否则通常应该使用size_t作为索引和数组大小,使用double作为首选浮点类型。

a,bx中的每一个都指向连续的浮点值,您将需要使用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]); 

这种迂腐的构造会向编译器指出数组的长度是相同的,它们是2D的,并且在运行时从调用代码指示大小。此外,所有阵列都可以缓存,因为它们彼此不是alias

人们只能梦见C继续先进,C99仍然没有完全支持,并且很多other improvements还没有成为主流。

0

你必须通过这两个矩阵的第一个元素的地址在乘法方法

实际上事情是,一个数组元素被布置的就像队列意味着一个又一个的元件。所以如果你知道第一个元素的地址,那么你只需增加索引号,你就可以轻松获得该数组的所有成员。

检查this

这可能是帮助你

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);