2011-04-19 67 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);