
変数:ABC(負号無し1byte)は「-10」のオフセットがついてます。
(0の時-10という値を表す)
変数:XYZ(負号無し1byte)には「-50」のオフセットがついてます。
(0の時-50という値を表す)
この2つの変数を使って、XYZ = ABCの代入処理をする場合ですが、
ABC=100とした時(物理値は90)XYZにこのまま代入すると
物理値は50になってしまうので、XYZのオフセット分に合わせこむ為、
ABCの変数に「40」を加算し「140」にしてから代入すれば良いのでしょうか?
又、ABC = XYZ をやる場合は逆に-40してから代入すればOKでしょうか?
ご存知の方おりましたら、教えてくださいお願いします。
No.4ベストアンサー
- 回答日時:
オフセット値がくせ者ですね。
ただし、ここでは符号無し1バイトということですから、データタイプは unsigned char ということになり、オフセット値はマイナス(-)の符号を用いることはできません。すなわち、+オフセット値をとります。ここでは、オフセット値を先にセットしてから代入を行っていますが
abc = 値;
ではなく
abc += 値; ・・・(1)
の加算による代入としています。
そして abc を用いた xyz への代入は
xyz = abc;
ではなく、オフセット値を配慮した (1) と同じ
xyz += abc - OFFSET_A; ・・・(2)
の加算による代入としています。
OFFSET_A は、(2) で配慮していますが、(1) の段階で配慮しても構いません。いずれも、物理値を xyz に渡すようにすることです。OFFSET_Aを (1) にもってくるか (2) にもってくるかは、あなたが理解し易い方を選べば良いのではないでしょうか。
#include <stdio.h>
#define OFFSET_A10
#define OFFSET_X50
#define reset(a,b) {a = OFFSET_A; b = OFFSET_X;}
int main(void) {
unsigned char abc, xyz, temp;
/* 各オフセットの設定 */
reset(abc, xyz);
/* 表示読みの代入 */
printf("表示abc(%d)? ", OFFSET_A);
scanf("%d", &temp);
abc += temp;
xyz += abc - OFFSET_A;
printf("xyz: 表示.%d - オフセット.%d = 物理量.%d\n",
xyz + OFFSET_X, OFFSET_X, xyz);
reset(abc, xyz);
printf("表示xyz(%d)? ", OFFSET_X);
scanf("%d", &temp);
xyz += temp;
abc += xyz - OFFSET_X;
printf("abc: 表示.%d - オフセット.%d = 物理量.%d\n",
abc + OFFSET_A, OFFSET_A, abc);
return 0;
}
No.3
- 回答日時:
>変数:ABC(負号無し1byte)は「-10」のオフセットがついてます。
ABC: 0 から 255 ← 「負号無し1byte」
「物理値」: 10 から 265
と読めますが、
>(0の時-10という値を表す)
ABC: 0 から 255 ← 「負号無し1byte」
「物理値」: -10 から 245
オフセットしない値が -10 では、「+10」のオフセット、ではないですか。
★引用した2行は、矛盾していませんか。
>ABC=100とした時(物理値は90)
前述後者の「 + 」のオフセット、ですね。← ABC = 90 + ( +10 ) = 100
以降、おそらく質問者様の意に反して?「 + 」のオフセット、でアドバイス。
----------------------------------------------------------
(「物理値」は、小文字表記しています)
>XYZ = ABCの代入処理をする場合・・
xyz + ( +50 ) = abc + ( +10 ) ですよね。
★abc = 90 のとき、xyz は 50 となり、XYZ, ABC は 100 のまま( XYZ = ABC )。
プログラム的にしてみると、
#define BIAS (10)
#define ABC_OFF(i) (i+BIAS) // ((i+BIAS+256)%256)
abc = 90; // 「種」となる値 = オフセットしない値
ABC = ABC_OFF( abc );
XYZ = ABC;
これで、ABC は 100 となり、XYZ も当然・・。
>ABC = XYZ をやる場合は逆に-40してから代入すればOKでしょうか?
・「 - 」のオフセットの場合は、「-40してから代入すればOK」です。
abc + ( +10 ) = xyz + ( +50 ) から、abc = xyz + 40
・「 + 」のオフセットの場合は、「+40してから代入すればOK」です。
プログラム的にしてみると、
#define BIAS (50)
#define XYZ_OFF(i) (i+BIAS)
xyz = 200; 例えばの値
XYZ = XYZ_OFF( xyz );
ABC = XYZ;
これで、ABC は、250 になる・・。
★ abc は、250 - ( +10 ) で 240 → 200 に「+40してから代入」と同じ。
注意:「+-40して」云々で、「求める」ものは「物理値」であり、ABC ではない。
No.2
- 回答日時:
必ずしも、オフセット値の差が同じ処理ばかりという保証はありませんから、一旦物理値にする方がスマートです。
そうすると、
・Aを「物理値に変換するマクロA(関数A)」で物理値に変換
・物理値を「物理値からオフセット値に変換するマクロX(関数X)」で変換し代入
とすることで、このマクロ(関数)を変更するだけで本体の処理はそのままで使用することができ、変更漏れによるミスもなくすことができます。
特に、
>ABC(負号無し1byte)
に対して
>-40してから
と行った場合、40未満の値に対して型の変換問題が発生しやすくなります。
……と、ここまで書いて気がついたのですが、両方とも「符号なし」ですね。
単純に「-50」としたら物理値が「0~49」の時に問題が発生しませんか?
「符号あり」の間違いでは?
No.1
- 回答日時:
>この2つの変数を使って、XYZ = ABCの代入処理をする場合ですが、
>ABC=100とした時(物理値は90)
物理値の代入をしたいのですか?だとすると、
1)ABCの値を物理値に変換する(100→90)
2)ABCの物理値90をXYZに代入する
3)XYZにオフセットを履かせる(90→140)
これで、ABCのオフセット付き値(100)を
XYZのオフセット付き値(140)に代入できたことに
なりませんか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストボックスの値を変数に...
-
VBAでダブルコーテーション入り...
-
変数にオフセットが付いている...
-
C言語 exitで終了した関数の戻...
-
Variant型で宣言してるのにEmpt...
-
URLが開いた後に処理したい
-
[VBS]変数を定数に変換する方法...
-
C言語 列挙型(enum型)変数について
-
最小二乗法
-
無名関数のメリットがよくわか...
-
フォームを開くときに、コンボ...
-
C言語 exitの使い方
-
デジタルカレンダーでTo Do 事...
-
変数名の間接指定
-
VB6.0-整数と余りを求める
-
フリーランタイマーの時間差分...
-
ラジオボタンの値の取得につい...
-
2つの列で重複するキーの数と...
-
COLUMN(1:1)の意味を教え...
-
VBA コンボボックスの値をスピ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
jsp~jspにhiddenを使って変数...
-
VBAでダブルコーテーション入り...
-
エラーの意味は? Lvalue req...
-
EXCEL/VBA 変数の値をクリップ...
-
[VBS]変数を定数に変換する方法...
-
Variant型で宣言してるのにEmpt...
-
テキストボックスの値を変数に...
-
processing エラーで、 "cannot...
-
整数xxxが大き過ぎますというエ...
-
stdpicture型の変数に、、
-
Accessコンボボックスにレコー...
-
verilog HDLの[=]と[<=]の使い分け
-
プログラミングで変数と関数の...
-
Borland C++ Compiler 5.5の警...
-
【VBA】複合代入演算子
-
gridViewの行選択解除
-
VBAでコマンドプロンプトの結果...
-
VBA 1行で複数の代入を行った...
-
C言語 アロー演算子について質...
-
DataTableの値を変数に代入したい
おすすめ情報