2010-08-18 20 views
5

Tôi gặp một vấn đề biên soạn với mã của tôi trong Delphi 2006. Tôi đang sử dụng một static String mảng:Delphi Lỗi E2283 Quá nhiều hằng địa phương

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

Trong một thủ tục mà tôi gọi vào lúc bắt đầu của chương trình, Tôi gán các giá trị cho mảng này. Mã này được tạo tự động bởi một tập lệnh mà tôi đã viết. Nó bao gồm các dòng tương tự như dòng tiếp theo:

fsi_names[idFSI_FLIGHT_PATH_ANGLE] := 'FSI_FLIGHT_PATH_ANGLE'; 

Có tổng cộng khoảng 2000 phần tử được gán trong mảng này. Tôi không thể tìm ra số ma thuật mà trình biên dịch chết, nhưng nó hoạt động với năm 1853 và không hoạt động với 2109.

Điều này là tôi cần mảng này để chuyển đổi ID (là chỉ mục cho mảng) cho một tên như một chuỗi cho các ứng dụng khác nhau.

Tôi biết rằng nếu tôi chia danh sách bài tập và đưa các phần vào các thủ tục khác nhau, thì nó sẽ hoạt động. Nhưng vì mã được tạo tự động và thay đổi thường xuyên, phương pháp này không hoàn toàn thoải mái.

Tôi cũng nghĩ về việc đưa nội dung vào một tệp và đọc nó trong thời gian chạy, nhưng tôi muốn giữ số lượng tệp tôi phải gửi đến mức tối thiểu. Ngoài ra, tôi muốn bảo vệ nội dung từ người dùng trung bình, để anh ấy không gây rối với nó.

Bạn có ý tưởng làm cách nào để vượt qua giới hạn của trình biên dịch hay thay đổi mã của tôi để đạt được mục tiêu của mình không?

Trợ giúp được đánh giá rất nhiều.

+1

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

+0

Có giới hạn áp dụng nếu bên ngoài một thủ tục? Đó là nơi tôi sẽ đặt nó anyway. – mj2008

+0

@Andreas Rejbrand: Cảm ơn bạn vì gợi ý này - Tôi cũng tìm thấy nó thông qua Google, nhưng nó không đề cập đến một con số hạn chế, và tôi hy vọng sẽ nhận được một số lời khuyên từ tất cả các lập trình viên có kinh nghiệm ở đây :-) – Flo

Trả lời

1

tôi FOUND A GIẢI PHÁP!

Nếu tôi khởi tạo mảng của tôi tại thời điểm mà tôi định nghĩa nó, sau đó trình biên dịch không nhổ ra thông báo lỗi:

const 
    fsi_names : array [0..FSI_NUM_VARS-1] of string = (
    'NAME 0', 
    'NAME 1', 
    ... 
    'LAST NAME' 
    ); 

Theo như tôi có thể nói, không có giới hạn về số lượng chuỗi chữ nếu tôi làm như vậy.

Cảm ơn bạn rất nhiều vì ý tưởng của bạn, bài viết của mj2008 hữu ích nhất!

Have a nice day

Flo

+0

Tôi biết nó khá lame để trả lời câu hỏi của riêng mình - nhưng ở trên là giải pháp giải quyết vấn đề một cách thanh lịch nhất, ít nhất là cho ứng dụng của tôi. Lưu ý rằng tôi đang sử dụng một mảng CONSTANT, nếu bạn cần sử dụng một mảng VARIABLE, thì giải pháp của Andreas dường như là cách để đi. – Flo

3

Nếu tôi là bạn, tôi sẽ tạo một tệp văn bản ASCII đơn giản với số nhận dạng, để dòng idFSI_FLIGHT_PATH_ANGLE + 1 của tệp chứa chuỗi "FSI_FLIGHT_PATH_ANGLE". Sau đó, tôi sẽ thêm tệp này vào tài nguyên của ứng dụng. Bằng cách làm như vậy, dữ liệu sẽ được đưa vào EXE, và bạn có thể dễ dàng đọc dữ liệu tại thời gian chạy:

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

Thoạt nhìn, điều này trông giống như một giải pháp khả thi. Tuy nhiên, tôi sẽ phải xem xét Tài nguyên - bạn có thể cho tôi biết liệu tôi có phải bao gồm tệp văn bản này theo cách thủ công khi nó đã thay đổi hay không, ví dụ: với một trình soạn thảo tài nguyên, hoặc nếu nó được đọc từ đĩa cứng của tôi mỗi lần tôi xây dựng chương trình của tôi? Như đã đề cập, những chuỗi này thay đổi thường xuyên, vì vậy tôi muốn tự động làm tất cả. Cảm ơn bạn – Flo

+0

Delphi 2009 có trình quản lý tài nguyên rất tốt, do đó phiên bản mới nhất của tệp được tự động đưa vào khi bạn tạo dự án của mình. Thật không may, tuy nhiên, tôi tin rằng quản lý tài nguyên là mới để Delphi 2009 ... –

+0

Chết tiệt ... Tôi bị mắc kẹt với năm 2006 trong một thời gian do các thành phần bị dị ứng với Unicode ... Có ai biết nếu có một thoải mái cách với phiên bản 2006? – Flo

-2

Alternative đang sử dụng mảng động

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

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

Cheers

+0

Thành thật mà nói, tôi không thấy điểm giải quyết vấn đề của mình. Tôi vẫn sẽ phải gán một số lượng lớn các chuỗi ký tự. Hay tôi đã sai lầm? – Flo

+0

Điều này không liên quan gì đến vấn đề này. Trình biên dịch nghẹt thở trên số lượng lớn các hằng số trong một phương thức. Trình biên dịch Delphi có một số giới hạn vượt quá những gì người ta nên viết nhưng đôi khi chúng có thể trở thành một vấn đề với các công cụ tự tạo. –

Các vấn đề liên quan