使用 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'
。所以我不认为这是我可以使用的选项。我几乎认为在我的情况下这可能是不可能的
您是否包括<list>
和<map>
?【参考方案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 循环创建数组结构的主要内容,如果未能解决你的问题,请参考以下文章