SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: Nagisa en Domingo 8 de Febrero de 2004, 19:10

Título: Modificando Una Cadena
Publicado por: Nagisa en Domingo 8 de Febrero de 2004, 19:10
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
Título: Re: Modificando Una Cadena
Publicado por: CiRRuS en Domingo 8 de Febrero de 2004, 21:46
Que devuelve la funcion funcion(*p)???

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

Nos vemos :hola:
Título: Re: Modificando Una Cadena
Publicado por: nicokiki en Lunes 9 de Febrero de 2004, 14:24
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!!!!
Título: Re: Modificando Una Cadena
Publicado por: CiRRuS en Lunes 9 de Febrero de 2004, 16:08
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:
Título: Re: Modificando Una Cadena
Publicado por: Nagisa en Martes 10 de Febrero de 2004, 22:26
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.
Título: Re: Modificando Una Cadena
Publicado por: desorden en Miércoles 11 de Febrero de 2004, 01:41
¿Cómo has inicializado la cadena?

Un saludo...
Título: Re: Modificando Una Cadena
Publicado por: ToTeX en Viernes 13 de Febrero de 2004, 04:50
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
}
Título: Re: Modificando Una Cadena
Publicado por: desorden en Viernes 13 de Febrero de 2004, 16:11
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...
Título: Re: Modificando Una Cadena
Publicado por: shephiroth en Viernes 13 de Febrero de 2004, 22:04
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
Título: Re: Modificando Una Cadena
Publicado por: ToTeX en Sábado 14 de Febrero de 2004, 00:44
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).
Título: Re: Modificando Una Cadena
Publicado por: desorden en Sábado 14 de Febrero de 2004, 03:58
ToTeX, ¿has compilado y ejecutado el código de tu mensaje? ¿modifica(k) provoca un error en tiempo de ejecución?  <_<

Un saludo...
Título: Re: Modificando Una Cadena
Publicado por: CiRRuS en Sábado 14 de Febrero de 2004, 14:29
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:
Título: Re: Modificando Una Cadena
Publicado por: ToTeX en Sábado 14 de Febrero de 2004, 16:58
Cita de: "desorden"
ToTeX, ¿has compilado y ejecutado el código de tu mensaje? ¿modifica(k) provoca un error en tiempo de ejecución?  <_<

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.