C_and_CPP 板


LINE

开发平台(Platform): (Ex: Win10, Linux, ...) WIN10 / LINUX 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出) VC2015 / gcc 问题(Question): 想要用C++来跑模拟 目前是将参数的部分定义在一个class/structure类似header的概念 其中部分参数希望拿来当静态配置变数的array长度 问题在於,GCC虽然支援静态配置长度是给变数,然而VC比较严谨 还不允许这种写法,一定要是定值 目前做法就是用define的方式 使用class/structure 来管理 系统变数的原因 1. 让变数找的到哪里宣告的(当IDE不够强的时候) (补充,某些因素,在linux环境下IDE不怎麽好用) 2. 可以加上const保证这些变数都不会被其他function修改。 目前是所有参数都是public 但是现在希望让变数整理再一起,有一个统一的规范 现在是将起始值放在建构子里 问题是,希望让VC能直接吃class的变数的长度又不使用动态配置 因为静态配置的优点是可以直接用sizeof(class)计算长度, 然後用指令直接写入档案之类的存起来,而不用对里面所有变数个别处理 也是希望类似 class A{ const int abc; A(){ abc = 10; } } 然後让整个 class A都无法更动。 网路上看到的方法貌似是宣告同时给值 class A{ .abc = 10}; 然而如果变数超多就会看起来很长 原本用structure的目的是为了让每个变数能够知道原本放在哪 同时利用传入变数时加上const使之只能读不能改 想到另一种解法是宣告在namesapce里面 然後所有的变数都加上const 用structure的优点是,如果要两个模拟环境,可以宣告两个,不过目前没有这样需求 用namespace是 可以加上const外,也可以让变数找的到宣告的地方 (补充说明,目前的环境没办法利用tool帮忙找使用的变数原本宣告在哪) 为了一致性,structure还能有别种作法吗? 因为使用namespace,如果要将变数储存就必须对每个变数个别处理, 如果是使用structure要储存,因为sizeof()的关系,可以一行就存起来 -- 标题 [笑话] 唐三藏的愿望 唐三藏:八戒,你跑两步给为师看看。 八 戒:师父,你为啥突然想看徒儿跑步? 唐三藏:哎啊!惭愧,为师自幼在寺中长大,既没吃过猪肉,也没看过猪跑步。
1F:嘘 changhua5566:我想你也没被猪嘘过01/16 21:40
--



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.250.205.229
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1492685077.A.6B4.html ※ 编辑: ofd168 (60.250.205.229), 04/20/2017 18:49:37
2F:→ pttworld: 写在参数式 04/20 20:03
3F:嘘 Sidney0503: VLA是C99接受的语法 C++一直以来都不接受 04/20 22:44
4F:→ Sidney0503: g++是送你extension 反而说照规范的东西烂? 04/20 22:44
5F:→ Sidney0503: 一样想要一行可以有vector::size(); 04/20 22:45
6F:嘘 Sidney0503: 你怎麽不抱怨为什麽c语言没有move和lambda? 04/20 22:47
不知道为何s大这麽生气 我只觉得这条路如果走不通就只能想别条路,所以想询问有没有其他解法 如果在一个structure中定义许多静态配置的变数, 若要将structure写入档案中储存,可以使用fwrite简单的一行储存 而不用对structure中各自变数去做个别储存,方便很多 目前是遇到,如果在structure中是宣告指标/vector再去配置空间 好像没办法使用fwrite与sizeof简单存入档案中 必须要个别处理 所以才想问有没有可以简单储存的前提下,让我的array长度的变数 能够放在其他structure呢? 比如 以下这种希望的效果,但是语法上不合 struct A_{ const int array_size = 10; } A; struct B{ int array[A.array_size]; }; 目前看起来也许这样比较可行 namespace A{ const int array_size = 10; }; struct B{ int array[A::array_size]; }; 让人一样知道array_size宣告在哪里 可是如果我想把A里面所有变数储存,就必须每个变数都各别处里 如果未来增加变数,写入档案的function也必须同步修改 不知道有没有比较好的方法呢 ※ 编辑: ofd168 (123.195.57.89), 04/21/2017 00:48:54 修改一下内文
7F:推 Sidney0503: fwrite是C语法 你坚持要用就是请你换c compiler而不 04/21 01:04
8F:→ Sidney0503: 是c++ compiler 04/21 01:04
9F:→ Sidney0503: c++写入档案推荐的方法有ofstream 04/21 01:07
10F:→ Sidney0503: 连size都不需要 04/21 01:07
好,我研究一下
11F:→ pnpncat: 以 c++ 的观点来看,如果你需要的是一个静态的参数 04/21 01:38
12F:→ pnpncat: 为什麽不用 template 参数呢? 04/21 01:39
用template好像可以 如果需要的变数很多的时候,宣告的时候貌似会很大坨@@?
13F:→ fatrabitree: 你应该连参数都用读档的,不然改参数就重新编译一次 04/21 07:13
14F:→ fatrabitree: ? 04/21 07:13
!! 这好像也是可行的方案 ※ 编辑: ofd168 (60.250.205.229), 04/21/2017 10:30:05
15F:推 ronin728: CLion 表示 : 04/21 10:49
16F:→ pnpncat: 把静态参数和动态参数分开 静态才放template参数 04/21 12:25
17F:→ pnpncat: 动态的用class成员和set函数去做 如果template参数还是 04/21 12:25
18F:→ pnpncat: 很多 就用另其他template把参数分组打包起来然後typedef 04/21 12:26
19F:→ pnpncat: 这样应该就没问题了 04/21 12:27
20F:→ pnpncat: 另一个方法是先写 class Parameters 来存参数 04/21 12:29
21F:→ pnpncat: 然後再用 template<Parameters p> class Setting; 来将 04/21 12:30
22F:→ pnpncat: 它静态化 04/21 12:30
23F:→ pnpncat: 推文好麻烦 我回信给你好了 04/21 12:33
感谢p大直接寄信教学 目前CODE写起来如下 http://codepad.org/yVhrAu4Q class Parameters { public: const static int size1 = 10; const static int size2 = 20; }; template <typename Parameters> class testClass { int Arr1[Parameters::size1]; int Arr2[Parameters::size2]; }; int main() { testClass<Parameters> testObj; printf("testClass size = %d\n", sizeof(testObj)); system("PAUSE"); return 0; } VC2015是可以跑得 不过 1. 用codepad说有 Disallowed system call: SYS_fork 这样是代表有风险吗? 2. 另外觉得template <typename Parameters> 这段有点风险 因为从这行并没有限定要是 Parameters 这个class 看stackoverflow的这篇 Passing a structure as a template-parameter - How can I fix this code? https://goo.gl/L7OWWE 他是使用 template <Parameters const& p> 这种做法 不过当我尝试使用时候,就会跑出一堆error http://codepad.org/FOcqxCch 3. 虽然这个parameter可存档,而且一样让使用的人知道这个变数放哪 比如Parameter::size1, 虽然这部分就是2的问题,觉得有点怪怪的 发现最後一的问题,好像不能读 XDDDDD 原本做法是 把parameter object存入档案,要读的时候就直接读档并直接盖掉 parameter的object, 在debug mode就可以看到各个变数读出来的值。 改成这种作法,就跟使用namespace好像差不多了,不过优点是因为可以存 想说要求Parameter里面所有变数都是double,读的时候放在一个double array 此array的长度就可以利用sizeof(parameter)来得到 缺点是无法很容易地知道 这个double array某一个elemet对应的Parameter是 哪个变数,不过总归是个解法 ※ 编辑: ofd168 (60.250.205.229), 04/21/2017 16:10:16
24F:推 LPH66: codepad 那个单纯只是不给你用 system 而已 04/21 17:04
25F:→ pnpncat: 想要把参数存成可读档的话就用个小技巧存一份在物件中: 04/21 20:02
26F:→ pnpncat: struct Parameters { 04/21 20:02
27F:→ pnpncat: enum{SIZE_1 = 10}; 04/21 20:02
28F:→ pnpncat: enum{SIZE_2 = 20}; 04/21 20:03
29F:→ pnpncat: int size1; 04/21 20:03
30F:→ pnpncat: int size2; 04/21 20:03
31F:→ pnpncat: Parameters() : size1(SIZE_1), size2(SIZE_2) {} 04/21 20:03
32F:→ pnpncat: }; 04/21 20:03
33F:→ pnpncat: 让编译器读SIZE_1, SIZE_2 你读size1, size2 04/21 20:05
34F:→ pnpncat: http://codepad.org/cpUAxiQg 04/21 20:10
35F:→ pnpncat: 刚刚在自己的机器上跑过没问题 04/21 20:10
36F:→ hunandy14: http://ideone.com/QC4nfM 04/27 14:56







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP