【正文】
? (3) begin writeln(h(2)) end。 (5)} (6)main( ) (7){ int a=1,b=2。 傳值 的實現 ? ,即在被調過程的活動記錄中開辟了形參的存儲空間,這些存儲位置即是我們所說的形式單元(用以存放實參)。 帶有非局部變量和形參的 PASCAL過程 非局變量 a[i]和 a[j]的 值進行交換, i,j為形參(在這里是傳值) (1)program reference(input,output)。 這樣,每個過程的活動記錄所含的內容有: TOP值,它指向過程活動記錄的棧頂位置。 L8:end。 主 ?? p roc Q (b)。A [l 1:u 1, l 2:u 2,?? , ln : un] l1 u1 l2 u2 : : t y pe a (首地址) n C ? 過程活動記錄 AR :為說明方便,假定程序是由過程組成,過程區(qū)分為源文本,運行時稱作過程的激活。 嵌套過程語言棧式分配 。 ? array B[m:n]。 ?關鍵技術:解決對非局部量的引用(存取)。 array B[m:n]。 為了解決上述問題,可采取兩種措施。 數 組 C 數 組 C 數 組 B 數 組 B C 的 向 量 內 情 eB5的 T O PC 的 內 情 向 量B4的 T O PB4 的 T O PB 的 內 情 向 量B 的 內 情 向 量 z Z B1的 T O PB1 的 T O P D I S P L A YD I S P L A Y 形式單元 m , n 2 形式單元 m , n 2連接數據連 接 數 據 A 的 T O PA 的 T O P ∶ ∶ ∶ ∶ ( e ) ( f)( e ) 進入分程序 B4分配數組 C 之后; ( f ) 進入分程序 B5 。 (12) swap(a,b)。 begin temp:=x。 procedure c。 ? (9)begin ? (10) c ? (11)end 圖 1027 嵌套過程作為參數傳遞 p ar am c 存取鏈 m b f . 存取鏈圖 10 28 連同存取鏈一起 傳遞過程實參 各種數據對象的存儲分配 數據對象 name 名字,名稱 type 類型 location 內存地址 value 值 ponent 成分 除實參是過程情況外,還有實參為數組,實參為標號等情況。 begin m:=3。 其結果等價于執(zhí)行下列運算: x :=a; y :=b; temp :=x; x :=y; y :=temp 傳地址 的實現 ( call by reference )(callbyaddress)(callbylocation) 把實在參數的地址傳遞給相應的形參,即 調用過程把一個指向實參的存儲地址的指針傳遞給被調用過程相應的形參: 1實在參數是一個名字,或具有左值的表達式 傳遞左值 2實在參數是無左值的表達式 計算值,放入一存儲單元,傳此存儲單元地址 3目標代碼中,被調用過程對形參的引用變成對傳遞給被調用過程的指針的間接引用 procedure swap( x,y:integer)。 (10)begin (11) a:=1。 ( b) 進 入 分 程 序 B1。 例如:如果有一個從第 5層分程序轉出到達第 1層分程序的標號 L,雖然在第 5層分程序工作時知道 L所屬的層數,我們極易從DISPLAY中獲得第 1層分程序的活動記錄基址( SP),但是怎么知道第 1層分程序進入時的 TOP呢?唯一的辦法是從 5,4,3和2各層順序退出。 integer m,n。 主程序執(zhí)行語句