2010-08-18 21 views
5

que estoy teniendo un problema con mi compilación de código en Delphi 2006. Estoy utilizando una matriz de cadenas estáticas:Delphi error E2283 Demasiados constantes locales

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

En un procedimiento que llamo al comienzo del programa, Asigno valores a esta matriz. Este código se genera automáticamente por un script que escribí. Consta de líneas similares a la siguiente:

fsi_names[idFSI_FLIGHT_PATH_ANGLE] := 'FSI_FLIGHT_PATH_ANGLE'; 

En general, hay alrededor de 2000 elementos para asignar en esta matriz. No pude encontrar el número mágico donde el compilador muere, pero funciona con 1853 y no con 2109.

Lo que pasa es que necesito esta matriz para convertir una ID (que es el índice de la matriz)) a un nombre como una cadena para varias aplicaciones.

Sé que si pudiera dividir la lista de tareas y poner las partes en diferentes procedimientos, entonces funciona. Pero dado que el código se genera automáticamente y cambia con frecuencia, este método no es muy cómodo.

También pensé en poner el contenido en un archivo y leerlo en tiempo de ejecución, pero prefiero mantener el número de archivos que envío al mínimo. Además, me gustaría proteger los contenidos del usuario promedio, para que no se meta con ellos.

¿Tiene alguna idea de cómo podría superar la limitación del compilador o cambiar mi código para lograr mi objetivo?

La ayuda es muy apreciada.

+1

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

+0

¿Se aplica el límite si fuera ¿un procedimiento? Ahí es donde lo pondría de todos modos. – mj2008

+0

@Andreas Rejbrand: Gracias por este consejo, también lo encontré a través de Google, pero no menciona una cifra límite, y espero obtener algunos consejos de todos los programadores experimentados aquí :-) – Flo

Respuesta

1

I ¡ENCONTRÉ UNA SOLUCIÓN!

Si inicializar mi matriz en el punto donde lo defino, entonces el compilador no escupir el mensaje de error:

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

Por lo que yo puedo decir, no hay límite en cuanto al número de literales de cadena si lo hago así.

¡Muchas gracias por sus ideas, la de mj2008 fue de lo más útil!

tenga un buen día

Flo

+0

Sé que es bastante difícil responder a la propia pregunta, pero lo anterior fue la solución que resolvió el problema de la manera más elegante, al menos para mi aplicación. Observe que estoy usando una matriz CONSTANTE, si necesita usar una matriz VARIABLE, la solución de Andreas parece ser el camino a seguir. – Flo

3

Si yo fuera usted, crearía un archivo de texto ASCII simple con los identificadores, de modo que la línea idFSI_FLIGHT_PATH_ANGLE + 1 del archivo contenga la cadena "FSI_FLIGHT_PATH_ANGLE". Luego agregaría este archivo a los recursos de la aplicación. Al hacerlo, los datos se incluirán en el archivo EXE, y se puede leer fácilmente los datos en tiempo de ejecución:

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

A primera vista, parece una solución factible. Sin embargo, tendría que revisar Recursos: ¿podría decirme si tengo que incluir este archivo de texto manualmente cuando ha cambiado, p. con un editor de recursos, o si se lee desde mi disco duro cada vez que construyo mi programa? Como se mencionó, estas cadenas cambian con frecuencia, por lo que me gustaría hacerlo todo automáticamente. Gracias – Flo

+0

Delphi 2009 tiene un administrador de recursos muy agradable, por lo que la versión más reciente del archivo se incluye automáticamente al construir su proyecto. Desafortunadamente, sin embargo, creo que el administrador de recursos era nuevo en Delphi 2009 ... –

+0

Maldita sea ... Estoy atascado con 2006 por un tiempo debido a componentes que son alérgicos a Unicode ... ¿Alguien sabe si hay un cómodo camino con la versión 2006? – Flo

-2

alternativa es usar matriz dinámica

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

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

Saludos

+0

Para ser sincero, no veo el punto donde esto resuelva mi problema. Todavía tendría que asignar una gran cantidad de literales de cadena. ¿O te di mal? – Flo

+0

Esto no tiene nada que ver con el problema. El compilador se está ahogando en la gran cantidad de constantes en un método. El compilador Delphi tiene algunos límites que van más allá de lo que uno debería escribir, pero ocasionalmente pueden convertirse en un problema con cosas autogeneradas. –

Cuestiones relacionadas