Autor Tema: ¿Alguien me explica por que en CCS no puedo hacer esto?  (Leído 3943 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
¿Alguien me explica por que en CCS no puedo hacer esto?
« en: 14 de Abril de 2020, 16:21:45 »
Y ya de paso, como poder hacerlo.

Código: C
  1. #include <18F4550.h>  //18F4550
  2. #use delay(clock=8000000)
  3. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
  4.  
  5.  
  6. void texto(char *cadena) {
  7.     printf("%s",cadena);
  8. }
  9.  
  10.  
  11.  
  12. void main() {
  13.     texto("HOLA");
  14.     while(1);
  15. }

Al compilar me dice esto:  Error#90  Attempt to create a pointer to a constant


  Sin embargo, si cambio el  texto("HOLA"); por texto('h');    Si me compila bien. Pero no me sirve de nada.

  En XC8 no tengo ningún problema con esto.

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:¿Alguien me explica por que en CCS no puedo hacer esto?
« Respuesta #1 en: 14 de Abril de 2020, 18:15:41 »
Si en texto() solo vas a recibir constantes, declarás
Código: C
  1. void texto(rom char *cadena) {

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:¿Alguien me explica por que en CCS no puedo hacer esto?
« Respuesta #2 en: 14 de Abril de 2020, 19:05:34 »
Muchísimas gracias.
 
 Solucionado. Así si me compila.

   Llegué a probar al poner:

 void texto(const char *cadena){}.

Pero sin suerte.  Veo que estuve cerca  :lol:

  Media tarde dándole vueltas y lo más que conseguí es que si le quitaba el puntero a la función dejándolo solo :

void texto(char cadena){}

Así si que me compilaba pero el problema es que a la variable se le asignaba el primer carácter de la cadena en vez de la dirección de memoria, como cabía esperar.

  He ido directamente al archivo hex para ver si me generaba la cadena y donde. Comprobé que efectivamente la generaba y anote la dirección de memoria de donde la había generado.

  Luego probé  al crear otro puntero dentro de la propia función que apuntase al argumento pero me devolvía una dirección de memoria distinta a la del primer elemento de la cadena. 

  Desesperado estaba ya.

 Muchas gracias de nuevo.
« Última modificación: 14 de Abril de 2020, 19:17:44 por remi04 »

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:¿Alguien me explica por que en CCS no puedo hacer esto?
« Respuesta #3 en: 24 de Abril de 2020, 06:29:15 »
Vuelvo a subir esto por que todavía me sigue dando quebraderos de cabeza.

A ver, este código que pongo a continuación funciona perfectamente:

 
Código: C
  1. void texto(rom char *cadena) {
  2.     printf("%s",cadena);
  3. }
  4.  
  5. void main() {
  6.     texto("HOLA");
  7.     while(1);
  8. }

  Ahora bien, si intento acceder al contenido individual de un carácter, por ejemplo el primero e imprimir solamente el primero lo hago así:

   
Código: C
  1. void texto(rom char *cadena) {
  2.     printf("%c",*cadena);
  3. }
  4.  
  5.  
  6.  
  7. void main() {
  8.     texto("HOLA");
  9.     while(1);
  10. }

  En el segundo código lo que sucede es que el printf saca lo que le da gana. Debería sacar una H pero saca cualquier valor cuando le estoy pidiendo que me saque el contenido de la dirección de memoria que hay cargado en “cadena”

   Sin embargo le das un %s al printf y si que saca el string completo.

  No se, me pierdo....   

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Alguien me explica por que en CCS no puedo hacer esto?
« Respuesta #4 en: 24 de Abril de 2020, 10:03:12 »
Yo sigo sin entender porque no esta funcionando el const y tenes que usar algo especial a CSS que es ROM, en fin... probaste asignarlo a una variable antes?

Como es CSS no voy a tratar de usar la logica, y te voy a dar cosas para probar:

Código: C
  1. void texto(rom char *cadena) {
  2.     var char a = *cadena;
  3.     printf("%c",a);
  4. }


Código: C
  1. void texto(rom char *cadena) {
  2.     printf("%c",cadena[0]);
  3. }

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:¿Alguien me explica por que en CCS no puedo hacer esto?
« Respuesta #5 en: 24 de Abril de 2020, 10:17:02 »
El problema está en que cuando hacés texto("HOLA") el "HOLA" está alojado en rom y no se almacena de la misma manera que cuando está en RAM.  Eso hace que los respectivos punteros no sean equivalentes.

Al compilar, CCS genera el código necesario para cada tipo de punteros, pero nadie es perfecto...

Código: [Seleccionar]
void texto(rom char *cadena) {
    char caracter=*cadena ;
    printf("%c", caracter) ;

    caracter=cadena[2] ;
    printf("%c", caracter) ;

es equivalente a lo anterior pero funciona.


« Última modificación: 24 de Abril de 2020, 10:33:43 por Eduardo2 »

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:¿Alguien me explica por que en CCS no puedo hacer esto?
« Respuesta #6 en: 24 de Abril de 2020, 12:27:12 »
El problema está en que cuando hacés texto("HOLA") el "HOLA" está alojado en rom y no se almacena de la misma manera que cuando está en RAM.  Eso hace que los respectivos punteros no sean equivalentes.

Al compilar, CCS genera el código necesario para cada tipo de punteros, pero nadie es perfecto...

Código: [Seleccionar]
void texto(rom char *cadena) {
    char caracter=*cadena ;
    printf("%c", caracter) ;

    caracter=cadena[2] ;
    printf("%c", caracter) ;

es equivalente a lo anterior pero funciona.

  Vale, entonces por lo que veo, de esta manera lo que hace CCS es crear  el argumento "cadena" como un vector y no como un puntero aunque sintácticamente se declare como un puntero.

 Dios..  Es que llevo toda la mañana liado con esto, creando punteros distintos y luego mirando directamente en la memoria de programa como lo organiza CCS para intentar aclarar lo que está pasando y claro, los punteros normales funcionan bien, pero al extraerlo del argumento como es el caso pues ni de broma.

  Muchas gracias a todos.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:¿Alguien me explica por que en CCS no puedo hacer esto?
« Respuesta #7 en: 24 de Abril de 2020, 12:39:52 »
Nada, no hay manera.

Código: C
  1. void texto(rom char *cadena) {
  2.    
  3. char caracter=*cadena ;
  4.     printf("%c", caracter) ;
  5.  
  6.     caracter=cadena[1] ;
  7.     printf("%c", caracter) ;
  8.  
  9.     caracter=cadena[2] ;
  10.     printf("%c", caracter) ;
  11.  
  12.     caracter=cadena[3] ;
  13.     printf("%c", caracter) ;

Y esto es lo que me da en la terminal: "H.% "

  Solo da el primero, los demás, ni rastro.

  Nada, creo que voy a dejar de usar CCS y ya está por que no me parece ni medio normal que no se puedan trabajar con lógica ni los punteros. Algo tan esencial.. Por favor...


Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:¿Alguien me explica por que en CCS no puedo hacer esto?
« Respuesta #8 en: 24 de Abril de 2020, 12:55:10 »
Yo ejecuto eso

 

* terminal50.jpg
(26.48 kB, 450x382 - visto 304 veces)



Lo único que hago es mentir la velocidad del micro en el Proteus  (24MHz)  porque con 8MHz la velocidad de transmision sale de 3200 bauds

No es problema de compilación, es otra cosa...  :(


Desconectado uZYNQ

  • PIC16
  • ***
  • Mensajes: 123
Re:¿Alguien me explica por que en CCS no puedo hacer esto?
« Respuesta #9 en: 24 de Abril de 2020, 13:50:31 »
yo probaria lo siguiente a ver si funciona

Código: [Seleccionar]
void texto(rom char *cadena) {

 char *caracter = (char *) cadena;
   
    printf("%c", caracter[0]) ;
 
    printf("%c", caracter[1]) ;
 
    printf("%c", caracter[2]) ;
 
    printf("%c", caracter[3]) ;

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:¿Alguien me explica por que en CCS no puedo hacer esto?
« Respuesta #10 en: 24 de Abril de 2020, 14:18:47 »
...
No es problema de compilación, es otra cosa...  :(

Me respondo, era el #USE DELAY
Debió ser  #USE DELAY (clock=8M,crystal)  o #USE DELAY (internal=8M)   o como se haya estado usando.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:¿Alguien me explica por que en CCS no puedo hacer esto?
« Respuesta #11 en: 24 de Abril de 2020, 15:43:59 »
Yo ejecuto eso

  - Tienes que ingresar para ver archivos adjuntos -  


Lo único que hago es mentir la velocidad del micro en el Proteus  (24MHz)  porque con 8MHz la velocidad de transmision sale de 3200 bauds

No es problema de compilación, es otra cosa...  :(

  Hola Eduardo. Finalmente si que ha funcionado con tu solución. No me funcionó antes por que había estado cambiando el tipo en el argumento rom char por rom int y olvidé volver a ponerlo en char.

De todas formas, en adelante para proyectos complejos que tiren de punteros y demás, creo que tiraré de XC8.

  Saludos y de nuevo gracias a todos.

 



 

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:¿Alguien me explica por que en CCS no puedo hacer esto?
« Respuesta #12 en: 24 de Abril de 2020, 16:14:22 »
....
De todas formas, en adelante para proyectos complejos que tiren de punteros y demás, creo que tiraré de XC8.
...

Es una cuestión de gustos porque dolores de cabeza vas a tener con cualquiera. Por suerte, distintos dolores.

Por ejemplo, a mi no me gusta ninguno de los IDEs y escribo el programa en UltraEdit compilando por linea de comando (mediante un .bat) y debuggeando con el Proteus.

Saludos.



 

anything