新聞資訊
巧用指針,提高程序工作效率
指針是CRBasic程序的一個(gè)非常強(qiáng)大的工具。合理使用指針,可以減少需要編寫(xiě)的代碼數(shù)量,提高程序的工作效率并減少程序運(yùn)行占用的數(shù)采內(nèi)存。
關(guān)于使用指針,首先要了解變量及其存儲(chǔ)方式。在采集器中,變量存儲(chǔ)在采集器內(nèi)存的一些小內(nèi)存單元中。采集器的內(nèi)存由很多連續(xù)的內(nèi)存單元組成,每個(gè)內(nèi)存單元都有獨(dú)一的地址。下文會(huì)運(yùn)用一些類(lèi)比的方法,幫助大家理解采集器如何使用內(nèi)存。
首先我們把采集器的內(nèi)存想象成一個(gè)可以存儲(chǔ)很多東西的巨大倉(cāng)庫(kù)。我們要用不同大小型號(hào)的桶,把這個(gè)倉(cāng)庫(kù)裝滿(mǎn)。所有的桶又被用來(lái)裝各種不同的東西,大桶裝大件,小桶裝小件。桶的數(shù)量及大小,取決于編寫(xiě)的程序和程序中變量的需求。當(dāng)我們開(kāi)始編寫(xiě)程序時(shí),我們會(huì)定義變量。在上文的假設(shè)下,每定義一個(gè)變量,就需要使用一個(gè)桶(即內(nèi)存單元)來(lái)存放變量。例如,一個(gè)小桶存放浮點(diǎn)數(shù)型的變量,它就占用了倉(cāng)庫(kù)(數(shù)采內(nèi)存)大約4字節(jié)的空間。
當(dāng)桶放入倉(cāng)庫(kù)時(shí),我們要給每個(gè)桶貼標(biāo)簽,便于后面找到桶。每個(gè)桶都有獨(dú)一的地址,采集器的處理器可以根據(jù)標(biāo)簽,快速找到桶。例如,我們要找“溫度”這個(gè)桶時(shí),采集器就通過(guò)解碼桶的地址,找到此桶以及桶里存放的變量信息,我們可進(jìn)行讀取或更改。
指針能夠幫助倉(cāng)庫(kù)管理員(采集器處理器)更快捷的工作和更好的管理倉(cāng)庫(kù)空間。指針也是一個(gè)變量,它的值就是其他變量的地址。和其他變量或者常量一樣,使用指針之前先進(jìn)行定義。在CRBasic中,指針需要被定義為長(zhǎng)整型。
Public my_pointer As Long這一行代碼用來(lái)定義指針變量。指針變量存儲(chǔ)為要指向的其他變量的地址。
使用或初始化新指針,需要在CRBasic中將其指向與‘溫度’變量相關(guān)聯(lián)的特定內(nèi)存段,可使用以下語(yǔ)法:
my_pointer = @temperature
現(xiàn)在“溫度”的內(nèi)存地址就被儲(chǔ)存在my_pointer指針變量中了,@符號(hào)用來(lái)操作指針地址,它是一個(gè)一元運(yùn)算符,返回它操作的內(nèi)存地址。這樣我們就可以在CRBasic進(jìn)行其他操作了,舉例說(shuō)明:
Public my_pointer As Long
Public mike As Long, tom As Long, melissa
As Long
my_pointer = @mike
mike = 42
tom = mike
melissa = my_pointer
這個(gè)簡(jiǎn)短的 CRBasic程序,表述了以下事實(shí):
? mike等于42
? 由于tom等于mike,所以tom也等于42
? melissa等于mike的存儲(chǔ)地址
? melissa不等于42,它也是一個(gè)指針變量且和my_pointer相等。
如果我們希望變量melissa包含與mike相同的值(不是mike的內(nèi)存地址),我們需要使用指針取消引用或間接操作符。如下所示:
Public my_pointer As Long
Public mike As Long, tom As Long, melissa
As Long
my_pointer = @mike
mike = 42
tom = mike
melissa = !my_pointer
您可能會(huì)說(shuō),直接讓melissa等于mike不是更簡(jiǎn)單嗎?大多數(shù)情況下是的,但使用指針可以改進(jìn)和縮短程序,并節(jié)省寶貴的采集器內(nèi)存。
指針的使用
使用指針,我們可以在一個(gè)if語(yǔ)句中實(shí)現(xiàn)從XML文件獲取數(shù)據(jù)。
If xml_response_code = XML_END_OF_ELEMENT
Then
pointer = 0
pointer =
@(xml_element_name)
If (pointer > 0) Then ! pointer = xml_value
EndIf
我們所做的是聲明要存儲(chǔ)信息的變量,使用與XML文件中的元素相同的名稱(chēng)。利用采集器中的指針,使編程更加緊湊和精準(zhǔn)。
使用指針,程序像以前一樣下載XML,并開(kāi)始使用XML Parse()指令解析它。當(dāng)它到*后一個(gè)元素時(shí),就進(jìn)入if條件語(yǔ)句。If句中的**行設(shè)置指向內(nèi)存地址0的指針。這在程序使用中非常好用,因?yàn)椴杉鞑粫?huì)在內(nèi)存地址0處返回變量信息。這可以幫助我們(和采集器)知道下一行代碼中的取消引用是成功還是失敗。下一行進(jìn)行變量的指針地址的操作設(shè)置,該變量的名稱(chēng)與存儲(chǔ)在變量xml_Element_name中的名稱(chēng)相同。
變量名稱(chēng)xml_Element_name周?chē)睦ㄌ?hào)告訴采集器不去查看XML_Element_Name的地址,而去查看XML_Element_Name中存儲(chǔ)的內(nèi)容。例如,當(dāng)XML_Element_NAME=“相對(duì)濕度”時(shí),變量指針指向名為相對(duì)濕度的變量的內(nèi)存地址,而不是指向XML_Element_Name。 這就是為什么變量名必須命名為與我們正在解析的XML文件中的元素相同的原因。語(yǔ)句中的*后一行表示,如果指針指向的內(nèi)存地址不為零,則將xml_value中的信息導(dǎo)入指針?biāo)赶虻牡刂返淖兞恐?。使?前面的示例,存儲(chǔ)在xml_value中的值將被轉(zhuǎn)儲(chǔ)到可變的相對(duì)濕度中,是不是很方便呢?
如果您在使用儀器過(guò)程中,有任何疑問(wèn)或意見(jiàn),可以隨時(shí)聯(lián)系我們,010-88202236、029-88426583。
https://www.campbellsci.com/blog/pointers-make-crbasic-programs-efficient?
北京華益瑞科技有限公司劉陽(yáng)翻譯,并適當(dāng)修改。