2011-09-20 5 views
0

내가이 문제가, 예를 들어이 코드를 보면 :델파이 XE2와 숯불/바이트 유형

SRC는 문자열 타입이며 iindex는 정수 타입과 출력으로 내가 뭔가를 같이 가지고해야
src := ''; 
for iindex := 0 to 255 do 
    begin 
    src := src + char(byte(iindex)); 
    writeln (iindex:5, byte(src[iindex]):5); 
    end; 

:

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

그래서 델파이 xe까지 모든 버전의 델피에서도 마찬가지였습니다. 내가 물어 문자열의 다른 유형을 사용할 필요가 이제

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

: 이제 델파이 XE2로, 나는이 출력이? 물론 바이트 (src [succ (iindex)])에 바이트 (src [iindex]) 업데이트하지만 그것을 해결하기위한 해결 방법을 찾았지만 iIndex = 255 일 때, 나는 예외 (src [256])를 가지고있다. 따라서 단어를 바꿔야합니다. 물론, 나는 이것이 최상의 해결책이라고 생각하지 않습니다. 그래서 더 좋은 해결책이 있는지 물어볼 것입니다. 대단히 감사합니다.

+0

src는 어떻게 선언됩니까? 어쨌든, 반드시 'byte (...)'대신에 'ord (src [iIndex])'를 써야할까요? –

+0

src는 다음과 같이 선언됩니다. var src : string; 내가 바이트의 자리에서 ord를 사용하는 경우, awfull 결과, 나는 0, 255, 1, 등 0과 1, 2 인덱스 : 0, 1, 2 존중합니다. –

+0

@david : ord (src [iIndex])를 사용합니다. iIndex = 0 인 경우 0입니다. iIndex = 255의 경우 255 iIndex 2에 0; 등등 .. 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에서 작동하지 않을 수 있습니다. 실제로 델파이 2010은 범위 검사가 비활성화되면 XE2가 동작하는 것처럼 정확하게 동작합니다. 이것은 범위 검사가 왜 중요한지에 대한 또 다른 예입니다.

+0

대단히 고마워. 그럼. 작품. 그냥 델파이 xe 전까지는 모든 char/ord 변환 chr/ord의 장소로 사용하고 모든 괜찮 았어. 감사합니다 Logged 다시 :) –

+0

@Marcello 진짜 문제는 색인 생성이며 XE2에서이 코드를 처리하는 데있어 다른 점이없는 것으로 보입니다. –

+0

예, 사실입니다. 내가 시작하기 위해 게시 한 원본 코드에 대해 설명합니다. 델파이에서 xe 사실, 그것은 그대로 나에게 문제가되지 않습니다. 이 의미에서 나는 말하지만, 지금은 내가 실수를 잘 이해하고 있습니다. –