照著上一篇,Bee的說法,實驗c compiler 附的memcpy( );函數。
做之前先做點功課,memcpy( ) 的介紹
真的快多了,比我自己寫的還要快很多倍,複製80個char 就只要85個指令時間。
在做這個的過程中發現一個有趣的現象,因為dsPIC是16bits的微控制器,當在跑for 迴圈時,如果變數宣告成char (8bits) 這樣運算會比宣告成int (16bits)的運算來的久一倍運算時間。
這樣以後在寫程式的時後要特別注意一下,為了省一個byte,卻浪費1倍的運算時間。
二維矩陣本來就是C語言的謎。因為我就是用過動態記憶體直接用cast變成二維矩陣,真的不易成功。
回覆刪除所以對於複製過的二維矩陣只好寫成*(*(matrix+1)+5)來代表matrix[1][5]。如果沒有複製過,這兩個寫法是可以互通(在X86下),這也是二維矩陣怪的地方。
[版主回覆12/11/2008 16:22:51]對不起,看不是很懂,可以舉個例子嗎?
謝謝!
二維矩陣在各CPU間沒有實現標準,所以使用上有一些問題。
回覆刪除為了解決移植問題,還是會使用抓取一維矩陣的記憶體方式來取得記憶體。然後使用一個**matrix的指標指向此記憶體(matrix=address;),就開始當二維矩陣使用。用法就是*(*(matrix+1)+5)。
但在X86下宣告matrix[10][10],一樣用上面的寫法去取,還真的取中matrix[1][5]的值。
但使用指標和矩陣仍有不同,矩陣無法移動,指標可以移到別的記憶體區域工作,只是寫法不好看。
事隔太久,記錯了。使用**matrix不能代表二維矩陣。因為欠了一個維度長度。
回覆刪除所以我當時成功的二維矩陣指標是用一維指標做的。
*(martix+1*10+5),其中10就是矩陣維度長度。
寫起來太長,用巨集解決
#define Matrix(x,y) (*(matrix+x*10+y))
使用上就可以為
Matrix(1,5)=10;
t=Matrix(1,5);
[版主回覆12/11/2008 18:16:46]剛剛搞笑了,在寫多維矩陣的時後,在設初值的for迴圈忘計更改,而除錯位置顯示在memcpy9( ) 上,所以讓我覺得沒有辦法做memory copy,用同樣的方式,可以memcpy( ) 多維矩陣,看查了一下,MPLAB 的矩陣宣告也是一個連續的位址,所以大概是因為這樣所以才可以memcpy。
以下為實驗程式
回覆刪除#define Mat(x,y) (*(pa+x*10+y))
int main(int argc, char* argv[])
{
int a[10][10];
int *pa;
int t,r;
a[1][5]=10;
pa = a;
t = Mat(1,5);
r = *(*(a+1)+5);
printf("%d\t%d\n",t,r);
Mat(1,5) = 20;
printf("\n%d\n\n",a[1][5]);
printf("%p\n%p\n",&a[1][5],(pa + 1*10 + 5));
getch();
return 0;
}
[版主回覆12/11/2008 17:54:41]複製這段程式,會出現
CORE-E0001: Trap due to stack error, occurred from instruction at 0x000fce
似乎在我的compiler是不可行的。
那個錯誤訊息表示堆疊不足。把a[10][10]改到main()外面,然後改為a[2][10]再試試。
回覆刪除[版主回覆12/11/2008 18:24:34]和剛剛一樣,搞笑- -,我實驗的程式一直在開記憶體,忘了關掉,關掉就好了。
沒有錯,執行的結果確實一樣。
謝謝您。又多學了一課。