使用for循环创建数组结构

时间:2016-06-23 03:42:20

标签: c++ visual-studio-2015 mfc

我不确定该如何命名这个问题,但我正在使用MFC c ++在Visual Studio 2015中处理gui。

我有一个看起来像这样的结构

static dataCollect::StatSrcListL_t s_struct9[] =
{
    //  Name                 Addr                                   Type                        Mask  Stride  User    
    { "Rx PMA Reset Done",   statsRW::statMode9egrDeltDat,  dataCollect::Irg,    statMode9egrDelt_rxPmaRstDoneMask, 0x000 },
    { "Rx Reset Done",       statsRW::statMode9egrDeltDat,  dataCollect::Irg,    statMode9egrDelt_rxResetDoneMask,  0x0000 },
    { "Rx Buffer Underflow", statsRW::statMode9egrDeltDat,  dataCollect::IrgErr, statMode9egrDelt_rxBufUflwMask,    0x0000 },
    { "Rx Buffer AE",        statsRW::statMode9egrDeltDat,  dataCollect::IrgErr, statMode9egrDelt_rxBufAeMask,      0x0000 },
    { "Rx Buffer AF",        statsRW::statMode9egrDeltDat,  dataCollect::IrgErr, statMode9egrDelt_rxBufAfMask,      0x0000 },
    { "Rx Buffer Overflow",  statsRW::statMode9egrDeltDat,  dataCollect::IrgErr, statMode9egrDelt_rxBufOflwMask,    0x0000 },
    { "PRBS Err Det",        statsRW::statMode9egrDeltDat,  dataCollect::IrgErr, statMode9egrDelt_prbsErrMask,      0x0000 },
    { "PRBS Lck Det",        statsRW::statMode9egrDeltDat,  dataCollect::Irg,    statMode9egrDelt_prbsLckMask,      0x0000 },
    { "Tx Reset Done",       statsRW::statMode9ingDeltDat,  dataCollect::Irg,    statMode9ingDelt_txRstDoneMask,    0x000 },
    { "Tx PMA Reset Done",   statsRW::statMode9ingDeltDat,  dataCollect::Irg,    statMode9ingDelt_txPmaRstDoneMask, 0x000 },
    { "Tx Buf OFlow/Uflow",  statsRW::statMode9ingDeltDat,  dataCollect::IrgErr, statMode9ingDelt_txBufOfUfMask,    0x0000 },
    { "Pwr Good",            statsRW::statMode9ingDeltDat,  dataCollect::Irg,    statMode9ingDelt_pwrGoodMask,      0x000 },
    { "QPLL Lock Status",    statsRW::statMode9ingDeltDat,  dataCollect::Irg, 1 << statMode9ingDelt_qpllLock,       0x000 }
};

我一直在尝试使用不同的方法来statMode9egrDeltDat动态分配数字。根据所使用的项目,它可以在大约10到50个之间进行,并且在代码中单独写入50次似乎有点浪费时间和空间。一切都是一样的,除了数字9(在这个例子中)将从0,1,2,3开始,依此类推。

所以我的问题是,如何将上述代码放入循环中以将数字增加到指定的数字。

2 个答案:

答案 0 :(得分:0)

看起来您正在尝试动态地为您的阵列创建令牌。正如其他人在评论中提到的那样,使用类初始化数组或使用其他数据结构(如std :: map)可能是更好的设计。

但是这可能会对您有所帮助:看看## (token-pasting) operator。这是一个用于将参数转换为标记的预处理器运算符。以下是它的用法示例。

示例程序

#include <iostream>

#define makevar(n) prefix ## n ## suffix

int main()
{
  auto makevar(1) = 1;

  std::cout << prefix1suffix << std::endl;
  return 0;
}

输出

  

1

答案 1 :(得分:0)

我能够找出部分解决方案。它不是我需要的100%,但它足以继续现在的工作。

static dataCollect::StatSrcListL_t s_struct[10][(sizeof(s_struct9) / sizeof(dataCollect::StatSrcListLedL_t))];

for (int i = 0; i < NumTables; i++) {

    (dataCollect::StatSrcListL_t*) memcpy(&s_struct[i], s_struct9, sizeof(s_struct9));

    for (int j = 0; j < (sizeof(s_struct9) / sizeof(dataCollect::StatSrcListL_t)); j++)
    {
        s_struct[i][j].address = s_struct[i][j].address + offset;
    }
    offset   += (statsRW::statMode9egrDeltDat - statsRW::statMode8egrDeltDat);

}