2017-04-30 269 views
0

我有一個函數,它返回名稱爲'a'的4x2矩陣的地址。 該函數計算裏面'a'矩陣的元素並返回矩陣的地址。當我使用該函數時,我想將其輸出分配給一個名爲'a1'的矩陣,但是當我這樣做時,'a1'變成零矩陣。但是,當我將輸出分配給相同的'a'矩陣時,一切正常。誰能幫我?代碼寫在Arduino IDE上。將函數輸出分配給變量

double a[4][2], a1[4][2]; 
double T0E[4][4]={ 
    {0.1632, -0.3420, 0.9254, 297.9772}, 
    {0.0594, 0.9397, 0.3368, 108.4548}, 
    {-0.9848, 0, 0.1736, -280.5472}, 
    {0, 0, 0, 1} 
}; 

const int axis_limits[4][2]= 
    { 
    { -160, 160 }, 
    { -135, 60 }, 
    { -135, 135 }, 
    { -90, 90 } 
    }; 
    const unsigned int basex = 50, basez = 100, link1 = 200, link2 = 200, link3=30, endeff=link3+50; 

double *inversekinematic(double target[4][4]) 
{ 

    // angle 1 
    a[0][0] = -asin(target[0][1]); 
    a[0][1] = a[0][0]; 
    if (a[0][0]<axis_limits[0][0] || a[0][0]>axis_limits[0][1] || isnan(a[0][0])) 
    { 
    bool error=true; 
    } 

    // angle 2 
    double A = sqrt(pow(target[0][3]-cos(a[0][0])*endeff*target[2][2], 2) + pow(target[1][3]-sin(a[0][0])*endeff*target[2][2], 2)); 
    double N = (A - basex)/link1; 
    double M = -(target[2][3]-endeff*target[2][0] - basez)/link2; 
    double theta = acos(N/sqrt(pow(N, 2) + pow(M, 2))); 
    a[1][0] = theta + acos(sqrt(pow(N, 2) + pow(M, 2))/2); 
    a[1][1] = theta - acos(sqrt(pow(N, 2) + pow(M, 2))/2); 

    // angle 3 
    for (int i = 0; i <= 1; i++) 
    { 
    a[2][i] = {asin(-(target[2][3]-endeff*target[2][0]-basez)/link2-sin(a[1][i]))-a[1][i]}; 
    } 

    // angle 4 
    for(int i = 0; i <=1; i++) 
    { 
     a[3][i] = {-asin(target[2][0])-a[1][i]-a[2][i]}; 
     } 
     return &a[4][2]; 
} 

void setup(){ 
    Serial.begin(9600); 
} 

void loop() { 
    a1[4][2]={*inversekinematic(T0E)}; 
} 
+0

哦,我會放棄。 –

回答

0

當你鍵入return &a[4][2];要返回第5行的第三個元素的地址。這是出界的,因爲C++使用從零開始的索引,並且該數組被聲明爲double a[4][2];。我想你想要做的只是return a;返回整個矩陣的地址。

此外,你正在做很多奇怪的事情,比如聲明參數double target[4][4]的大小和使用初始化程序列表來分配單個元素,這對我來說看起來很不尋常。

我會盡量做得更詳細些。在C/C++中,數組無非就是指針。所以,當你將一個數組分配給另一個數組時,你可以直接指向內存中的相同數據。你將不得不做的是複製元素與循環,或者可能使用memcpy(dest, src, size)。例如,如果你想拷貝的內容double a[4][2]double b[4][2],你可以使用類似memcpy(b, a, sizeof(double) * 8);的東西。如果使用a = b;ab指向內存中的相同位置。

+0

這也會失敗,因爲他顯然試圖將數組分配給另一個數組。 –

+0

謝謝你的回答。正如你注意到的,我對此很陌生。我無法回報;工作,它說'不能轉換'雙(*)[2]'爲'雙'作爲回報​​'。但我將全局的'a'矩陣傳遞給memcpy(),它工作得很好。當我沒有用大小聲明雙重目標時,我得到錯誤。 – kaanyilmaz

0

兩點: 1.您的代碼表示函數inversekinematic()返回指向double而不是數組的指針。 2.您返回一個指向double的指針,但它始終是相同的地址。

也許typedefs有助於簡化代碼?

typedef double Mat42[4][2]; 

Mat42 a, a1; 

Mat42 *inversekinematic(double target[4][4]) 
{ 
     // ... 
     return &a; 
} 

但是,對於您顯示的代碼,我不明白爲什麼您需要返回固定全局值的地址。也許你真正的代碼可能會返回'a'或'a1'的地址,但如果它不...