2

this might be a newbie question and I see something similar asked before, but I hope someone will help me. Below is a small (hopefully) illustrative code. I want to have two functions share some code. They will both have a test, which boils down to: if (int operator int). It should be possible to describe the operator with a pointer, and then use what the pointer points to in the test, shouldnt it?

func1(){
  func3(1)
}

func2(){
  func3(2);
}

func3(int type){
  char *op;
  int value1;
  int value2;
  switch (type){
  case 1:
        op = ">";
        value1 = 1;
        value2 = 3;
        break;
  case 2: 
       op = "=";
       value1 = 2;
       value2 = 5;
       break; 
 }
 if (value1 *op value2){
     do something
 }
}

I find that > is converted to 62 (decimal) in a text to binary calculator, but this prints out 60 - why?

char *p = "<";
printf("%d\n", *p);
4

4 に答える 4

1

charあなたは実際に関数ポインタを操作したいと思っています... char値は演算子のトークンと同等であるため、単にaを使用して関数になることはできません。あなたが試みているようなトークンの置換は、プリプロセッサでのみ行うことができます。

于 2013-03-10T19:47:45.393 に答える
1

演算子をポインターで記述し、ポインターが指すものをテストで使用できるようにする必要がありますね。

演算子はデータ型とはまったく異なるため、ポインターを使用して演算子を参照/逆参照することはできません。

于 2013-03-10T19:52:22.713 に答える
1

あなたが書いたとおりに正確に行うことはできません。しかし、関数ポインタで実行できるはずです。これを行う方法の 1 つを次に示します。

func1(){
  func3(1)
}

func2(){
  func3(2);
}
typedef (int *myOperator)(int, int);
int operatorGt(int a, int b) {
  return a > b;
}

int operatorEq(int a, int b) {
  return a = b;
}


func3(int type){
  myOperator op = NULL;
  int value1;
  int value2;
  switch (type){
  case 1:
        op = &operatorGt;
        value1 = 1;
        value2 = 3;
        break;
  case 2: 
       op = &operatorEq;
       value1 = 2;
       value2 = 5;
       break; 
 }
 if (NULL != op && op(value1, value2)){
     do something
 }
}

これがコンパイルまたは機能することを保証するものではありませんが、この方法の方が機能する可能性が高くなります。私はそれをコンパイルしていません。そのため、修正が必要なコンパイラ エラーや警告がいくつかある可能性があります。あまりにも簡単にしたくないでしょう:D

于 2013-03-10T19:52:00.190 に答える
1

他の人が言ったように、C 演算子のアドレスを直接取得することはできませんが、演算子を使用するためだけに機能する関数のアドレスを取得することはできます。演算子の数は限られているため、次のように演算子をポインターに変換できます。

#define DECLARE_OPFN(name, operator) bool op_##name(int op1, int op2) { \
  return op1 operator op2; \
}

DECLARE_OPFN(lt, <)
DECLARE_OPFN(le, <=)
DECLARE_OPFN(gt, >)
DECLARE_OPFN(ge, >=)
DECLARE_OPFN(eq, ==)
DECLARE_OPFN(ne, !=)

typedef bool (*opfn_type)(int, int);

opfn_type get_opfn(char *op)
{
  static const struct {
    const char *str;
    bool (*op)(int, int);
  } all_ops[]  = { {"<", op_lt}, {"<=", op_le}, {">", op_gt}, {">=", op_ge},
                   {"==", op_eq}, {"!=", op_ne} };
  int i;
  for (i = 0; all_ops[i].str; i++)
    if (!strcmp(op, all_ops[i].str))
      return all_ops[i].op;
  return NULL;
}

// ...
get_opfn(my_op_str)(val1, val2);
于 2013-03-10T21:01:47.037 に答える