1、最簡單的方法是採用記憶體複製函式完成:
專案要求當取樣點滿50天以後採用「滾動窗」方式(每增加新一天的資料刪除陣列中最早存入的資料,類似於先進先出佇列),因此需要移動陣列的操作,特此記錄。
#define sample_num 50
//採集點
#define meter_num 20
//表計總數
float child_meter[sample_num]
[meter_num]
;//子表讀數
float parent_meter[sample_num]
;//總表讀數
對於一維陣列parent_meter而言,理解最為簡單,無論是一維還是二維陣列在記憶體的儲存都是連續的(參考文獻),採用函式mem_cpy(void *dst,void *src,int16u len)把 *src指向位址上len個位元組長度的記憶體複製到 * dst指向的記憶體區域。
/* copy memory to memory */
void
mem_cpy
(void
*dst,
void
*src,int16u len)
}
1.1一維陣列的向左移動乙個位置:
函式中可以看到len值的是位元組長度,因此要注意我們需要移動陣列中元素的資料型別,data.parent_meter[sample_num]陣列元素的型別是float型,佔四個位元組因此len的位置移動sample_num-1個長度要乘以sizeof(float)
mem_cpy
(data.parent_meter,data.parent_meter+1,
(sample_num-1)
*sizeof
(float))
;
1.2二維陣列的向左移動乙個位置:
二維陣列在記憶體中的儲存方式也是連續的,和一維陣列相同,但是區別在於一維陣列的首位址加一和二維陣列的首位址加一移動的步長不同,data.child_meter+1會使得指標指向二維陣列的下一行,data.child_meter-1會使得指標指向陣列的上一行。步長為meter_ num × 4個位元組,而且移動的起點位址應該為&(data.child_meter[1])也就是data.child_meter+1
mem_cpy
(data.child_meter,
&(data.child_meter[1]
),(sample_num-1)
*sizeof
(float
)*meter_num)
;
集訓一 二維陣列與結構體
三 結構體 四 總結 因眾多學長學姐已經詳細出過集訓的答案,故在此不做補充,謹提供課堂筆記以作參考。大一新生一枚,所寫內容不夠嚴謹,望多多包涵互相進步 首先我們需要知道c 對c語言是100 的相容,即c語言我們所學的在c 裡都可以用。c 的標頭檔案和輸入輸出 1.萬能標頭檔案 放在第一行 inclu...
C語言部落格作業 一二維陣列
我在pta上用的是一開始用的是順序排序法。後來知道二分法效率更改改的因為沒有看到題目中的格式要求錯了一下其他的大體正確。行列柔和在一起寫的很亂後來做了注釋就沒那麼亂了總體來說不是很難。本題就是跨越那個已經是7的猴子第二次報數比較難操作其他的都不是難題 張志鑫張志鑫 我 他可能是沒有看到題目。他的做法...
C語言部落格作業 一二維陣列
定義三個整型變數n用來存放整數個數i,j是迴圈數 scanf d n 定義乙個整型陣列a 10 當i 0時執行迴圈 輸入陣列 i 讓j n 1 當j大於0時輸出陣列 每次j 當j等於0時去空格輸出a 0 如圖,本題遇到主要問題是陣列最後一位數輸出時沒有去空格,通過printf語句除錯解決。定義整型變...