TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: damago en 01 de Febrero de 2005, 05:22:00
-
A ver que no lie con el titulo del hilo jeje
Se trata de si algun avispao se le ocurre como utilzar un vector de 2 dimensiones (vec[10][10]) pero que este fisicamente en la zona de ram que desees.
Ej;
char vec[10][10];
vec[0][3] = 7;
esto no es lo que quiero (ya que el compilador me pone el vector ande le sale las narices)
Quiero que vec[10][10] empiece por ejemplo en la direccion 0x5555 por decir algo.
Se que una opcion es utilizar un puntero y por ej:
char *puntero=(char*)0x5555;
columna=2;
fila=4;
*(puntero+10*fila+ columna); //equivale a vec[columna][fila]
pero alguien sabe como definir ese vector de 2 dimensiones en la direccion 0x5555 por ej., para usarlo luego de esta manera:
vector- [y] = blablablabla
y no asi:
*(puntero + x*10 + y) = blablabla
No es cuestion de optimizar mas o menos, sino solo saber si acepta el C estandar esto.
Un saludo. Hasta luego!
-
Podrias probar a usar la directiva #LOCATE,aunque no sé si se podrá hacer con un tipo compuesto,pero por probar...
-
Hola modulay, buenos dias.
La directiva #LOCATE es estandar de C para todos los compiladores?? o de algun compilador en concreto que utilizas?
Es que no me suena, me puedes poner un ejemplo o decirme donde puedo buscarlo? He intentado poner locate en google y no he encontrado nada.
Un saludo.
-
Por que no buscas la aplicacion de #LOCATE en el manual de CCS?. Allí está a version 2004 en formato .pdf, quizá te sirva..!
gfp
-
Hola gfp, ya he visto un ejemplo y el uso del #locate en el manual del CCS de pic.

El problema es que es una directiva particular de este compilador. Si utilizo otro compilador, para el micro que sea, no existe.
Es una pijada, ya que con un puntero puedes hacer lo que pretendia, pero tenia la curiosidad de si habia algo estandar que permite en C hacerlo.
Un saludo. Buenas noches.
-
Damago, me ha sorprendido tu post porque haces un estupendo uso de los punteros, y son un concepto que no acabo de asimilar.
Tengo una duda con la sentencia:
char *puntero=(char*)0x5555;
¿Sería igual hacer esto?:
puntero=0x5555;
Si no fuera igual, ¿porqué?
Gracias
-
Hola nocturno66,
char *puntero = (char *) 0x5555;
y
char *puntero = 0x5555;
y
char *puntero;
puntero = 0x5555;
puede ser lo mismo depende del compilador.
Algunos compiladores te daran error si no haces el moldeo (osea convertir el dato de origen al mismo tipo de dato que el destino antes de asignarselo) .
Otros simplemente hacen la conversion y te daran un warning, y otros ni siquieran daran warning (tambien dependera de las opciones que se le pasen al compilador),
Por ej el borland C da un warning ante esto:
int a=5;
char b;
b=a;
pero hace bien la conversion ...b=5;
si ponemos:
b= (char) a;
no dara el warning, ya que antes de asignarlo a b, convierte el valor de "a" a tipo char.
Echale un ojo a esta pagina :
http://docs.hp.com/en/B3901-90007/ch05s05.html