Arduino memset()関数
このチュートリアルでは、Arduino の memset()
関数を使用して値のバイトを宛先に設定する方法について説明します。
Arduino の memset()
関数
memset()
関数は、値のバイトを Arduino の宛先に設定します。この関数は、指定された値から特定のバイト数を取得し、それを宛先に格納します。
構文:
memset(destination, value, N_bytes);
上記の構文では、memset()
関数は指定された値の最初の N_bytes
を取得し、それを destination
内に格納します。値が整数またはその他のデータ型の場合、バイトデータ型に変換されます。
整数の配列を作成し、memset()
関数を使用してその値を変更します。
コード:
int ch1[4] = {1, 2, 3, 4};
void setup() {
Serial.begin(9600);
memset(ch1, 2, 4 * sizeof(ch1[1]));
for (int i = 0; i < 4; i++) {
Serial.println(ch1[i]);
}
}
void loop() {}
出力:
514
514
514
514
整数の配列を定義し、memset()
関数を使用して、4つの要素すべてを整数 2
のバイトに置き換えました。ループを使用して、ArduinoIDE のシリアルモニターウィンドウに配列の値を出力しました。
int()
関数を使用して、バイト値を整数に変換することもできます。各配列値をバイト変数に格納し、それを int()
関数内に渡して整数に変換する必要があります。
上記の配列値を整数に変換してみましょう。
コード:
int ch1[4] = {1, 2, 3, 4};
void setup() {
Serial.begin(9600);
memset(ch1, 2, 4 * sizeof(ch1[1]));
for (int i = 0; i < 4; i++) {
byte b = ch1[i];
int c = int(b);
Serial.println(c);
}
}
void loop() {}
出力:
2
2
2
2
バイト値は整数に変換されていますが、元の配列内には格納されていません。memset()
関数を使用して、文字列と文字で同じ操作を行うこともできます。
memset()
関数を使用して、文字の配列を定義し、それらを別の文字に置き換えることができます。
memset()
関数を使用した後、文字のバイト値を含む配列を取得しますが、char()
関数を使用して値を文字に戻すことができます。
各バイト値をバイト変数に格納し、それを char()
関数内に渡して文字に変換する必要があります。整数の配列を定義し、文字値を格納してから、それらを別の値に置き換えましょう。
コード:
int ch1[4] = {'a', 'b', 'c', 'd'};
void setup() {
Serial.begin(9600);
memset(ch1, '.', 4 * sizeof(ch1[1]));
for (int i = 0; i < 4; i++) {
byte b = ch1[i];
char c = char(b);
Serial.println(c);
}
}
void loop() {}
出力:
.
.
.
.
3 番目の引数では、乗算する整数が、配列内で置き換える値の数を定義します。すべての値を置き換えたくなく、配列の一部の値のみを置き換えたい場合は、memset()
関数の最初の引数に整数を追加する必要があります。
指定された配列の 2 番目と 3 番目の値のみを置き換えたいとします。最初の引数に 1
を追加し、3 番目の引数に 2
を掛ける必要があります。
コード:
int ch1[4] = {'a', 'b', 'c', 'd'};
void setup() {
Serial.begin(9600);
memset(ch1 + 1, '.', 2 * sizeof(ch1[1]));
for (int i = 0; i < 4; i++) {
byte b = ch1[i];
char c = char(b);
Serial.println(c);
}
}
void loop() {}
出力:
a
.
.
d
配列の中央の要素のみが置き換えられます。ループを使用して配列内に値を格納することもできます。
次の例では、Arduino のループを使用して上記の操作を実行してみましょう。
コード:
char ch1[4] = {'a', 'b', 'c', 'd'};
void setup() {
Serial.begin(9600);
for (int i = 1; i < 3; i++) {
ch1[i] = '.';
}
for (int i = 0; i < 4; i++) {
Serial.println(ch1[i]);
}
}
void loop() {}
出力:
a
.
.
d
上記のコードでは、配列を char
データ型として定義し、ループを使用して要素を置き換え、別のループを使用して配列要素を出力しました。int
を使用して指定された配列を宣言すると、文字は ASCII 表現に変換されます。
配列の値を出力するにはループを使用する必要がありますが、文字列の場合はループなしで出力できます。ループを使用して、文字列に存在する文字を置き換えることができます。
置き換えたい文字をインデックスを使用して取得してから、別の文字を使用して置き換える必要があります。文字列を定義し、その文字の一部を別の文字に置き換えましょう。
コード:
String ch1 = "hello world";
void setup() {
Serial.begin(9600);
for (int i = 1; i < 5; i++) {
ch1[i] = '.';
}
Serial.println(ch1);
}
void loop() {}
出力:
h.... world
指定された文字列の一部の文字が別の文字に置き換えられます。memset()
関数の場合、関数は他のデータ型の配列では機能しないため、int
データ型で指定された配列を定義しました。