[問題] struct alignment

作者: DJWS (...)   2019-12-11 07:58:43
// C99
struct SuperClass {
int num;
};
struct ClassA {
int num;
int a;
};
struct ClassB {
int num;
int b;
};
struct ClassA objA = {
.num = 0,
.a = 0
};
struct ClassB objB = {
.num = 0,
.b = 0
};
void func(void* obj)
{
struct SuperClass* object = obj;
object->num++;
}
int main(void) {
func(&objA);
func(&objB);
return 0;
}
我想做類似的事情,請問在C99要怎麼寫?
不能使用malloc
作者: sarafciel (Cattuz)   2019-12-11 09:05:00
呃 你貼了一段C99的code 然後問說在C99怎麼寫?XD
作者: SocketAM2 (AM2)   2019-12-11 09:15:00
用union可以規格上保證對,但上面這樣我只是找不到對應的文件而已,看起來也挑不出錯…
作者: DJWS (...)   2019-12-11 09:24:00
我不確定這樣寫對不對 只是憑感覺寫的...另外 當SuperClass內容很多 我想知道如何精簡ClassA和B
作者: Lipraxde (Lipraxde)   2019-12-11 10:22:00
macro 把裡面重複的包一包?
作者: DJWS (...)   2019-12-11 10:33:00
有更優雅的方法嗎?我剛發現 #pragma anon_unions 感覺不錯
作者: sarafciel (Cattuz)   2019-12-11 11:01:00
那你為啥不把SuperClass塞進CLassA跟B裡面?
作者: DJWS (...)   2019-12-11 11:10:00
多很多字 不好讀 C99不支援anonymous struct/union樓上你看起來還沒進入狀況 你實際寫一遍就會知道問題在哪了然後我也想知道如何精簡 initializer list
作者: a58524andy (a58524andy)   2019-12-11 13:06:00
作者: Bencrie   2019-12-11 13:10:00
我相信很多人都幹過 C 模擬 class,沒有搞不清楚這回事XD不然你去讀 gobject 的 source code 看有沒有比較好讀
作者: DJWS (...)   2019-12-11 13:13:00
我目前就是這樣寫的 但是需要 #pragma anon_unions我也相信很多人都幹過C模擬class 但我覺得s還沒進入狀況XD然後我是第一次用C模擬class 我之前都寫C++...
作者: Bencrie   2019-12-11 13:20:00
是喔,那我大概也沒進入狀況吧
作者: DJWS (...)   2019-12-11 13:20:00
然後 gobject 跟這件事的關聯在哪?我應該看哪一段code?
作者: sarafciel (Cattuz)   2019-12-11 21:34:00
我是不知道你想拿anonymous struct/union來做什麼啦https://ideone.com/6lm4Vh 我也不知道這樣寫有什麼大問題 你可以說說看 我是真的不懂就是XD
作者: DJWS (...)   2019-12-12 07:07:00
因為要多打.base啊 多很多字 不好讀這也就是C11要引進anonymous struct/union的原因29行名稱不一致 有的要寫.base 有的不用寫 維護困難如果再多做幾層composition 敲鍵盤就敲到崩潰了 XD
作者: Lipraxde (Lipraxde)   2019-12-12 07:27:00
那就再繼續用 macro 包啊
作者: DJWS (...)   2019-12-12 07:46:00
樓上可以示範一下怎麼用 marco 包嗎?macro
作者: sarafciel (Cattuz)   2019-12-12 16:00:00
https://ideone.com/1fg4hL 用函式也行 再包就好啦
作者: DJWS (...)   2019-12-12 18:14:00
你這樣沒有解決問題喔本來要判斷.base 現在變成要判斷Base_Print只存取num 要選Base_Print 只存取a 要選DerivedA_Print
作者: sarafciel (Cattuz)   2019-12-12 20:26:00
我本來就不認為那個是問題呀XDProgrammer本來就該意識自己在存取的是父類還是子類從這層意義上講 那個base留著才是可讀性高的寫法畢竟我可以透過看有沒有base去推斷要去父還是子找定義只是繼承鍊深的情況下重複寫base很煩我同意
作者: DJWS (...)   2019-12-12 20:27:00
無法承認自己的無知 這樣不好喔 您多保重
作者: sarafciel (Cattuz)   2019-12-12 20:27:00
所以用包函數的方式去把某個動作拆成分層的子問題然後把定錨父子這件事用型態來解決
作者: loveme00835 (髮箍)   2019-12-12 20:39:00
ADT 的概念那麼差還談 OO xD
作者: DJWS (...)   2019-12-12 20:47:00
樓上離題了吧
作者: loveme00835 (髮箍)   2019-12-12 21:04:00
因為你根本搞不清楚你要做什麼, 先把 data oriented搞成 object oriented, 所以型別命名就錯掉了. object oriented 著重在 service/behavior 所以真正多型的地方是用 function 來實作, 而不是資料. 如果是 dataoriented 你的宣告方式就錯了. 順便一提這條超簡單,我回家再貼關鍵字 「macro metaprogramming」
作者: DJWS (...)   2019-12-12 21:13:00
所以我猜...你應該知道我要做什麼? XD
作者: loveme00835 (髮箍)   2019-12-12 22:54:00
作者: Bencrie   2019-12-13 01:44:00
哇賽開始嗆人了 XDgobject system 就是 glib 實作的「C 模擬 class」不過它模擬的是那個 OO 行為,不是語法糖
作者: DJWS (...)   2019-12-13 07:15:00
包成macro原來需要補充這麼多東西 有更優雅的方法嗎?對 我就是在問語法糖啊 在C99底下 你得到他了...然後我的文章標題問的是 strcut aligment 我壓根沒想問OOstruct
作者: loveme00835 (髮箍)   2019-12-13 08:50:00
但是你的型別就是 OO 的命名風格, 但作的是 DO更優雅? 你何不把共用的 variable 增加到 1k 個看看?
作者: DJWS (...)   2019-12-13 08:56:00
因為這個案子不會到1k個(記憶體不夠用) 目前就20個而已但是derived class目前就有10個 以後還會越來越多我修正一下 目前有10個derived class 而且將陸續增加程式碼長的很驚人 很難維護 所以想問更精簡的寫法
作者: loveme00835 (髮箍)   2019-12-13 09:01:00
如果是一般作法就會是用很簡單的 nested struct 去實
作者: DJWS (...)   2019-12-13 09:02:00
然後OO命名風格...這就當作是我的錯誤吧 我應該怎麼命名呢?
作者: loveme00835 (髮箍)   2019-12-13 09:02:00
作, 各自去 maintain 自己的 offset, 但是都可以註冊同樣 prototype 的 accesor function 去操作, 所以根本不需要重複的程式碼, 好不好維護完全是設計問題,
作者: Bencrie   2019-12-13 09:05:00
那你就寫 code generator 吧。維護的時候用你愛的語法
作者: loveme00835 (髮箍)   2019-12-13 09:05:00
你硬要用 designated initializer 來初始化物件那這樣勢必要有展開的動作
作者: Bencrie   2019-12-13 09:06:00
要編譯的時候轉成你覺得很醜的 C99 實作
作者: loveme00835 (髮箍)   2019-12-13 09:08:00
所以問題就是, 你不知道你卡的點在哪, 但是別人提的
作者: Bencrie   2019-12-13 09:08:00
是說幹嘛不直接用 C++? toolchain 不給用嗎
作者: loveme00835 (髮箍)   2019-12-13 09:09:00
方案能解只是需要其他 work, 你不知道也不想作, 因為你想像的 C99 跟別人的很不一樣
作者: DJWS (...)   2019-12-13 09:14:00
兩位交互詰問我很難回答 XD 我先回答Bencrie板友吧我的部分是開發演算法 原始程式碼是javascript 以便可視化並且修正演算法 然後再移植到mcu上面 但是雇主提供的開發環境只有C99沒有C++再來是loveme前板主 num a b 這些都是演算法參數將來會從外部輸入到mcu 但是還沒跟雇主討論這一塊要怎麼做於是我暫先弄個initializer 以便測試演算法是否能正常運作好了言歸正傳 請問DO風格之下 我應該怎麼命名才對呢?
作者: descent (「雄辯是銀,沉默是金」)   2019-12-13 13:17:00
#1QlX0DOR 該篇的 cfront 可以解決你的問題嗎?
作者: DJWS (...)   2019-12-13 13:46:00
我第一次聽到 cfront 我下次遇到雇主跟他聊一下剛剛谷歌一陣 cfront是上古時代的東西吧 有點不太現實
作者: descent (「雄辯是銀,沉默是金」)   2019-12-13 14:23:00
想說你只是要處理 class 繼承的語法, 所以才提 cfront
作者: ofd168 (大色狼來襲)   2019-12-15 15:47:00
大家脾氣真好,只有我覺得D回文很嗆嗎
作者: reemir   2019-12-15 21:04:00
:)
作者: DJWS (...)   2019-12-15 21:31:00
如果各位都覺得我口氣不好 那我道歉 對不起各位
作者: eye5002003 (下一夜)   2019-12-15 22:25:00
我也有上來討論過類似的話題,試圖讓C語言可以別寫的又臭又長,最後都是宣告放棄,C就是要寫的傷眼又費力進入C++11的世界之後又更加無法忍受C了
作者: KevinR (Kevin)   2019-12-17 10:20:00
...
作者: xvid (DivX)   2019-12-18 08:35:00
客氣客氣
作者: xkhsky (30CM)   2019-12-19 22:31:00
笑死

Links booklink

Contact Us: admin [ a t ] ucptt.com