2014-02-19 92 views
0

我想用乘法計算矩陣A的功率。 我遇到了ArrayPower函數的問題。它不起作用,因爲我認爲它應該。MultiArray功能似乎工作正常。誰能幫我 ?矩陣功率和指針

#include <stdio.h> 

int** MultiArray(int a[2][2],int b[2][2]); 
int** ArrayPower(int a[2][2],int e); 


int main(void) 
{ 
    int fa[2][2]; 
    fa[0][0]=0; 
    fa[0][1]=1; 
    fa[1][0]=1; 
    fa[1][1]=1; 

    int **multifa=malloc(sizeof(int)*2); 
    for (int i=0;i<2;i++) { 
     multifa[i]=malloc(sizeof(int)*2); 
    } 

    multifa=ArrayPower(fa,2); 

    printf("%d %d\n",multifa[0][0],multifa[0][1]); 
    printf("%d %d\n",multifa[1][0],multifa[1][1]); 

    return 0; 

} 

int** MultiArray(int a[2][2], int b[2][2]) { 

    //multi a *b 
    //memory allocation 
    int i,rows=2,cols=2; 
    int **c=malloc(rows*sizeof(int)); 
    for (i=0;i<rows;i++) { 
     c[i]=malloc(cols*sizeof(int)); 
    } 


    c[0][0]=a[0][0]*b[0][0]+a[0][1]*b[1][0]; 
    c[0][1]=a[0][0]*b[0][1]+a[0][1]*b[1][1]; 

    c[1][0]=a[1][0]*b[0][0]+a[1][1]*b[1][0]; 
    c[1][1]=a[1][0]*b[0][1]+a[1][1]*b[1][1]; 


    return c; 

} 

int** ArrayPower(int a[2][2],int e) { 


    //memory allocation 
    int i,rows=2,cols=2; 
    int **c=malloc(rows*sizeof(int)); 
    for (i=0;i<rows;i++) { 
     c[i]=malloc(cols*sizeof(int)); 
    } 

    c[0][0]=a[0][0]; 
    c[0][1]=a[0][1]; 
    c[1][0]=a[1][0]; 
    c[1][1]=a[1][1]; 

    for (i=1;i<e;i++) { 
     c=MultiArray(a,c); 
    } 
    return c; 

} 
+0

你爲什麼要爲'multifa'分配內存?在調用ArrayPower()之後,你會丟失對分配內存的引用,並且會泄漏內存。 – Heeryu

+0

你是對的!沒有必要。感謝您的幫助! – MrRisoni

回答

0

MultiArray被聲明爲接受類型int [2][2]的第二參數,但它被稱爲與c一個參數,如int **類型。這些是不兼容的類型。

在參數中,類型int [2][2]會自動轉換爲指向兩個int的數組的指針,類型爲int (*)[2]。這是一個指向有兩個對象的地方的指針(並且,因爲我們知道它是包含兩個對象的兩個數組的數組中的第一個元素,所以我們知道除了前兩個對象外還有兩個對象)。

cint **c的定義意味着c是指向指向int的指針。指向指針的指針和指向數組的指針是不同的,並且不兼容。

解決此問題的一種方法是使用int (*c)[2] = malloc(2 * sizeof *c);定義c。然後在分配更多空間的定義之後不需要循環;單個分配分配整個數組。

MultiArray的返回類型應該與其中的代碼以及程序中的其他地方類似地更改。或者,MultiArray的第二個參數可以從int b[2][2]更改爲int **b。 (後者更容易編輯,但會產生較差的程序,因爲它會使用更多的指針和分配,而不是必要的。)

您應該始終編譯啓用了警告的代碼。這會提醒你不正確的呼叫。