1

サイズの異なる構造体の静的配列がいくつかあります。これらの配列にデータを入力する一般化された関数を作成したいと思います。特定の配列にデータを入力して、この関数のパラメーターにします。それを行うための最良の方法は何ですか?(静的配列を回避することを除けば、残念ながらそれらは仕方がありません)。

(の関連ビット)コード:

typedef struct{
    char ip[IP_LEN+1];
    char netmask[IP_LEN+1];
} ipAndNetmaskStruct; 
typedef struct{
    char port[PORT_LEN+1];
} portStruct;


static ipAndNetmaskStruct source[1024];
static ipAndNetmaskStruct dest[1024];
static portStruct source_port[1024];
static portStruct dest_port[1024];

//just an example of wha
void doSomthingWithStruct(the array and a specific field in each stcut in it){
    for(int i=0;i<5;i++){
        THEARRAY[i].SPECIFICFIELD="Somthing";
        // as in source[i].ip="somthing";
    }
}
4

1 に答える 1

1

このような意味ですか?

void doSomethingWithStruct(void* structptr,int ssize,int cnt, int offset,void* val,int vsize)
{
   int i;
   for(i=0;i<cnt;i++)
   {
      //perhaps add bool as a function parameter to check if mem should be allocated ?
      memcpy( ((uint8_t*)structptr)+i*ssize+offset, val,vsize);
   }
}

//usage
typedef struct{
    char ip[IP_LEN+1];
    char netmask[IP_LEN+1];
} ipAndNetmaskStruct; 
static ipAndNetmaskStruct source[1024];
char data[IP_LEN+1];

doSomethingWithStruct(source,sizeof(ipAndNetmaskStruct),1024,/*if it was netmask it would have been sizeof(char)*(IP_LEN+1)*/0,data,IP_LEN+1);

編集:メンバーのオフセットを取得するために使用できますoffsetof-「stddef.h」で定義されており、その精神で使用することもできます#define sizeof_member(s,m) sizeof(((s *)0)->m)

例:

#define doSomethingWithStruct(srcptr,type,member,val) doSomethingWithStruct(srcptr,sizeof(type),sizeof(srcptr)/sizeof(type),offsetof(type,member),val,sizeof_member(type,member))
于 2012-12-04T10:13:27.047 に答える