2010-08-18 9 views
5

J'ai un problème de compilation avec mon code Delphi 2006. J'utilise un tableau de chaînes statiques:Delphi Erreur E2283 Trop de constantes locales

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

Dans une procédure que j'appelle au début du programme, J'attribue des valeurs à ce tableau. Ce code est généré automatiquement par un script que j'ai écrit. Il se compose de lignes similaires à la suivante:

fsi_names[idFSI_FLIGHT_PATH_ANGLE] := 'FSI_FLIGHT_PATH_ANGLE'; 

Il y a environ 2000 éléments à affecter dans ce tableau. Je n'ai pas pu trouver le nombre magique où meurt le compilateur, mais ça marche avec 1853 et non avec 2109.

Le truc c'est que j'ai besoin de ce tableau pour convertir un ID (qui est l'index du tableau) à un nom sous forme de chaîne pour diverses applications.

Je sais que si je diviserais la liste des affectations et mettrais les parties dans différentes procédures, alors cela fonctionnerait. Mais puisque le code est généré automatiquement et change souvent, cette méthode n'est pas très confortable.

Je pensais aussi mettre le contenu dans un fichier et le lire au moment de l'exécution, mais je préférerais que le nombre de fichiers que je dois expédier soit réduit au minimum. En outre, je voudrais protéger le contenu de l'utilisateur moyen, afin qu'il ne plaisante pas avec lui.

Avez-vous une idée de comment surmonter la limitation du compilateur ou changer mon code pour atteindre mon objectif?

L'aide est très appréciée.

+1

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

+0

Est-ce que la limite applicable si l'extérieur une procédure? Voilà où je l'ai mis de toute façon. – mj2008

+0

@Andreas Rejbrand: Merci pour cet indice - je l'ai également trouvé via Google, mais il ne mentionne pas un chiffre limitant, et j'espère obtenir quelques conseils de tous les programmeurs expérimentés ici :-) – Flo

Répondre

1

I TROUVÉ UNE SOLUTION!

Si j'initialiser mon tableau au point où je le définis, le compilateur ne crache pas le message d'erreur:

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

Pour autant que je sache, il n'y a pas de limite quant au nombre de littéraux de chaîne si je le fais comme ça.

Merci beaucoup pour vos idées, celle de mj2008 a été très utile!

Avoir une belle journée

Flo

+0

Je sais que c'est assez boiteux de répondre à sa propre question - mais ce qui précède a été la solution qui a résolu le problème de la manière la plus élégante, au moins pour mon application. Notez que j'utilise un tableau CONSTANT, si vous avez besoin d'un tableau VARIABLE, la solution d'Andreas semble être la bonne solution. – Flo

3

Si j'étais vous, je créerais un simple fichier texte ASCII avec les identifiants, de sorte que la ligne idFSI_FLIGHT_PATH_ANGLE + 1 du fichier contient la chaîne "FSI_FLIGHT_PATH_ANGLE". Ensuite, je voudrais ajouter ce fichier aux ressources de l'application. Ce faisant, les données seront incluses dans le fichier EXE, et vous pouvez facilement lire les données à l'exécution:

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

À première vue, cela ressemble à une solution réalisable. Cependant, je devrais passer en revue les ressources - pouvez-vous me dire si je dois inclure ce fichier texte manuellement quand il a changé, par ex. avec un éditeur de ressources, ou s'il est lu sur mon disque dur chaque fois que je construis mon programme? Comme mentionné, ces chaînes changent souvent, donc je voudrais tout faire automatiquement. Merci – Flo

+0

Delphi 2009 a un très beau gestionnaire de ressources, de sorte que la nouvelle version du fichier est automatiquement incluse lorsque vous construisez votre projet. Malheureusement, je crois que le gestionnaire de ressources était nouveau à Delphi 2009 ... –

+0

Merde ... Je suis coincé avec 2006 pour un moment en raison de composants qui sont allergiques à l'Unicode ... Est-ce que quelqu'un sait s'il y a un confortable manière avec la version 2006? – Flo

-2

Alternative utilise un tableau dynamique

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

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

Vive

+0

Pour être honnête, je ne vois pas le point où cela résout mon problème. Je devrais encore assigner un grand nombre de littéraux de chaîne. Ou est-ce que je me suis trompé? – Flo

+0

Cela n'a rien à voir avec le problème. Le compilateur s'étouffe sur le grand nombre de constantes dans une méthode. Le compilateur Delphi a certaines limites qui sont au-delà de ce que l'on devrait jamais écrire mais parfois ils peuvent devenir un problème avec des choses autogénérées. –