2009-12-29 1 views
1

그것은 시간 동안 나를 붙어있어. 나는 약 280 자의 문자열 상수를 가졌다. 왜 Delphi 2009는 너무 긴 문자열 상수에 대한 메시지를 제공하지 않습니다?

나는 상수 긴 문자열 내의 부분을 찾아 포스를 사용하려고했다. 문자열이 255자를 초과하면 결과는 0이지만 문자열이 더 짧을 때 올바른 결과를 제공합니다.

예 : [DCC 오류] E2056 문자열 리터럴이 최대 255있을 수 있습니다 : 정확히 255 개 문자를 포함하는

pos('5', '123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.12345') 

256 개 문자를 포함하는 5

pos('5', '123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456') 

주는 숫자를 컴파일러 오류를 반환 집단.

pos('5', '123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.1234567') 

그러나 257 자 이상 메시지를 생성하지 않습니다 잘못이 잠시 동안 야생 거위 추적에 나를 이끌었다 수 0

을 반환합니다.

는 또한 동일

S1 :='123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456'; 

는 오류 메시지가 발생하며 컴파일되지 않습니다 : 예컨대, 문자열에 대한 간단한 과제에 대한 사실 발견.

그러나 한 번 더 문자를 추가하고, S1은 널 (null) 문자열을 할당됩니다.

이 나에게 경고하기 위해 켜져해야 델파이 옵션이 있는가, 또는이 단지 "버그"엠바 카데로 프로그래머인가?

사람은 델파이 2010 이제 모든 문자열> = 255 개 문자 메시지를 제공하는지 확인, 또는이 아닌 사람들을 위해 단지 256 문자 주실 래요> = 그렇지 않다면, 어떻게 내가지고 가야합니까 257

Quality Central에서 주목을 받았습니까? 나는 그 문제가보고되었는지 보는 방법조차 알 수 없다.


환기를 허용 해 주셔서 감사합니다.

Kornel의 답변은 빌드 14.0.3513.24210에서 수정되었다고 말하는 the bug report에 링크 된 포럼 토론에 링크되어 있습니다.


p.s. Delphi 2009 유니 코드 문자열이 도입되었을 때 Embarcadero가 255 제한을 제거해야한다고 생각하지 않습니까?

답변

3

AnsiStrings 또는 ShortStrings를 사용하고 있습니까? ShortStrings (문자열)은 길이에 제한이 있으며 AnsiString은 길이가 없습니다 (null 인 경우). 또는 {$H+} (기본적으로 AnsiStrings)을 사용하여 컴파일을 시도 했습니까?

상수의 길이 제한을 극복하기 위해, "split longer into addition" + "of shorter strings under 255 chars"를 사용합니다.

또한 델파이 지원 포럼 here에 대해서도 비슷한 토론이 있습니다.

컴파일러가 짧은 문자열 (힙에 할당하지 않음)을 저장하므로 1 바이트 크기의 길이 제한이 여기에 있기 때문에 리터럴을 길게 만들 수 없다고 가정합니다.

델파이가보고하지 않는 이유는 ... 글쎄, 그것은 known bug이며 고쳐졌으며 심지어 compiler patch입니다.

+0

예, 해결 방법을 알고 있습니다. 그것은 문제가되지 않습니다. 나는 델파이가 나에게 이것을 경고하지 않았고 나는 문제의 근원에 도달하기 위해 디버깅을 시작해야만한다는 것을 혼란스럽게 생각한다. 하지만 무제한 길이의 기본 유니 코드 문자열을 사용하고 있습니다. 제 생각에는 Delphi 2009에서도 무제한 길이의 문자열 상수가 있었을 것입니다. 255 자로두면 컴퓨터 길이가 제한되어 있으므로 줄 길이를 80 열로 제한하는 것과 같습니다. :-P – lkessler

+0

나는 나의 대답을 확장했다 :) –

+0

Kornel : Andy 's IDE Fix Pack에 대한 링크를 가져 주셔서 감사합니다. 전에는 들어 본 적이 없었습니다. 그것은 Update 3에 있던 아주 심각한 오류 (느린 디버깅 같은)를 수정하는 것 같습니다. 그리고 그것을 설치 한 후에 더 긴 문자열 상수가 오류로보고됩니다. – lkessler

0

Delphi의 문자열 상수는 255 자입니다. 파스칼과 델파이 1에서는 모든 문자열이 최대 255 자로 제한된다는 사실에 근거하여 +를 사용하여 함께 concatinating하는 것이 더 오래 갈 수 있습니다.

짜증나지만 쉽게 해결할 수 있습니다.

+0

델파이 1의 글자 수 제한은 255 자입니다. Delphi 2 (첫 번째 32 비트 릴리스)에서 문자열이 변경되어 더 긴 길이가 허용되었습니다. 반영하기 위해 –

+0

이 업데이트되었습니다. –

관련 문제