【问题标题】:Create array structure using a for loop使用 for 循环创建数组结构
【发布时间】:2016-06-23 03:42:20
【问题描述】:

我不完全确定该问题的名称,但我正在使用 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 等开始,其他一切都相同。

所以我的问题是,我怎样才能将上面的代码放入循环中以将数字增加到指定的数字。

【问题讨论】:

  • [将字符串转换为变量名] (stackoverflow.com/questions/7143120/…) 请参考此链接。在 c++ 中不可能使用字符串的值作为变量名,这就是你试图用不同的数字制作各种字符串,然后在结构中使用这些字符串作为变量名
  • 可能有一些很好的理由进行冗余。好吧。将该表包装在一个类中,因为类构造函数擅长初始化事物。
  • 你可以使用地图。
  • 您要解决什么问题?我一个也看不见。除了您的过早优化方法的问题。您是否发现了性能问题,并将其追溯到您在问题中提供的代码段?我很确定没有。
  • @IInspectable 我希望解决的问题是从上面获取所有数字 9,并使其能够在某种循环中递增。这样我就可以避免让它根据程序的需要重复多次。

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


【解决方案1】:

您似乎正在尝试为您的数组动态创建令牌。正如其他人在 cmets 中提到的那样,使用类来初始化数组或使用其他数据结构(例如 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

【讨论】:

  • 感谢您的回答!这种对我有用,但我有点不确定如何让它变得动态。我不明白如何使prefix1suffix 在循环中递增,例如prefix(i)suffix,其中i 从0 增加到9。要么就是这样,要么我错过了一些非常重要的东西......
  • 您并没有错过太多,因为 i 的值直到运行时才确定,正如 iinspectable 所提到的。宏将始终扩展为prefixisuffix。事实证明这对你没有多大帮助。也许尝试使用std::map
  • 这是一个工作项目,当我使用std::map 时,我只会收到消息'map': is not a member of 'std'。所以我不认为这是我可以使用的选项。我几乎认为在我的情况下这可能是不可能的
  • 您是否包括&lt;list&gt;&lt;map&gt;
【解决方案2】:

我能够找到部分解决方案。它并不能完全满足我 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);

}

【讨论】:

    猜你喜欢
    • 2021-09-04
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多