2010-08-18 3 views
5

델파이 내가 정적 문자열 배열을 사용하고 2006 년에 내 코드를 컴파일 문제가 오전 : 나는이 프로그램의 시작 부분에서 호출하는 과정에서델파이 오류 E2283 너무 많은 지역 상수

fsi_names : array [0..FSI_NUM_VARS-1] of string; 

을, 이 배열에 값을 할당합니다. 이 코드는 내가 작성한 스크립트에 의해 자동으로 생성됩니다. 다음과 비슷한 줄로 구성됩니다.

fsi_names[idFSI_FLIGHT_PATH_ANGLE] := 'FSI_FLIGHT_PATH_ANGLE'; 

이 배열에는 약 2000 개의 요소가 할당됩니다. 컴파일러가 죽는 곳의 마법 번호를 찾을 수는 없었지만 1853과 작동하고 2109는 사용하지 않습니다.

이 배열을 사용하여 배열 (배열의 인덱스)을 변환해야합니다.)를 다양한 응용 프로그램의 문자열로 사용합니다.

할당 목록을 분리하고 각 부분을 다른 절차에 넣으면 효과가 있다는 것을 알고 있습니다. 그러나 코드가 자동 생성되고 자주 변경되기 때문에이 방법은별로 편하지 않습니다.

또한 파일에 내용을 넣고 런타임에 읽는 방법에 대해 생각했지만 최소한의 파일 수를 유지하고 싶습니다. 또한 일반 사용자의 콘텐츠를 보호하고 싶습니다.

컴파일러의 한계를 극복하거나 내 목표를 달성하기 위해 코드를 변경하는 방법에 대해 알고 있습니까?

도움을 주신 데 대해 감사드립니다.

+1

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/cm_too_many_consts_xml.html –

+0

한계 밖에있는 경우 적용됩니까 좋은 하루를 되세요 절차? 그것은 내가 어쨌든 그것을 넣을 곳이다. – mj2008

+0

@Andreas Rejbrand :이 힌트를 가져 주셔서 감사합니다. Google을 통해서도 발견되었지만 제한적인 수치는 언급하지 않았으며 모든 경험 많은 프로그래머로부터 조언을 얻기를 바랍니다. – Flo

답변

1

I됩니다 해결책을 찾았습니다!

const 
    fsi_names : array [0..FSI_NUM_VARS-1] of string = (
    'NAME 0', 
    'NAME 1', 
    ... 
    'LAST NAME' 
    ); 
지금까지 내가 말할 수있는

의 수에 대한 제한이 없음 : 나는 그것을 정의하는 시점에서 내 배열을 초기화하는 경우

, 다음 컴파일러는 오류 메시지를 뱉어하지 않습니다 내가 그렇게하는 경우 문자열 리터럴.

mj2008이 가장 도움이 된 아이디어에 감사드립니다.

플로

+0

나는 자신의 질문에 대답하는 것이 매우 안타깝다는 것을 안다.하지만 위의 내용은 적어도 나의 응용 프로그램에서 가장 좋은 방법으로 문제를 해결 한 해결책이었다. VARIABLE 배열을 사용해야 할 경우 CONSTANT 배열을 사용한다는 것을 알 수 있습니다. Andreas의 솔루션은 갈 길이 멀 것 같습니다. – Flo

3

내가 너라면 필자는 식별자가있는 간단한 ASCII 텍스트 파일을 작성하여 파일의 idFSI_FLIGHT_PATH_ANGLE + 1 행에 "FSI_FLIGHT_PATH_ANGLE"문자열이 포함되도록 작성합니다. 그런 다음이 파일을 응용 프로그램의 리소스에 추가합니다. 그렇게함으로써, 데이터는 EXE에 포함됩니다, 당신은 쉽게 런타임에서 데이터를 읽을 수 있습니다 :

function GetNthString(const N: integer): string; 
var 
    RS: TResourceStream; 
begin 
    RS := TResourceStream.Create(hInstance, 'NAMEOFRESOURCE', RT_RCDATA); 
    with TStringList.Create do 
    try 
     LoadFromStream(RS); 
     result := Strings[N]; 
    finally 
     Free; 
    end; 
    RS.Free; 
end; 
+0

언뜻보기에 이것은 실현 가능한 해결책처럼 보입니다. 리소스를 검토해야 할 것입니다.이 텍스트 파일이 변경되었을 때 수동으로 포함해야하는지 여부를 알려주시겠습니까? 리소스 편집기를 사용하여 또는 프로그램을 빌드 할 때마다 하드 디스크에서 읽을 수 있습니까? 언급 한 바와 같이이 문자열은 자주 변경되므로 자동으로 모두 수행하려고합니다. 감사합니다. – Flo

+0

Delphi 2009에는 리소스 관리자가있어서 프로젝트를 빌드 할 때 최신 버전의 파일이 자동으로 포함됩니다. 불행히도, 그러나, 나는 자원 관리자가 델파이 2009에 새로운 것이라고 생각합니다 ... –

+0

젠장 ... 나는 유니 코드에 알레르기가있는 구성 요소로 인해 잠시 동안 2006 년 붙어 오전 ... 만약 거기에 편안한 2006 버전과 어떤 방식으로? – Flo

-2

대체 동적 배열을 사용

from 
fsi_names : array [0..FSI_NUM_VARS-1] of string; 

to 
fsi_names: array of string; 
SetLength(fsi_names, FSI_NUM_VARS); 

건배

+0

솔직히 말해서, 이것이 내 문제를 해결하는 요점을 보지 못했습니다. 문자열 리터럴을 많은 수로 할당해야합니다. 아니면 내가 틀렸어? – Flo

+0

이것은 문제와 아무 관련이 없습니다. 컴파일러는 한 가지 방법으로 많은 수의 상수를 질식시킵니다. 델파이 컴파일러는 작성해야 할 것 이상의 한계를 가지고 있지만, 때로는 자동 생성 된 항목으로 인해 문제가 될 수 있습니다. –

관련 문제