使用 for 循环创建数组结构

Posted

技术标签:

【中文标题】使用 for 循环创建数组结构【英文标题】:Create array structure using a for loop 【发布时间】: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 等开始,其他一切都相同。

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

【问题讨论】:

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


【讨论】:

以上是关于使用 for 循环创建数组结构的主要内容,如果未能解决你的问题,请参考以下文章

Java循环结构

for循环详解

循环结构进阶

循环结构进阶

循环结构进阶

Java 循环结构 - for, while 及 do...while