2

Not entirely sure my question title describes what I want to do, but couldn't think how better to word it!! I'm using C, and perhaps the pseudocode below will describe what I'm trying to do:

typedef struct obj
{
    char *str1;
    char *str2;
    char *str3;
} object;

/* global variable */
object *glob;

void black_box_function(local, member) ????
{
    /* Do something with glob->member and local->member */
}

void main()
{
    object *ob1, *ob2;

    /* Initialise glob, ob1 and ob2 somewhere */

    black_box_function(ob1, str1);
    black_box_function(ob2, str3);

}

Hopefully, you can see what I'm trying to do. I have a "black-box" function that will do something with a particular member, and I need to be able to tell the black-box function which member to use.

I don't want to just pass the member directly to the function, like in this code, as that won't fit into the rest of my code easily.

black_box_function(ob1->member, glob->member)
4

3 に答える 3

2

おそらく、構造体のアクセサー関数を作成し、メンバーを直接渡す代わりに、それらのアクセサーを関数ポインター引数として渡すことができます

typedef struct
{
    int a;
    int b;
} foo;

typedef int* (*accessor)(foo*);

int* get_a(foo* f) { return &f->a; }
int* get_b(foo* f) { return &f->b; }

void black_box_function(foo* object, accessor fn)
{
    int* p = fn(object);
}

int main(void)
{
    foo bar1;
    foo bar2;

    black_box_function(&bar1, get_a);
    black_box_function(&bar2, get_b);

    return 0;
}
于 2012-04-06T11:15:42.720 に答える
2

次の魔法を実行できます (GCC 拡張を使用):

#define black_box(local, member)  black_box_function((local), __builtin_offsetof(object, member))

void black_box_function(object *local, int offset)
{
    char *lmember = ((void *)local) + offset;
    char *gmember = ((void *)global) + offset;
    /* do stuff */
}

ただし、メンバーのタイプを事前に知っておく必要があります。C は動的に型付けされる言語ではないため、実行時のイントロスペクションがまったくないことに注意してください。

編集: 次offsetof()のように、GCC 拡張機能に頼らずに機能を実装できます。

#define offsetof(type, field) ((int) (unsigned long) &((type *) 0)->field)
于 2012-04-06T11:22:51.487 に答える
1

すべてが char* であるため、次のように構造体を再定義できます。

typedef struct obj
{
    char **str; // Array of c
} object;

str次に、操作したいメインからのインデックスを送信できます。

black_box_function(obj1, index)

したがって、ブラックボックスのようobj1->str[i]にできます。

ところで、black-box_functionコンパイルされません。

補足:ブラックボックス関数とコンパイル可能なコードに関する情報/コードをもう少し詳しく説明すると、何をしようとしているのかをよりよく理解できます。

于 2012-04-06T11:19:04.500 に答える