2015年9月20日日曜日

Arduino: Pointer

ポインタというものがC言語(Arduino)では出てくる。これに関して分かりやすく説明しているページが見つけられなくてとってもこまった。
I couldn't find good explanations for a pointer function in C language on the Web and wasted my time.

今回行いたいのは,作成した関数から複数の戻り値(数値の配列)を得ること。MATLABだと超簡単なんだけど,C言語では基本的にはできないらしい。そこで使用するものが,ポインタというもの,らしい。
This time, I want to get an array of values as the return value of a function. In MATLAB it is very easy to write but C does not allow such a program. Instead, "pointer" enables us to achieve  almost the same thing.

結局,以下のように書いたら上手くいきました。MATLABでいうと,
In MATLAB, to get an array of values as the return value, you write

function main
pointer = testFunc;
disp(pointer)

function pointer = testFunc
for i = 1:6
   pointer(i)=i;
end

これで得られる配列を得るためには,Cだとこんな感じになる。
but in C, you write something like that.

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

void loop() {
  int pointer[] = {0, 0, 0, 0, 0, 0}; //(1)
  // the size of pointer is 6

  // Fucntion
  testFunc(pointer); //(2)

  // print on a serial monitor
  for (byte i = 0; i < 5; i++) {
    Serial.print(pointer[i]);
    Serial.print(',');
  }
  Serial.write(10); // new line character
  delay(1000);
}

void testFunc(int *a) { //(3)
  // put pointer as an argument
  for(byte i = 0; i<5; i++) {//(4)
    *a = i;
    ++a;  
    // the pointer proceeds from 0 to 5.
    // this maybe the same that a[0]=i ... a[5]=i.
  }
  
  // no "return", but the pointer is updated.
}


あまり説明が見つからなかったこともあり,ポインタについての理解は足りませんが,実用的な使い方としての解説をしてみます。


(1) int pointer[] = {0, 0, 0, 0, 0, 0};

で,ポインターと呼ばれるものをつくります。これは,ポインターとか言わずに,とりあえず欲しい配列入れるための変数を宣言すると考えましょう。今回はテストとして0を入れてますが,pointer[6];として,サイズだけ決めてもいいのかもしれません。
this made a pointer, and it is better to regard as just a variable which will contain an array of values. This time I write {0,0,0,0,0,0} but it maybe OK to state int pointer[6].


(2) testFunc(pointer); 

戻り値は書いてませんが,ポインターが勝手に更新されてくれるのでOKです。
this doesn't include the return value, but it's OK because the pointer gets the return value.

(3) void testFunc(int *a) {

引数を「*a」としているのがポインターとして使うというしるしです。きっと。
The asterisk maybe the sign to use an argument as a pointer. 

(4)for(byte i = 0; i<5; i++) {
     *a = i;
      ++a; 
   }

for文の中で,何やらポインターの数を増やしつつ,ポインターに値を代入しています。これがどういう仕組みかはわかりませんが,MATLABでいうと,for i=1:6; a(i)=x; end と一緒ということでしょう。もちろん,厳密な意味は違うのでしょうが,表層的にはこれでいいかと。
In the for loop, the value of the pointer increases and at the same time i is substituted for the pointer valuable. This may mean that for i=1:6; a(i)=x; end in the MATLAB language at least superficially.

とりあえず,これさえ理解できれば,戻り値に配列を設定するのは実装できるかな,と思います。根本的な間違いがあれば教えて下さい。

0 件のコメント:

コメントを投稿