官术网_书友最值得收藏!

  • 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節第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;
主站蜘蛛池模板: 屯门区| 锦州市| 古田县| 古田县| 堆龙德庆县| 洪湖市| 比如县| 博野县| 兴山县| 揭东县| 乐亭县| 庆安县| 邵东县| 平凉市| 泽普县| 屏边| 芷江| 沙雅县| 翼城县| 循化| 张家港市| 长沙市| 仁化县| 古丈县| 枣庄市| 马边| 肇庆市| 亳州市| 栾城县| 湟中县| 东莞市| 临沭县| 长治市| 巧家县| 太湖县| 阜阳市| 楚雄市| 辽源市| 内江市| 石楼县| 汤阴县|