2016-05-03 12 views
0

少し助けが必要です。私は配列の要素を一つ上にシフトしたいので、新しい位置1には位置1の古い値が含まれ、new-2にはold-1などが含まれています。古い最後の値は破棄され、最初の位置の新しい値は毎秒与える新しい値です。配列内の要素を移動する

Iは、サイズ10の配列を使用する:

uint32_t TEST[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 

I、使用コードは、毎秒実行されなければなりません。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 
{ 
    /* Code for shifting the elements */ 
    for (int i = 0; i < 9; i++) 
    {     
     TEST[i+1] = TEST[i]; 
    } 
    TEST[0] = HAL_ADC_GetValue(&hadc); 
} 
+4

'i < 10' -->' i <9 ' – BLUEPIXY

+4

a。あなたが求めている質問が何であるか分かりません。 b。 9 + 1はTESTの定義を超えているため、forループとlimitを 'i <9 'に変更する必要があります。 – niry

+1

ちょっとしたヒントとして、リングバッファを使うほうがいいかもしれません。これにより、大量のコピー指示を保存することができます。 @BLUEPIXYはいこれが解決策になるはずです – Schafwolle

答えて

3

ringbufferはデータのコピーを少なくします。最も新しいサンプルを指し示すようにしたい場合は、読み込み前に増加させます。

uint32_t TEST[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
int last_pos = 0; /* init to any valid number between 0 and 9 inclusively */ 

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 
{ 
    last_pos = (last_pos + 1) % 10; 
    TEST[last_pos] = HAL_ADC_GetValue(&hadc);  
} 
1

バッファは連続でなければならない、とリングバッファはしないだろう場合は、memmoveは、最も簡単なオプションです:

memmove(&TEST[1], &TEST[0], count * sizeof(*TEST)); 

  • &TEST[1]は、最初の要素の宛先である
  • &TEST[0]が移動する最初の要素です
  • count(現在9)
  • sizeof(*TEST)を移動する要素の数である単一要素のサイズ

バイトの数をカウントする別の方法は、サイズの単一の要素のサイズをsubstractれる、sizeof(TEST) - sizeof(*TEST)でありますアレイ全体のしかし、これはTESTが実際の配列であり、ポインタではない場合にのみ機能します(例えば、ポインタが関数に引数として渡された配列)。

関連する問題