1

以下にいくつかのサンプルコードをリストしましたが、問題は、function_nameがstruct_nameからnumberの値にアクセスする方法があるかどうかです。

typedef struct struct_name {  
int number  
void (*func)();  
} * struct_name_ptr;  

void function_name() {  
//access number from struct  
}

main() {  
  struct_name_ptr newobject;  
  newobject->func=&function_name;  
  newobject->func(); //can it print the value of the number in the structure above?  
} 
4

5 に答える 5

4

ええと-いいえ。

構造体には確かに関数ポインタを含めることができます。ただし、呼び出す関数には構造体の知識がありません。関数の引数としてポインタを渡すか、構造体をグローバルにしない限り。

于 2012-05-27T08:06:16.790 に答える
1

いいえ、ピザは、それを配達したピザ配達人がどのように見えるかを知ることはありません。

通常の関数は、メモリ内の単なるアドレスです。この場合のように関数ポインタを使用して呼び出すことができます。いずれの場合も:関数はそれがどのように呼び出されたかを知りません。特に、ある構造体(に対応するメモリの一部)の一部である関数ポインタを使用して呼び出されたことはわかりません。

C ++のようなクラスで言語を使用する場合、メンバー関数には、クラスインスタンスへのポインターである隠し引数があります。これが、メンバー関数がデータについて知る方法です。

于 2012-05-27T09:00:24.740 に答える
1

プログラミングの知識が限られているので、これは不可能だと思います。構造体には関数ポインタが含まれていますが、割り当てられている関数のアドレスが異なり、引数として渡さない限り、構造体にアクセスすることはできないと思います。

于 2012-05-27T08:08:32.333 に答える
1

ええと、struct_name-> numberには値が必要であり、&function_nameと同じスコープ内にあるか、明示的に渡される必要があります。それを行う2つの方法:

/*これはグローバルな呼び出し構造体です*/

#include<stdio.h>

typedef struct struct_name {
    int number;
    void (*func)();
    } * struct_name_ptr;

struct struct_name newobject = { 0 }; 

void function_name() {
    printf("%d",struct_name);
}

void main() {

    struct struct_name_ptr newobject;

    newobject->func=&function_name;
    newobject->func();
}

/*そしてfunction_nameが変更されたもの*/

#include<stdio.h>

typedef struct struct_name {
    int number;
    void (*func)();
    } * struct_name_ptr;


void function_name(struct_name) {
    printf("%d",struct_name);
}

void main() {

    struct struct_name_ptr newobject;
    newobject.number = 0;

    newobject->func=&function_name;
    newobject->func(newobject);
}
于 2012-05-27T08:25:28.017 に答える
1

次のような例では、プレーンCで単純なOOPを「シミュレート」できます。

typedef struct {
int number;
void (*func)();
} class;

void function_name(class *this) {
  printf("%d",this->number);
}

#define CALL(c,f) c.f(&c)

int main() {
  class object={12345,function_name};

  CALL(object,func); // voilá
}
于 2012-05-27T11:51:00.457 に答える