<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 第八章 ## 內存 作者的話:本章內容涉及內存處理,討論各種內存區,并介紹動態數組。目前暫時只有動態數組部分。 ### Delphi 4 的動態數組 傳統的Pascal 語言其數組大小是預先確定的,當你用數組結構聲明數據類型時,你必須指定數組元素的個數。專業程序員也許知道些許動態數組的實現技術,一般是采用指針,用手工分配并釋放所需的內存。 Delphi 4中增加了非常簡單的動態數組實現方法,實現過程效仿我前面講過的動態長字符串。與長字符串一樣,動態數組的內存動態分配并且引用記數,不過動態數組不支持 copy-on-write 技術。這不是個大問題,因為你可以把變量值設置為nil釋放數組內存。 這樣你就可以聲明一個不指定元素個數的數組,并用SetLength 過程給數組分配一個特定大小的內存,SetLength 過程還可以改變數組大小而不影響其內容,除此外還有一些字符串過程也可用于數組,如Copy 函數。 以下摘錄的代碼突出了一點,這就是:定義數組后必須先為它分配內存,然后才能開始使用: ~~~ procedure TForm1.Button1Click(Sender: TObject); var Array1: array of Integer; begin Array1 [1] := 100; // error SetLength (Array1, 100); Array1 [99] := 100; // OK ... end; ~~~ 如果你只定義一個數組元素個數,那么索引總是從0開始。Pascal 中的普通數組既能用不為零的下標,也能用非整數的下標,但動態數組均不支持這兩種下標。象普通數組一樣,你可以通過Length、High和Low 函數了解到動態數組的狀況,不過對于動態數組,Low 函數返回值總是0,High函數返回數組大小減1,這意味著空的動態數組其函數High返回值是-1,這是一個很怪的值,因為它比Low的返回值還小。 ![](https://box.kancloud.cn/591d428f557d09496ba3487f92ccae85_203x166.png) **圖 8.1: 例 DynArr 窗體** 以上作了簡短的介紹,現在舉個簡例,例名DynArr ,見圖8.1。例子實在是很簡單,其實動態數組沒有什么特別復雜地方。我想通過該例說明幾個程序員可能犯的錯誤。程序中聲明了兩個全程數組并在OnCreate 事件中初始化了第一個數組: ~~~ var Array1, Array2: array of Integer; procedure TForm1.FormCreate(Sender: TObject); begin // allocate SetLength (Array1, 100); end; ~~~ 這樣就把數組所有值設置為0。完成這段代碼你馬上就能讀寫數組元素的值,而不用害怕內存出錯,當然條件是你沒有試圖訪問超過數組上界的元素。為了更好地初始化,程序中添加了一個按鈕,執行數組元素賦值操作: ~~~ procedure TForm1.btnFillClick(Sender: TObject); var I: Integer; begin for I := Low (Array1) to High (Array1) do Array1 [I] := I; end; ~~~ Grow 按鈕用于修改數組大小,但并不影響數組內容。單擊Grow 按鈕后,你可以用Get value按鈕進行檢驗: ~~~ procedure TForm1.btnGrowClick(Sender: TObject); begin // grow keeping existing values SetLength (Array1, 200); end; procedure TForm1.btnGetClick(Sender: TObject); begin // extract Caption := IntToStr (Array1 [99]); end; ~~~ Alias 按鈕的OnClick 事件代碼稍復雜些,程序通過 := 算子把一個數組拷貝給另一個數組,從而有效地創建了一個別名(一個新變量,但引用內存中同一數組)。從中可見,如果你改變了其中一個數組,那么另一個同樣也會改變,因為它們指向同一個內存區: ~~~ procedure TForm1.btnAliasClick(Sender: TObject); begin // alias Array2 := Array1; // change one (both change) Array2 [99] := 1000; // show the other Caption := IntToStr (Array1 [99]); ~~~ 在btnAliasClick 事件中增加了兩部分操作內容。第一部分是數組等同測試,不過并不是測試實際的數組元素,而是測試數組所引用的內存區,檢測變量是不是內存中同一數組的兩個別名: ~~~ procedure TForm1.btnAliasClick(Sender: TObject); begin ... if Array1 = Array2 then Beep; // truncate first array Array1 := Copy (Array2, 0, 10); end; ~~~ btnAliasClick 事件的第二部分內容是調用Copy 函數。該函數不僅把數據從一個數組移到另一個數組,而且用函數創建的新數組取代第一個數組,結果變量Array1 所引用的是11個元素的數組,因此,按Get value 和Set value 按鈕將產生一個內存錯誤,并且觸發一個異常(除非你把范圍檢查range-checking 選項關掉,這種情況下,錯誤仍在但屏幕上不會顯示異常)。雖然如此,Fill 按鈕仍能正常工作,因為需要修改的數組元素由數組當前的下標范圍確定。 * * * * * ### 結束語 這一章內容暫時只包括動態數組,動態數組的確是內存管理的重要組成部分,但僅僅是其中的一部分,其它內容以后會逐步添加。 本章描述的內存結構屬于典型的 Windows 編程內容,這方面內容將在下一章進行討論。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看