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/m.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