2011-09-20 84 views
0

我有這個問題,看示例的這一代碼:的Delphi XE2和字符/字節型

src := ''; 
for iindex := 0 to 255 do 
    begin 
    src := src + char(byte(iindex)); 
    writeln (iindex:5, byte(src[iindex]):5); 
    end; 

其中SRC是字符串類型和iindex是整數類型和作爲輸出我應該有東西爲:

iIndex byte(src[iIndex]) 
0   0 
1   1 
2   2 
3   3 
.................. 
254  254 
255  255 

所以在delphi的所有最新版本中都是這樣,直到delphi xe;現在用delphi XE2,我有這樣的輸出:

iIndex byte(src[iIndex]) 
0   0 
1   0 
2   1 
3   2 
.................. 
254  253 
255  254 

現在我要問,需要使用不同類型的字符串?我已經找到了一個解決方法,當然,更新字節(src [iindex])爲字節(src [succ(iindex)]),但是當iIndex = 255時,我有字節(src [256])會引發異常所以需要改變字中的字節。 當然,我不認爲這是最好的解決方案,所以我問你是否有更好的解決方案。 非常感謝。

+0

src是如何聲明的?無論如何,你的意思是寫'ord(src [iIndex])'而不是'byte(...)'? –

+0

src被聲明爲:var src:string;如果我在字節位置使用ord,那麼結果非常不好,我有0,255,1等,而不是索引爲0,1,2的0,1,2。 –

+0

@david:使用ord(src [iIndex])我有:0 for iIndex = 0; 255爲iIndex = 1; 0代表iIndex 2;等等等等。對於iIndex = 255我有253. awfull :(一些想法? –

回答

6

您正在訪問字符串越界。 Delphi中的字符串訪問是基於1的。你應該得到一個範圍檢查錯誤。另外,我認爲你應該更喜歡使用chr()ord()而不是演員。

src := ''; 
for iindex := 0 to 255 do 
begin 
    src := src + chr(iindex); 
    writeln (iindex:5, ord(src[iindex+1]):5); 
end; 

我沒有看到該代碼可能在早期版本的Delphi的工作。事實上,Delphi 2010的行爲與您描述XE2的行爲完全一樣,一旦範圍檢查被禁用。這是範圍檢查如此有價值的又一個例子。

+0

非常感謝。所以工作。直到delphi xe我已經每次使用字符/字節轉換爲chr/ord的地方,並且一切正常。再次:) –

+0

@Marcello真正的問題是索引,並注意到在XE2的處理這個代碼似乎沒有什麼不同。 –

+0

是的,它是真的。我講述了我已經發布的原始代碼。在delphi xe事實上,它是如此,沒有給我的問題。從這個意義上說,我告訴,但現在我已經更好地理解我錯誤的地方:) –