No hay respuestas a esto en Internet que pueda encontrar, y he buscado dos veces en los últimos 4 meses.
En MPLab v8.88 usando Hi-Tech ANSI C Compiler, tengo esta línea de código:
const uint8 SUM_THRESHOLD_MIN = 15; /* comment edited out */
y me sale la advertencia:
Warning [364] C:\*directory edited out* \ *filename_edited_out*.c; 273.35 attempt to modify object qualifed const
(disculpe las ediciones, pero sentí que debería editar detalles personales pero superfluos).
No es mi código, y solo usaría a #define
, pero otros quieren usar a const
(para aquellos que no saben: el uso de a const
garantiza un encasillado adecuado de un valor, y puede salvarlo de algunos problemas extraños relacionados con el encasillado y tipos de datos; no es mi forma favorita de hacerlo, pero tampoco es una mala idea).
Están const
ocurriendo varias inicializaciones en el mismo bloque de código, y todas me dan esta advertencia. Están en un archivo .c, en una función nula. Tengo otros archivos con funciones nulas donde inicializo const uint8 y no hay advertencias en esos archivos. Busqué globalmente y no encontré ninguna otra instancia de la variable, excepto donde se usa en la función void (por lo que no hay problemas con la redefinición ni nada por el estilo). Para ser claros, estas constantes no son parte de ninguna estructura ni nada extraño, simplemente se declaran en la función void en el archivo .c.
Tengo uint8 correctamente typedef'd, y no #define'd (ver comentarios).
¿Puede alguien ayudarme a deshacerme de esta advertencia?
EDITAR: si pego uno de los const uint8 en otro archivo .c directamente después de un const uint16 que no arroja el error, así:
const uint16 rate_bias_time_constant[NUM_RATE_CHANNELS][RATE_BIAS_STEP_MAX] =
{30,120,480,960, 300,120,180,240, 300,120,180,240 }; // comment edited out
const uint8 SUM_THRESHOLD_MIN = 15; /* comment edited out */
Recibo la advertencia 364 en este archivo para este const uint8 pero no para el const uint16. Si cambio SUM_THRESHOLD_MIN de uint8 a uint16, aún recibo la advertencia. Para completar, si lo cambio de mayúsculas a minúsculas, todavía recibo la advertencia. Si cambio la línea a, por ejemplo:
const uint8 SUM_THRESHOLD_MIN[2] = {15,2}; /* comment edited out */
No hay advertencia.
Lo tengo, y muchas gracias por la ayuda de todos!
Las declaraciones que no arrojan advertencias son matrices o se declaran estáticas const uint8/16. Por alguna razón, el compilador Hi-Tech C está bien con const int/char, const uint8/16 que son arreglos, pero no const uint8/16 a menos que se declare como static const uint8/16.
Debería apreciar que, debido a la extraña arquitectura del PIC16/18, un calificador "const" es una instrucción para colocar esa variable en Flash en lugar de RAM, no una instrucción para decirle al compilador que no se puede cambiar.
Si está tratando de inicializar el valor de una variable automática que es local para una función, entonces ESTÁ tratando de cambiarla en tiempo de ejecución porque intentará escribir ese valor de inicialización en la variable (que se almacena en Flash y es por lo tanto, no se puede escribir (fácilmente) cada vez que se ejecuta la función. La razón por la que funciona cuando la variable se declara estática es porque las variables estáticas que son locales para las funciones solo se inicializan una vez, por lo que no hay inconsistencia lógica de la que el compilador se queje. Supongo que las matrices constantes se tratan de la misma manera.
Creo que el problema principal es su expectativa de cómo funciona CONST con este compilador en este procesador. Estas cosas no son variables como parece esperar de su descripción. Es muy probable que se implementen como constantes en la memoria del programa, que es esencialmente de solo lectura. Estas cosas no se pueden cambiar en tiempo de ejecución. El error que está recibiendo probablemente esté relacionado con el código de tiempo de ejecución que intenta escribir en CONST, no con la definición de CONST.
david tweed
uint8
un propiotypedef
o simplemente un#define
?Beto
m.alin
joe hass
Beto
Beto
usuario28910
m.alin
david tweed
#pragma
s) que desactivan esa advertencia en particular?Beto
Beto
Beto
david tweed
Beto
david tweed
Beto
Beto
usuario28910
david tweed
woliveirajr
Beto