Paso por referencia de una cadena de caracteres

#1
Hola estimados.
Tengo un código realizado en CCS Compiler y simulado en Isis Proteus, el cual busca pasar una cadena de caracteres de una función (paso_car) a otra (main), pero al momento de ejecutarlo en Proteus no se consigue el objetivo, siendo éste último, obtener la cadena "E0" de la función paso_car y mostrarlo en el LCD, mediante la función main. Tan solo logro obtener y mostrar el caracter "E" sin el "0".
Adjunto el código.
De antemano, muchas gracias.
C:
#include <16F877A.h>
#use delay(clock = 20MHz)
#fuses XT,NOWDT,PUT,NOPROTECT,NOLVP,NOWDT,NOBROWNOUT

#define use_portb_lcd true
#include <lcd.c>

#BYTE TRISA = 0x85
#BYTE PA = 0x05
#BYTE PC = 0x07
#BYTE PD = 0x08

void paso_car (char *et[3])
{
*et = "E0";
}

//Función principal
void main()
{
char et[3];
lcd_init();

while(true)
     {       
      lcd_gotoxy(1,1);
      printf(lcd_putc, "cadena=%s",et);   
      delay_ms(50);

      if (input(PIN_D0) == 1)
         {
          delay_ms(200);
          paso_car(&et);
          lcd_putc('\f');
         }
   }
}
 
Última edición por un moderador:

Dr. Zoidberg

Well-known-Papá Pitufo
#2
El paso de cadenas (arreglos) a funciones SIEMPRE es por referencia en C. Los strings tampoco se asignan asi nomas sino que hay funciones para hacerlo (pista: strcpy).
Mejor andá sacando el desparramo de punteros que has hecho y lee un libro sobre el lenguaje C por que te falta bastante know-how al respecto.
 
#4
mmm fijense que cuando uno hace uso de las funciones String en C en un microcontrolador de memoria reducida lo mejor es hacer una copia de caracteres letra a letra asi uno ahorra unos cuantos bytes cuando no queremos agotar la reducida memoria del micro.

lo mejor seria hacer uso de strcpy usando la libreria string.h en CCS esta por defecto strcpy asi que pues uno puede hacer uso del copiado y pegado en otra cadena.

pero si quieres copiar letra a letra lo que debes hacer es un barrido en el array o apuntador copias letra y metes en el string

ejemplo:

char cadena1[10]="letras";
char cadena2[0];

int i=0;

while(cadena1 [ i ] != '\0' ) //cuando llegamos a caracter nulo dejamos de copiar
{
cadena2 [ i ] = cadena1 [ i ] ;
i++;
}


asi de simple se copia una cadena a otra ahora con algo de creatividad piedes voltear el string
 
#5
El error está en la declaración de la función:
C:
void paso_car (char *et[3])
El problema está en la parte del '[3]'. En esa línea estás indicando que et no está apuntando a un espacio para guardar una cadena de caracteres, sino solamente un carácter. Por eso solo guarda un carácter.
Lo debes cambiar por
C:
void paso_car (char *et)
y a continuación hacer un strcpy() o strncpy() desde la cadena que quieres copiar al espacio reservado en et.

Otra opción es definir et como un puntero a cadena de caracteres. Entonces sí que puedes simplificar algo el programa, e incluso irá más rápido ya que no tendrás que copiar ningún carácter:
C:
void paso_car (char *cadena) {
    cadena = "segunda cadena";
}

//Función principal
void main() {
    char *cadena = "primera cadena";

    lcd_init();

    while(true) {     
      lcd_gotoxy(1,1);
      printf(lcd_putc, "cadena=%s",et); 
      delay_ms(50);

      if (input(PIN_D0) == 1) {
          delay_ms(200);

          paso_car(cadena);
          lcd_putc('\f');
      }
   }
}
 
Última edición:
#6
Hola. Hay un error en mi código, y el foro ya no me deja reeditar el mensaje, así que lo pongo aquí corregido:
C:
void paso_car (char **et) {
    *et = "segunda cadena";
}

//Función principal
void main() {
    char *et = "primera cadena";

    lcd_init();

    while(true) {    
      lcd_gotoxy(1,1);
      printf(lcd_putc, "cadena=%s",et);
      delay_ms(50);

      if (input(PIN_D0) == 1) {
          delay_ms(200);

          paso_car(&et);
          lcd_putc('\f');
      }
   }
}
 

Arriba