2010-08-18 35 views
5

Ben Delphi bir statik dize dizisi kullanıyorum 2006'da benim koduyla bir derleme sorun yaşıyorum: Ne programın başında dediğimiz bir prosedürdeDelphi Hata E2283 çok fazla yerel sabitleri

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

, Bu diziye değerler atarım. Bu kod, yazdığım bir komut dosyası tarafından otomatik olarak oluşturulur. Aşağıdaki diziye benzer çizgilerden oluşur: Bu dizide atanacak genel olarak yaklaşık 2000 öğe vardır. Derleyicinin öldüğü sihirli numarayı bulamadım ama 1853 ile çalışıyor ve 2109 ile çalışmıyor.

Buradaki bir dizi, bir tanıtıcıyı dönüştürmek için bu diziye ihtiyacım var (dizinin dizinidir)) çeşitli uygulamalar için bir isim olarak bir isim.

Eğer ödev listesini bölerek parçaları farklı prosedürlere koyarsam, o zaman işe yaradığını biliyorum. Ancak kod otomatik olarak oluşturulduğundan ve sık sık değiştiği için, bu yöntem oldukça rahat değildir.

Ayrıca içeriği bir dosyaya koymayı ve çalışma zamanında okumayı düşündüm, ancak göndermem gereken dosya sayısını minimumda tutmayı tercih ederim. Ayrıca, içeriği ortalama kullanıcıdan korumak istiyorum, böylece onunla uğraşmaz.

Derleyicinin sınırlamalarının üstesinden nasıl gelebileceğimi veya hedefime ulaşmak için kodumu nasıl değiştirebileceğimi biliyor musunuz?

Yardımı çok takdir edilmektedir.

+1

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

+0

sınırı dışında ise uygulanır mı iyi günler Prosedür? Onu nereye koyduğum da burası. – mj2008

+0

@Andreas Rejbrand: Bu ipucu için teşekkürler - Google'dan da buldum, ancak sınırlayıcı bir rakamdan bahsetmiyoruz ve buradaki tüm deneyimli programcılardan bazı tavsiyelerde bulunmayı umuyoruz :-) – Flo

cevap

1

ben edilir BİR ÇÖZÜM BULUNMAKTADIR!

const 
    fsi_names : array [0..FSI_NUM_VARS-1] of string = (
    'NAME 0', 
    'NAME 1', 
    ... 
    'LAST NAME' 
    ); 
Bildiğim kadarıyla söyleyebilirim

, sayısı ile ilgili sınırlama yoktur: Ben bunu tanımlamak noktasında benim diziyi başlatmak durumunda

ardından derleyici hata mesajı tükürür gelmez Ben bunu böyle yaparsam dize edebi.

Fikirleriniz için çok teşekkürler, en çok mj2008 tarafından yapıldı!

Flo

+0

Birinin kendi sorusunu cevaplamak için oldukça sakıncalı olduğunu biliyorum - ama en azından benim uygulamam için sorunu en zarif şekilde çözen çözümdü. Bir CONSTANT dizisi kullanıyorum dikkat edin, bir VARIABLE dizisi kullanmanız gerekiyorsa Andreas 'çözüm gitmek için yol gibi görünüyor. – Flo

3

Senin yerinde olsaydım, tanımlayıcılarla basit bir ASCII metin dosyası oluştururdum, böylece dosyanın "FSI_FLIGHT_PATH_ANGLE" dizesini içeren idFSI_FLIGHT_PATH_ANGLE + 1 satırı bulunur. Sonra bu dosyayı uygulamanın kaynaklarına eklerim. Böyle yaparak, veri EXE dahil edilecektir ve kolayca çalışma anında veri okuyabilir:

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

İlk bakışta, bu uygun bir çözüm gibi görünüyor. Kaynakları gözden geçirmem gerekecekti - belki de bu metin dosyasını değiştirdiğinde elle değiştirmem gerektiğini söyler misiniz? Bir kaynak editörüyle veya programımı her kurduğumda sabit diskimden okunuyorsa? Bahsedildiği gibi, bu dizeler sıklıkla değişir, bu yüzden hepsini otomatik olarak yapmak isterim. Teşekkür ederiz – Flo

+0

Delphi 2009, çok güzel bir kaynak yöneticisine sahiptir, böylece projenizi oluştururken dosyanın en yeni sürümü otomatik olarak dahil edilir. Ne yazık ki, kaynak yöneticisinin Delphi 2009'a yeni geldiğine inanıyorum ... –

+0

Lanet ... Unicode'a alerjisi olan bileşenler nedeniyle 2006 ile bir süredir sıkışıp kaldım ... Rahat bir şey olup olmadığını bilen var mı? 2006 sürümü ile yol? – Flo

-2

Alternatif dinamik dizi kullanarak

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

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

Alkış

+0

Dürüst olmak gerekirse, bunun benim problemimi çözdüğü noktayı göremiyorum. Hala çok sayıda dize hazırlaması yapmak zorundayım. Yoksa seni yanlış mı anladım? – Flo

+0

Bunun problemle ilgisi yok. Derleyici, bir yöntemde çok sayıda sabit üzerinde boğuluyor. Delphi derleyicisinin, yazılmasının ötesinde olan bazı sınırlamaları vardır, ancak bazen kendiliğinden oluşturulmuş şeylerle ilgili bir sorun haline gelebilirler. –