- 30天自制操作系統
- (日)川合秀實
- 1083字
- 2020-03-11 14:01:47
2 試用結構體(harib02b)
上面的方法倒也不能說不好,只是代碼的行數多了些,不太令人滿意。而如果采用之前的COLUMN-2里(第4章)的寫法:
xsize = *((short *) 0x0ff4);
程序長度是變短了,但這樣的寫法看起來就像是使用了什么特殊技巧。我們還是嘗試一下更普通的寫法吧。
本次的HariMain節選
struct BOOTINFO { char cyls, leds, vmode, reserve; short scrnx, scrny; char *vram; }; void HariMain(void) { char *vram; int xsize, ysize; struct BOOTINFO *binfo; init_palette(); binfo = (struct BOOTINFO *) 0x0ff0; xsize = (*binfo).scrnx; ysize = (*binfo).scrny; vram = (*binfo).vram;
我們寫成了上面這種形式。struct是新語句。這里第一次出現結構體,或許有人不太理解,如果不明白的話請一定看看后面的專欄。
最開始的struct命令只是把一串變量聲明集中起來,統一叫做“struct BOOTINFO”。最初是1字節的變量cyls,接著是1字節的變量leds,照此下去,最后是vram。這一串變量一共是12字節。有了這樣的聲明,以后“struct BOOTINFO”就可以作為一個新的變量類型,用于各種場合,可以像int、char那樣的變量類型一樣使用。
這里的*binfo就是這種類型的變量,為了表示其中的scrnx,使用了(*binfo).scrnx這種寫法。如果不加括號直接寫成*binfo.scrnx,雖然更容易懂,但編譯器會誤解成*(binfo.scrnx),出現錯誤。所以,括號雖然不太好看,但不能省略。
COLUMN-5 結構體的簡單說明
5.2節里的這種結構體的使用方法,比較特殊。我們先看一個普通的例子。
普通的結構體使用方法
void HariMain(void) { struct BOOTINFO abc; abc.scrnx = 320; abc.scrny = 200; abc.vram = 0xa0000; (以下略) }
先定義一個新結構體變量abc,然后再給這個結構體變量的各個元素賦值。結構體的好處是,可以像下面這樣將各種東西都一股腦兒地傳遞過來。
func(abc);
如果沒有結構體,就只能將各個參數一個一個地傳遞過來了。
func(scrnx, scrny, vram, ...);
所以很多時候會將有某種意義的數據都歸納到一個結構體里,這樣就方便多了。但如果歸納方法搞錯了,反而帶來更多麻煩。
為了讓程序能一看就懂,要這樣寫結構體的內部變量:在結構體變量名的后面加一個點(.),然后再寫內部變量名,這是規則。
■■■■■
下一步是使用指針。這是5.2節中的使用方法。聲明方法如下:
變量類型名 *指針變量名;(回想一下char *p; )
而這次的變量類型是struct BOOTINFO,變量名是binfo,所以寫成如下形式:
struct BOOTINFO *binfo;
這里的binfo表示指針變量。地址用4個字節來表示,所以binfo是4字節變量。
因為是指針變量,所以應該首先給指針賦值,否則就不知道要往哪里讀寫了。可以寫成下面這樣:
binfo = (struct BOOTINFO *)0x0ff0;
本來想寫“binfo =0x0ff0; ”的,但由于總出警告,很討厭,所以我們就進行了類型轉換。
設定了指針地址以后,這12個字節的結構體用起來就沒問題了。這樣我們可以不再直接使用內存地址,而是使用*binfo來表示這個內存地址上12字節的結構體。這與“char *p; ”中的*p表示p地址的1字節是同樣道理。
前面說過,想要表示結構體abc中的scrnx時,就用abc.scrnx。與此類似,這里用(*binfo).scrnx來表示。需要括號的理由在5.2節中已經寫了。因此語句寫作:
xsize = (*binfo).scrnx;
- Mastering vRealize Operations Manager(Second Edition)
- 樂學Windows操作系統
- PLC控制程序精編108例
- 每天5分鐘玩轉Kubernetes
- Learning Windows Server Containers
- FreeRTOS實時內核應用指南
- 循序漸進學Docker
- Alfresco 4 Enterprise Content Management Implementation
- Linux Shell編程從入門到精通(第2版)
- 嵌入式實時操作系統:RT-Thread設計與實現
- 蘋果OS X Mavericks 10.9應用大全
- Ceph分布式存儲實戰
- 從實踐中學習Kali Linux無線網絡滲透測試
- 計算機應用基礎(Windows 7+Office 2016)
- 分布式高可用架構之道