編輯:忘了提到我在一個受限的平臺上,所以我試圖盡可能少地使用額外的變數。
...
switch (var->type) {
case (something1):
if (var->x >= 100 && var->x <= 105) {
do_something(var);
return;
}
break;
case (something2):
if (var->x >= 150 && var->x <= 155) {
do_something(var);
return;
}
break;
case (something3):
if (var->y >= 80 && var->y <= 85) {
do_something(var);
return;
}
break;
case (something4):
if (var->y >= 120 && var->y <= 125) {
do_something(var);
return;
}
break;
}
...
基本上,代碼只是檢查變數的型別,檢查特定于該型別的軸??上的范圍,如果滿足條件則呼叫函式,否則不執行任何操作。do_something()是所有段中完全相同的功能if。
我確信有一種簡單的方法可以減少重復次數,但我似乎無法弄清楚。
提前致謝。
uj5u.com熱心網友回復:
怎么樣:
switch (var->type) {
case (something1):
if (! (var->x >= 100 && var->x <= 105)) return;
break;
case (something2):
if (! (var->x >= 150 && var->x <= 155)) return;
break;
case (something3):
if (! (var->y >= 80 && var->y <= 85)) return;
break;
case (something4):
if (! (var->y >= 120 && var->y <= 125)) return;
break;
default:
return;
}
do_something();
uj5u.com熱心網友回復:
也許是這樣的:
typedef enum {
something1,
something2,
something3,
something4,
sometype_max
} some_type;
struct {
int min;
int max;
} limits[] =
{
[something1] = {100, 105},
[something2] = {150, 155},
[something3] = {80, 85},
[something4] = {120, 125}
};
...
if (var->type < sometype_max)
{
if ((var->x > limits[var->type].min) && (var->x < limits[var->type].max))
{
do_something();
}
}
uj5u.com熱心網友回復:
您可以執行以下操作:
int
main(int argc, char **argv) {
struct { int type; int y;} var[] = { 3, 82 };
struct range { int min; int max; } range;
switch(var->type) {
case 1: range = (struct range){100,105}; break;
case 2: range = (struct range){150,155}; break;
case 3: range = (struct range){80,85}; break;
case 4: range = (struct range){120,125}; break;
}
if( var->y >= range.min && var->y <= range.max) {
do_something();
}
return 0;
}
如果somethingN是足夠小的整數,這可以很好地概括為:
int
main(int argc, char **argv) {
struct { int type; int y;} var[] = { 3, 82 };
struct range { int min; int max; } range[] = {
{0,0},
{100,105},
{150,155},
{80,85},
{120,125},
};
if( var->y >= range[var->type].min && var->y <= range[var->type].max) {
do_something();
}
return 0;
}
正如評論中提到的,這種方法沒有注意到比較有時是針對 member x,有時是針對y。這可以通過以下方式解決:
int
main(int argc, char **argv) {
struct { int type; int x, y;} var[] = { 3, 81, 82 };
struct range { int *v; int min; int max; } range[] = {
{&var->x, 0,0},
{&var->x, 100,105},
{&var->x, 150,155},
{&var->y, 80,85},
{&var->y, 120,125},
};
int c = *(range[var->type].v);
if( c >= range[var->type].min && c <= range[var->type].max) {
do_something();
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/416416.html
標籤:
下一篇:列印n個數字的所有排列
