• Jueves 14 de Noviembre de 2024, 08:15

Autor Tema:  Modificando Una Cadena  (Leído 2733 veces)

Nagisa

  • Miembro MUY activo
  • ***
  • Mensajes: 119
  • Nacionalidad: es
    • Ver Perfil
Modificando Una Cadena
« en: Domingo 8 de Febrero de 2004, 19:10 »
0
Hola. Tengo el siguiente codigo que te recorre una cadena y va modificando sus caracteres segun una funcion de ellos mismos. Esta funcion viene definida por

char funcion(char);

Para hacer esto he intentado lo siguiente:

void modifica(char* p){
  while(*p != '\0'){
    *p = funcion(*p);
    p++;
  }
}

Esto me compila y me hace todo bien, pero me da un error en tiempo de ejecucion. He conseguido aislar el error, pero no se solucionarlo. El error en concreto esta en la asignacion *p= ...

Pues eso. Por que falla y como se soluciona?? Muchas gracias
   

CiRRuS

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
    • http://zirrus.es
Re: Modificando Una Cadena
« Respuesta #1 en: Domingo 8 de Febrero de 2004, 21:46 »
0
Que devuelve la funcion funcion(*p)???

Debería devolver un tipo char, no un puntero a char, es asi??.

Nos vemos :hola:
Core Dumped
zirrus.es

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Modificando Una Cadena
« Respuesta #2 en: Lunes 9 de Febrero de 2004, 14:24 »
0
Cirrus: *p apunta a una posicion de la cadena, esto es si la cadena es: "hola", *p apunta a "h", *(p+1) apunta a "o" y asi sucesivamente, por lo que no entiendo que es lo que hace mal la funcion de Nagisa.
En teoria creo q esta bien

Salu2!!!!

CiRRuS

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
    • http://zirrus.es
Re: Modificando Una Cadena
« Respuesta #3 en: Lunes 9 de Febrero de 2004, 16:08 »
0
Citar
una funcion de ellos mismos. Esta funcion viene definida por

char funcion(char);

Vaya, se me olvido esto... mmm, todo correcto, la función debe devolver un tipo char. Es cierto, creo que el código es correcto, no veo ningun problema a primera vista.

Vaya, lo siento por la anterior corrección  :( , se me había pasado eso. Bueno, pa eso estamos todos, pa seguir aprendiendo  :) ...

Nos vemos :hola:
Core Dumped
zirrus.es

Nagisa

  • Miembro MUY activo
  • ***
  • Mensajes: 119
  • Nacionalidad: es
    • Ver Perfil
Re: Modificando Una Cadena
« Respuesta #4 en: Martes 10 de Febrero de 2004, 22:26 »
0
A mi tb me parece que todo funciona. Como os digo, el error es en tiempo de EJECUCION.

Lo compilo con el gcc, y lo ejecuto bajo Windows 95. No creo que sea por eso, aunque lo probare con otro SO (con el XP) y ya os contare.
   

desorden

  • Miembro activo
  • **
  • Mensajes: 57
    • Ver Perfil
Re: Modificando Una Cadena
« Respuesta #5 en: Miércoles 11 de Febrero de 2004, 01:41 »
0
¿Cómo has inicializado la cadena?

Un saludo...
desorden

ToTeX

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
    • http://www.totex.cl
Re: Modificando Una Cadena
« Respuesta #6 en: Viernes 13 de Febrero de 2004, 04:50 »
0
En mi opinion la funcion esta correcta, la unica forma de generar un error en tiempo de ejecucion es pasarle un puntero no inicializado a la funcion modica.


#include <iostream>

using std::cout;
using std::endl;

char funcion(char c)
{
   return c+1;
}

void modifica(char* p)
{
   while(*p)
   {
      *p=funcion(*p);
      p++;
   }
}

int main()
{
   char* k,h[]="hola";
   cout<<h<<endl; //imprime 'hola'
   modifica(h);
   cout<<h<<endl; //imprime 'ipmb'
   modifica(k); //Error! k no es un puntero inicializado
}
Salu2... ToTeX
[ www.totex.cl ]

desorden

  • Miembro activo
  • **
  • Mensajes: 57
    • Ver Perfil
Re: Modificando Una Cadena
« Respuesta #7 en: Viernes 13 de Febrero de 2004, 16:11 »
0
Cita de: "ToTeX"
   modifica(k); //Error! k no es un puntero inicializado
Es un error porque no sabes que zona de memoria estás modificando, pero no provoca un error en ejecución.

Yo creo que el problema se encuentra en como se ha inicializado el puntero.
Código: Text
  1.  
  2. #include &#60;stdio.h&#62;
  3.  
  4. int main(void)
  5. {
  6.    char cadena[] = &#34;hola&#34;;
  7.    char *puntero;
  8.  
  9.    puntero = cadena;
  10.    printf(&#34;%c&#34;, *puntero);
  11.    (*puntero)++;
  12.    printf(&#34;%c&#34;, *puntero);
  13.    return 0;
  14. }
  15.  
  16.  
En cambio:
Código: Text
  1.  
  2. #include &#60;stdio.h&#62;
  3.  
  4. int main(void)
  5. {
  6.    char *puntero = &#34;hola&#34;;
  7.  
  8.    printf(&#34;%c&#34;, *puntero);
  9.    (*puntero)++;
  10.    printf(&#34;%c&#34;, *puntero);
  11.    return 0;
  12. }
  13.  
  14.  
Provoca el error. En este ejemplo, puntero apunta a una zona de memoria de solo lectura.

Un saludo...
desorden

shephiroth

  • Miembro activo
  • **
  • Mensajes: 30
    • Ver Perfil
Re: Modificando Una Cadena
« Respuesta #8 en: Viernes 13 de Febrero de 2004, 22:04 »
0
buenas. El problema es lógico que lo de en ejecucion, puesto que el puntero lo estas moviendo. Intenta ejecutar cambiando el modo en que recorres la cadena, me refiero

void modifica(char* p)
{
int x=0;
while(*(p+x)!='\0')
{
*(p+x)=funcion(*(p+x));
x++;
}
}


Asi te debería de funcionar, puesto que a la hora de volver al principal el puntero no lo has modificado, simplemente el contenido.

Suerte ^_^

P.D: Puedes utilizar p
  • en vez de *(p+x)

ToTeX

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
    • http://www.totex.cl
Re: Modificando Una Cadena
« Respuesta #9 en: Sábado 14 de Febrero de 2004, 00:44 »
0
Cita de: "desorden"
Cita de: "ToTeX"
   modifica(k); //Error! k no es un puntero inicializado

Es un error porque no sabes que zona de memoria estás modificando, pero no provoca un error en ejecución.

Yo creo que el problema se encuentra en como se ha inicializado el puntero.
 
desorden no concuerdo contigo y no creo estar equivocado, segun entiendo hay errores en tiempo de compilacion(el codigo no se logra compilar por errores de sintaxis) y errores en tiempo de ejecucion, generalmente errores semanticos o logicos que provocan la finalizacion anormal del programa. El programa expuesto es sintacticamente correcto, compila bien, el problema ocurre solo cuando se le pasa un puntero que no esta incializado, o sea apunta a una zona de memoria desconocida como dices tu, pero eso es un error en tiempo de ejecucion.

shephiroth tampoco concuerdo contigo, creo que estas equivocado. Tu dices que perder el inicio del puntero en el ambito de la funcion void modifica(char* p) es el error, porque se modifica el puntero; ese es un grueso error porque el puntero se pasa por valor por lo tanto NO SE PUEDE MODIFICAR, el puntero con que se trabaja en el ambito de la funcion modifica es solo una copia del verdadero puntero,lo que se puede modificar es "lo que apunta el puntero", pero no el valor del puntero, por lo tanto no tiene sentido recorrer de esa forma que propones el arreglo.

Creo que ya concordamos todos en que el error se da cuando el puntero que pasa a la funcion no esta inicializado o apunta a una zona de memoria no modificable(como dijo desorden).
Salu2... ToTeX
[ www.totex.cl ]

desorden

  • Miembro activo
  • **
  • Mensajes: 57
    • Ver Perfil
Re: Modificando Una Cadena
« Respuesta #10 en: Sábado 14 de Febrero de 2004, 03:58 »
0
ToTeX, ¿has compilado y ejecutado el código de tu mensaje? ¿modifica(k) provoca un error en tiempo de ejecución?  &lt;_&lt;

Un saludo...
desorden

CiRRuS

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
    • http://zirrus.es
Re: Modificando Una Cadena
« Respuesta #11 en: Sábado 14 de Febrero de 2004, 14:29 »
0
Estoy de acuerdo con desorden, el problema debe ser que el puntero no esta inicializado, y accedemos a zonas de memoria de solo lecturas (vamos un segmentation fault de los guapos ;)).

Al menos desde mi punto de vista, si a modifica(char *p) le pasas un puntero a char "mal" inicializado, es decir, que no apunta a ninguna cadena por ejemplo, vas a acabar en zonas de memoria que no son tuyas.

Nos vemos :hola:
Core Dumped
zirrus.es

ToTeX

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
    • http://www.totex.cl
Re: Modificando Una Cadena
« Respuesta #12 en: Sábado 14 de Febrero de 2004, 16:58 »
0
Cita de: "desorden"
ToTeX, ¿has compilado y ejecutado el código de tu mensaje? ¿modifica(k) provoca un error en tiempo de ejecución?  &lt;_&lt;

Un saludo...
ah por supuesto que compile y ejecute el programa, si no no habria opinado  :P

La linea 'modifica(k)' del ejemplo que di da solo un warning al compilar 'warning C4700: local variable 'k' used without having been initialized', pero nada mas, el programa cae al ejecutarse.
Salu2... ToTeX
[ www.totex.cl ]