[英]Squeak Smalltalk -“Print specific integers” Error message, how to improve and why?
我想要的是:從1到130的整數,我要打印數組中已經給出的一些特定整數。 它們是:2 32 44 67 89 111 123,它們以從小到大的順序存儲。
這是我的代碼:
|a n myArray|
myArray := #(2 32 44 67 89 111 123).
n := 1.
a := myArray at: n.
1 to: 130 do: [:i|
i = a
ifTrue: [
Transcript show: i; cr.
n := n + 1.
a := myArray at: n.
].
].
除錯誤消息外,輸出非常好。
以我目前的水平,我不知道為什么會出現該錯誤消息。
Q1:為什么出現錯誤信息?
問題2:如何改善?
更新:
我找到了解決此問題的另一種方法:
|myArray|
myArray := #(2 32 44 67 89 111 123).
n := 1.
a := myArray at: n.
1 to: 130 do: [:i|
i = a
ifTrue: [
Transcript show: i; cr.
n := n +1.
n = 8
ifTrue: [n := n - 1].
a := myArray at: n.
].
].
雖然看起來很丑。
再次更新:
|a n myArray|
myArray := #(2 32 44 67 89 111 123).
n := 1.
a := myArray at: n.
1 to: 130 do: [:i|
i = a
ifTrue: [
Transcript show: i; cr.
n := n + 1.
(n = 8) ifTrue: [^'Found it!'].
a := myArray at: n.
].
].
如果單擊調試按鈕,則可以訪問調試器,該調試器可以幫助您了解發生了什么。
您顯示的窗口中的列表是執行堆棧。 您嘗試執行的代碼段被標記為UndefinedObject>>DoIt
。 單擊它,您將看到代碼在哪里停止-執行時:
myArray at: n
在調試器中,有檢查器,如果單擊n,您將看到n = 8
,然后檢查myArray,您將看到它只有7個元素。 因此,您嘗試使用超出數組界限的下標(索引)訪問myArray,因為錯誤消息告訴您...
您可以從調試器重新啟動該方法並逐步執行它。 但是,由於它將在循環123失敗,因此可能很無聊...您還可以在調試器中修改代碼,例如,使用myArray := #(2 4 5).
acceopt,然后逐步重新啟動執行,以查看是否可以了解算法失敗的原因。
我的建議是嘗試以不同的方式思考。 您已經有一個包含要打印的值的數組( myArray
)。 因此,如果您設法告訴myArray
更直接地做您想做的事情,也許可以通過編寫類似於myArray do: [:element | ...]
myArray do: [:element | ...]
從整數1到130,我想打印數組中已經給出的一些特定整數
1 to: 130 do: [ :i |
(array includes: i) ifTrue: [ Transcript show: i; cr. ] ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.