【问题标题】:How to decalre array of enums?如何声明枚举数组?
【发布时间】:2021-10-28 10:06:12
【问题描述】:

我有以下枚举:

enum {
       ClientRx,
       ClientTx,

       Server1Rx,
       Server1Tx,
       Server1RxDropped,
       Server1TxDropped,

       Server2Rx,
       Server2Tx,
       Server2RxDropped,
       Server2TxDropped,

       Server3Rx,
       Server3Tx,
       Server3RxDropped,
       Server3TxDropped,

       Server4Rx,
       Server4Tx,
       Server4RxDropped,
       Server4TxDropped,

       MaxVal
};

有没有办法创建适合原始枚举的服务器枚举数组以使此代码更通用? (例如,如果我想将服务器计数器的数量扩展到 100...)

某种形式的东西:

typedef enum {
           ServerRx,
           ServerTx,
           ServerRxDropped,
           ServerTxDropped
}eServerCounters;

eServerCounters ServerCountersArray[4];
enum {
       ClientRx,
       ClientTx,

       ServerCountersArray,

       MaxVal
};

获取枚举值:

ServerCountersArray[2].ServerRx

【问题讨论】:

  • 我认为您对enum 是什么感到困惑。
  • 这些只是索引......真正的计数器存储在一个数组中。
  • 不管怎样,这就是所谓的“XY问题”。您遇到问题并提出了您认为可以解决问题的解决方案。然而,这个解决方案是不正确的——与其问如何解决解决方案,不如问如何解决代码实际应该解决的原始问题。
  • 您需要重新考虑如何存储和访问数据。假设我想以编程方式迭代所有服务器 Rx 计数器,我该怎么做?
  • 如果您可以控制计数器的存储方式,请修复它。如果你不这样做,那么至少围绕它创建一个对用户更友好的 API。比如,编写一个接受队列号参数的函数,或者字节移位并用子计数器屏蔽队列号。

标签: c enums


【解决方案1】:

在 C 中,枚举是一种在全局命名空间中创建符号整数常量的方法。

根据你的定义

eServerCounters ServerCountersArray[4];

您创建了一个包含四个元素的数组。 每个元素可以有来自eServerCounters枚举的任何值。

例如你可以检查第三个元素是否等于ServerRxlike

if (ServerCountersArray[2] == ServerRx) ...

也许你需要在不同的值之间swtich

switch (ServerCountersArray[i])
{
case ServerRx:
    // Do something here...
    break;
case ServerTx:
    // Do something here...
    break;

case ServerRxDropped:
    // Do something here...
    break;

case ServerTxDropped:
    // Do something here...
    break;
}

多思考一下 Cheatah 的代码和 cmets,您可能需要的是一个结构数组:

struct counter
{
    unsigned rx;
    unsigned tx;
    unsigned rx_dropped;
    unsigned tx_dropped;
};

struct counter counters[4];

现在您可以从数组中访问特定“通道”的计数器,例如

for (unsigned ch = 0; ch < 4; ++ch)
{
    printf("Channel %u:\n", ch + 1);
    printf("    Rx: %u (dropped %u)\n", counters[ch].rx, counters[ch].rx_dropped);
    printf("    Tx: %u (dropped %u)\n", counters[ch].tx, counters[ch].tx_dropped);
}

【讨论】:

    【解决方案2】:

    你需要生成大的 enun 定义

    int main(int argc, char **argv)
    {
        int nservers =  -1;
    
        printf("typedef enum {\n"
               "\t\tClientRx,\n"
               "\t\tClientTx,\n\n");
        if(argc > 1 && sscanf(argv[1], "%d", &nservers) == 1 && nservers != -1)
        {
            for(int server = 1; server <= nservers; server++)
            {
                printf("\t\tServer%dRx,\n" , server);
                printf("\t\tServer%dTx,\n" , server);
                printf("\t\tServer%dRDropped,\n" , server);
                printf("\t\tServer%dTxDropped,\n\n" , server);
            }
        }
    
        printf("} serverEnumType;\n");
    }
    

    https://godbolt.org/z/sTGezaer7

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多