2014-01-21 27 views
1
static const unsigned char pkt1[89] = { 
0x00, 0x00, 0x5e, 0x00, 0x01, 0x12, 0x00, 0x18, /* ..^..... */ 
0x82, 0x5e, 0x5a, 0xf6, 0x08, 0x00, 0x45, 0xb8, /* .^Z...E. */ 
0x00, 0x4b, 0x9d, 0x0d, 0x00, 0x00, 0x3f, 0x11, /* .K....?. */           
}; 

/* Frame (89 bytes) */ 
static const unsigned char pkt2[89] = { 
0x00, 0x00, 0x5e, 0x00, 0x01, 0x12, 0x00, 0x18, /* ..^..... */ 
0x82, 0x5e, 0x5a, 0xf6, 0x08, 0x00, 0x45, 0xb8, /* .^Z...E. */ 
0x00, 0x4b, 0x9d, 0x25, 0x00, 0x00, 0x3f, 0x11, /* .K.%..?. */ 
} 

.... 
... 

till pkt[100]; 


int main() 
{ 

char buff[10]="pkt"; 
for(i=0;i<100;i++) 
{ 
itoa(1,buff+3,10); 
printf("%s",buff); 
} 

} 

从上面的代码中,我可以看到连接的名称为pkt1/pkt2 ... until pkt100。但我不知道如何访问pkt1的元素。 任何建议如何做到这一点是值得欢迎的。我可以做这个运行时间吗?创建数组名称运行时间并访问其元素

回答

1

不是没有自己实现它,没有。 C不保留在运行时的变量名,所以如果你想使用的名称映射到你要自己实现一个数组:

const unsigned char * get_pkt(const char *name) 
{ 
    if(strcmp(name, "pkt1") == 0) 
    return pkt1; 
    if(strcmp(name, "pkt2") == 0) 
    return pkt2; 
    return NULL; 
} 

UPDATE:如果数量你需要匹配的东西很大,像上面这样的代码变得单调乏味(并且容易出错),并且会影响性​​能。在这些情况下,正确的解决方案是将对象放入一些键值数据结构中,如散列表。请注意,C没有内置哈希表数据类型,因此您需要自行处理。有许多实现可用,但:glib's GHashTable is one

如果你想留在C标准库中,我会把数据放在一个数组中,对它进行排序(使用qsort()),然后用bsearch()进行二进制搜索。对于〜1000个密钥,应该不超过〜10个字符串比较。

即使有了这些技巧,当然,您也不会脱离初始化数据结构的需要。

static struct { 
    const char *name; 
    const unsigned char packet[89]; 
} packets[] = { 
    { "pkt1", { 0x00, 0x00, 0x5e, 0x00, 0x01, /* ... more */ } }, 
}; 

这仅仅是重新组织你已经拥有的源文本,并增加了一些标点符号:随着阵列,你定义你的包,你可能能够做数组初始化在同一议案。如果你注意按照正确的顺序给出这些内容,你也不需要在运行时进行排序!

+0

如果我有1000个数据包..那么我必须写1000如果其他语句..我不认为是正确的编程方式 –

+0

@Learner真的,我没有注意到你的问题的一部分。我更新了我的答案。 – unwind

+0

你能举个例子吗? @unwind:所以在散列表中,我需要编写一千行来映射它。是吗 ? –