作者ofd168 ()
看板C_and_CPP
標題[問題] 想要將參數定義在class同時當array長度
時間Thu Apr 20 18:44:31 2017
開發平台(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
35F:→ pnpncat: 剛剛在自己的機器上跑過沒問題 04/21 20:10