Autor Tema: Función strstr(s1,s2)  (Leído 10005 veces)

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

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Función strstr(s1,s2)
« en: 15 de Octubre de 2010, 03:06:21 »
Hola.

Hace unos meses hice una prueba con la función strstr(S1,S2) de la libreria string.h, la cual busca al string S2 en el string S1 y guardaba la copia de S1 en otro buffer desde el punto donde coincidía S2. Por ejemplo:

S1[] = "Numero:1234+palabra"
S2[] ="1234"

BufferTotal = strstr(S1,S2);

BufferTotal = "1234+palabra"

 :( Asi era antes  :(

Ahora que vuelvo a usar la función (con la versión 4.112) no da ... me da un error:
Código: [Seleccionar]
*** Error 167 "ReceptorCtrlNewton.c" Line 54(42,43): Assignment invalid: lvalue is READ ONLY
      1 Errors,  0 Warnings.
Halting build on first failure as

Y si pongo:

*BufferTotal = strstr(S1,S2);

Me daría:

BufferTotal[0] = '1'

 :( :( :( :( :( :( :(

Para mas ... no recuerdo con que versión era que me funcionaba!!  :D :D :D

Aguno de los tesos en C que me tire una cuerda  ;-)

Saludos
El papel lo aguanta todo

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Función strstr(s1,s2)
« Respuesta #1 en: 15 de Octubre de 2010, 03:36:01 »
Hola MLO__, la funcion strstr(s1,s2) de la libreria estandar te retorna, en caso de suceso, un puntero a la primer ocurrencia de s2 en s1, no una copia.
Talvez s1 sea puntero a una cadena constante y estas tratando de modificarla considerando que se trata de una copia, por eso lo de 'lvalue is READ ONLY'.
Podrias mostrarnos la parte del codigo que te trae problemas.
@fabianjsm is on twitter

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Función strstr(s1,s2)
« Respuesta #2 en: 15 de Octubre de 2010, 09:19:38 »
Yo les dije que en CCS tienen que colocar con que versión hay que compilarlo  :? Sino pasa esto  :8} :8} :8} :D
No contesto mensajes privados, las consultas en el foro

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Función strstr(s1,s2)
« Respuesta #3 en: 15 de Octubre de 2010, 10:39:48 »
Hola.

Si Suky .... yo NUNCA puse en el código la versión del compilador  :( :( :( :(

fabianjm, el código es el siguiente:

Código: C#
  1. #include<16F628A.h>
  2. #fuses XT,PUT,NOMCLR
  3. #use delay(clock=4M)
  4. #use rs232(baud=300, xmit=pin_b2, rcv=pin_b1, bits=8, parity=N, stream=ModuloRF)
  5. #use rs232(baud=9600, xmit=pin_a0, rcv=pin_a1, bits=8, parity=N, stream=PortPC)
  6.  
  7. #zero_ram
  8. #include <string.h>
  9.  
  10. #define on              output_high
  11. #define off             output_low
  12. #define LED             pin_a3
  13.  
  14. //Constantes
  15. const int8 SizeBufer = 16;
  16.  
  17. struct BytesSerial
  18. {
  19.         int8 ContBufer;
  20.         char Bufer[SizeBufer];
  21.         char DatoRx;
  22.         int1 CmdProcesado;
  23. }RF;
  24.  
  25. char ComandoRF[7]="DatoOK";
  26. char Identificador[4]="OK.";
  27. char BuferData[16];
  28.  
  29. void RF_Process(char DatoRF);
  30.  
  31. #int_RDA
  32. void Serial_isr(void)
  33. {
  34.         RF.DatoRx=0;
  35.         if(kbhit(ModuloRF))
  36.         {
  37.                 RF.DatoRx=getc(ModuloRF);
  38.                 RF_Process(RF.DatoRx);
  39.         }
  40. }
  41.  
  42. void main(void)
  43. {
  44.         setup_comparator(NC_NC_NC_NC);
  45.         enable_interrupts(INT_RDA);
  46.         enable_interrupts(GLOBAL);
  47.  
  48.         while(true)
  49.         {
  50.                 if(RF.CmdProcesado)
  51.                 {
  52.                         if(!strncmp(ComandoRF,RF.Bufer,6))
  53.                         {
  54.                                 *BuferData = strstr(RF.Bufer,Identificador);
  55.                                 fprintf(PortPC,"%s",RF.Bufer);
  56.                         }
  57.                         memset(&RF,0,sizeof(RF));
  58.                 }
  59.         }
  60. }
  61.  
  62. void RF_Process(char DatoRF)
  63. {
  64.         if(!RF.CmdProcesado)
  65.         {
  66.                 if(RF.ContBufer>=SizeBufer)
  67.                         RF.ContBufer=0;
  68.                 RF.Bufer[RF.ContBufer++]=DatoRF;
  69.                 switch(DatoRF)
  70.                 {
  71.                         case 'c' :
  72.                                 memset(&RF,0,sizeof(RF));
  73.                                 break;
  74.  
  75.                         case '!' :
  76.                                 RF.CmdProcesado=1;
  77.                                 RF.ContBufer=0;
  78.                                 break;
  79.                 }
  80.         }
  81. }

Por la interrupción RDA llegan los datos de la forma DatoOK.40,1!.

Como dije en el post ... antes, al usar esa función e igualandola a un Buffer (BufferData[]), me copiaba la parte del string a partir del caracter en el que coincidia.

Saludos
El papel lo aguanta todo

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Función strstr(s1,s2)
« Respuesta #4 en: 15 de Octubre de 2010, 12:29:49 »
Hola.

Buscando la función strstr():



Entonces ... si estaba funcionando bien antes  :cry:
El papel lo aguanta todo

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Función strstr(s1,s2)
« Respuesta #5 en: 15 de Octubre de 2010, 13:18:18 »
Podrias provar de cambiar la definicion 'char BuferData[16];' de la linea 27 por 'char *BuferData',
y en la línea 54 '*BuferData = strstr(RF.Bufer,Identificador);' quitar el asterisco.
Los dos cambios y veremos que pasa...
No tengo CCS en este momento  :(
@fabianjsm is on twitter

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Función strstr(s1,s2)
« Respuesta #6 en: 15 de Octubre de 2010, 13:45:12 »
Hola.

Solucionado  ;-) modifiqué la función que trae el CCS por esta:

Código: C#
  1. char * strstr(char *str1, char *str2)
  2. {
  3.    char *cp=(char*)str1;
  4.    char *s1, *s2;
  5.  
  6.  
  7.    if (!*str2)
  8.          return((char*)str1);
  9.  
  10.    while (*cp)
  11.    {
  12.         s1 = cp;
  13.         s2 = (char*)str2;
  14.         while(*s1 && *s2 && !(*s1 - *s2)
  15.         {
  16.            s1++;
  17.            s2++;
  18.         }
  19.       if(!*s2)
  20.           return(cp);
  21.  
  22.         cp++;
  23.    }
  24.    return 0;
  25. }

Ahora si:



Saludos

El papel lo aguanta todo

Desconectado carlos.r.89

  • PIC10
  • *
  • Mensajes: 4
Re: Función strstr(s1,s2)
« Respuesta #7 en: 02 de Marzo de 2014, 01:46:49 »
DISCULPEN AMIGOS, PERO COMO SE SOLUCIONO SIEMPRE ESTE PROBLEMA

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Función strstr(s1,s2)
« Respuesta #8 en: 06 de Marzo de 2014, 16:10:51 »
Hola

Cambie la libreria. El codigo de la nueva libreria es la que esta posteada.

Saludos
El papel lo aguanta todo

Desconectado mosesito

  • PIC10
  • *
  • Mensajes: 5
Re: Función strstr(s1,s2)
« Respuesta #9 en: 03 de Septiembre de 2015, 21:08:23 »
Yo les dije que en CCS tienen que colocar con que versión hay que compilarlo  :? Sino pasa esto  :8} :8} :8} :D

hola amigo suky estoy tratando de usar la funcion strstr en c18 y me sale error estoy usando mplab 8.92
puts1USART(strstr(&cadena1[0],&cadena2[0]));
while(Busy2USART());

me podrias mandar un ejemplo la verdad nc como utilizarlo he leido el concepto pero me sale error al compilar

saludos desde Lima

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Función strstr(s1,s2)
« Respuesta #10 en: 03 de Septiembre de 2015, 21:17:05 »
Si pones cual es el error que te va a ser mas facil identificarlo al problema

Desconectado mosesito

  • PIC10
  • *
  • Mensajes: 5
Re: Función strstr(s1,s2)
« Respuesta #11 en: 03 de Septiembre de 2015, 21:30:34 »
Si pones cual es el error que te va a ser mas facil identificarlo al problema

hola amigo me podrias ayudar con un ejemplo de strstr en c18 te agradeceria

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Función strstr(s1,s2)
« Respuesta #12 en: 04 de Septiembre de 2015, 01:45:56 »
c18 no se que soporte posee con las funciones de C, y si no das el error que tenes es imposible tratar de arreglar algo que no se sabe que anda mal.

Desconectado linoCervantes

  • PIC10
  • *
  • Mensajes: 1
Re:Función strstr(s1,s2)
« Respuesta #13 en: 02 de Febrero de 2016, 12:15:53 »
Hola!!!

Me registre para poder responder, ya que no recordaba como resolver este problema.

Resulta que los lenguajes de programacion modernos nos han acostumbrado a no adminisrtar la memoria pues ellos se encargan de esto. Ademas la conversion dinamica de tipos o la invocación a objetos para que se elaboren estas, nos han librado tambien del "casting".

Total, el error LVALUE READ ONLY especifica que existe un problema en la asignacion, por lo que lo mas recomendable es utilizar memoria dinamica. En mi caso, el codigo:.

unsigned char HID_InData[USB_CONFIG_hid_rx_size];
unsigned char datos[USB_CONFIG_hid_rx_size];
unsigned char direccion, masDatos;
int cantidadDatos;

usb_get_packet(1, HID_InData, USB_CONFIG_HID_RX_SIZE);
    int i=0;
    direccion = HID_InData[0];
    masDatos = HID_InData[1];
    for(i=2; i<USB_CONFIG_HID_RX_SIZE; i++){
        if(HID_InData != 0){
            datos = HID_InData;           
        }
        else{
         break;
        }
     }
    cantidadDatos = i-2;

Marca el señalado error LVALUE READ ONLY.

La solucion es cambiar la definicion de datos como apuntador:

  include <stdlibm.h> //Para ccs 5.08

    unsigned char *datos;

   asignar memoria de forma dinamica con malloc

    datos = (unsigned char)malloc(sizeof(char)*USB_CONFIG_HID_RX_SIZE);

   y al final liberar la memoria con free

   free(datos)

Se que probablemente esta respuesta llego muy tarde, pero espero les sea util a personas que como en mi caso, al no recordar una solución buscamos en foros y regularmente alguien nos auxilia.

Saludos!!!