elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 00:43  


Tema destacado: Sigue las noticias más importantes de elhacker.net en ttwitter!

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  [C] Punteros como argumentos en funciones
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Punteros como argumentos en funciones  (Leído 1,210 veces)
TheMule

Desconectado Desconectado

Mensajes: 284



Ver Perfil
[C] Punteros como argumentos en funciones
« en: 14 Noviembre 2005, 15:22 »

Bueno estoy empezando con los punteros como argumentos.... en este ejercicio tengo que hacer una funcion que devuelva en un puntero una subcadena a partir de una cadena antes ingresada y un intervalo
ejemplo:
cadena: "Hola me llamo xXStrIdeRXx"
intervalo: 7; 17
subcadena: "e llamo xXS"
esta es mi funcion y compila perfectamente pero me devuelve un unico caracter, que se encuentra dentro del intervalo pero no es la cubcadena completa.

Código:
char funcion(char*Cadena, int IntMa, int IntMe)
{
      int x;
      char pSub[(IntMa-IntMe)+1];
      for (x=0; x<=((IntMa-IntMe)+1), IntMe<=IntMa; x++, IntMe++)
          {
           pSub[x]=*(Cadena+IntMe);
           }
      return *pSub;
}

Espero que me puedan ayudar. Gracias ::)


En línea
orphen_nb

Desconectado Desconectado

Mensajes: 133


Ver Perfil
Re: [C] Punteros como argumentos en funciones
« Respuesta #1 en: 14 Noviembre 2005, 15:35 »

Es lógico que te devuelva sólo un caracter porque has definido la funcion asi:
Código:
char funcion(char*Cadena, int IntMa, int IntMe)
y aqui le estas diciendo que devuelve solo un caracter (char). Tendría que ser:
Código:
char* funcion(char*Cadena, int IntMa, int IntMe)
Además, en la línea de return estás devolviendo lo que está en la dirección de memoria donde apunta el puntero, es decir, estás devolviendo sólo un caracter (si no lo entiendes lee más sobre punteros). Para devolver el punter tendría que ser:
Código:
return pSub;

Saludos, espero que te sirva, yo no lo he probado...


En línea

Human knowledge belongs to the world
TheMule

Desconectado Desconectado

Mensajes: 284



Ver Perfil
Re: [C] Punteros como argumentos en funciones
« Respuesta #2 en: 14 Noviembre 2005, 15:50 »

Código:
char* funcion(char*Cadena, int IntMa, int IntMe)
{
      int x;
      char pSub[(IntMa-IntMe)+1];
      for (x=0; x<=((IntMa-IntMe)+1), IntMe<=IntMa; x++, IntMe++)
          {
           pSub[x]=*(Cadena+IntMe);
           }
      return pSub;
}

ahora esta asi... y me salen estos errores

Código:
19 invalid conversion from 'char*' to 'char'
41 [warning] adress of local variable pSub returned

....es mas, eso ya lo habia probado sino me ekivoco :( igual gracias por tu ayuda man
En línea
heap

Desconectado Desconectado

Mensajes: 272



Ver Perfil WWW
Re: [C] Punteros como argumentos en funciones
« Respuesta #3 en: 14 Noviembre 2005, 19:14 »

Código:
char* funcion(char*Cadena, int IntMa, int IntMe)
{
 int x;
 char pSub[(IntMa-IntMe)+1];
 for (x=0; x<=((IntMa-IntMe)+1), IntMe<=IntMa; x++, IntMe++)
 {
 pSub[x]=*(Cadena+IntMe);
 }
 return pSub;
}

ahora esta asi... y me salen estos errores

Código:
19 invalid conversion from 'char*' to 'char'
41 [warning] adress of local variable pSub returned

....es mas, eso ya lo habia probado sino me ekivoco :( igual gracias por tu ayuda man

Sobre el invalid cast, tiene que ver con
           pSub
  • =*(Cadena+IntMe);
no se si lo que te refieras sea pSub
  • = cadena[intMe]; ?

Lo segundo es el warning que devuelves un puntero a una variable local que esta en el stack, por lo tanto una vez la funcion retorne, no podras acceder es esta cadena, pues es local a la funcion, y como no es statica tambien sera destruida, por tanto esto no te funcionara. Una solution es usar malloc para pSub, ya que la memoria que usa malloc esta en el heap y es accesible por cualquier funcion. Ademas de eso, tenias mal el calculo del size

//El primer char es 1, start es donde empieza la nueva cadena.
//end es donde termina.
//Asume the str tiene al menos end - 1 caracteres.
//quien llama a la funcion debe retornar la memoria a el SO,, es //es decir free(ptr);
char* tokenize(char* str, int start, int end)
{
      int pos = 0;
      char *token = malloc((end - start) + 2 * sizeof(char));
      //plus 2 becouse of the '\0' null terminator
       if(!token){
         return NULL;
       }
   //substract 1 from start to make it start from the "7" char               //counting from 1, and go up to the end
      for (--start; start < end;start ++);
          {
           token[pos++] = str[start];
           }
      token[pos] = '\0'; /NULL TERMINATE STRING   VERYMPORTANT!
      return token;
}
En línea

TheMule

Desconectado Desconectado

Mensajes: 284



Ver Perfil
Re: [C] Punteros como argumentos en funciones
« Respuesta #4 en: 14 Noviembre 2005, 21:58 »

muchas gracias, como siempre el señor Heap ayudando a todos con sus codigos impecables :)

Al revisar tu funcion y modificar la mia todavia no me compilaba... y me di cuenta que malloc() devuelve void y me faltaba ponerle (char*) al principio...y si eso no es necesario talvez el Dev-c++ esta mal xq me salia ese error ;D

PD: una pregunta: xq siempre pones tus codes en ingles?... solo curiosidad
En línea
heap

Desconectado Desconectado

Mensajes: 272



Ver Perfil WWW
Re: [C] Punteros como argumentos en funciones
« Respuesta #5 en: 15 Noviembre 2005, 01:45 »

Hm yo no castee malloc de aposta. Malloc esta definido en stdlib.h y debe retornar un void * por tanto en C no hay necesidad de castearlo, no debe dar ningun warning, ni error, y no se debe castear.
POR FAVOR NO CASTEEN MALLOC !!!!!!!!!!
Razon: Si casteas malloc y olvidas incluir stdlib.h el codigo compilara prefectamente y no dara ningun warning, pero en una arquitectura donde sizeof(char *) != sizeof(int) vas a tener problemas, porque el compilador va aver que malloc retorna un int, y le fuerzas el casting a char * o otro, y vas a tener un bug serio.

Pongo mis codigos en ingles porque es apropiado escribir codigo en ingles y es una costumbre buena. Yo escribo mi codigo pensando en que alguien mas lo modificara/leera contrario a lo que muchos hacen. Siempre comento y escribo todo en orden, y en ingles porque C esta en ingles y porque es un estandar casi. Imaginate que cada programador pusiera sus comentarios/variables en su idioma, seria un gran problema y de hecho me ha tocado leer codigos de gente sueca/alemana donde entender las cosas es muy dificil, y mas recordar los nombres de las variables.
En línea

TheMule

Desconectado Desconectado

Mensajes: 284



Ver Perfil
Re: [C] Punteros como argumentos en funciones
« Respuesta #6 en: 15 Noviembre 2005, 02:33 »

Hm yo no castee malloc de aposta. Malloc esta definido en stdlib.h y debe retornar un void * por tanto en C no hay necesidad de castearlo, no debe dar ningun warning, ni error, y no se debe castear.
POR FAVOR NO CASTEEN MALLOC !!!!!!!!!!
Razon: Si casteas malloc y olvidas incluir stdlib.h el codigo compilara prefectamente y no dara ningun warning, pero en una arquitectura donde sizeof(char *) != sizeof(int) vas a tener problemas, porque el compilador va aver que malloc retorna un int, y le fuerzas el casting a char * o otro, y vas a tener un bug serio.

Pongo mis codigos en ingles porque es apropiado escribir codigo en ingles y es una costumbre buena. Yo escribo mi codigo pensando en que alguien mas lo modificara/leera contrario a lo que muchos hacen. Siempre comento y escribo todo en orden, y en ingles porque C esta en ingles y porque es un estandar casi. Imaginate que cada programador pusiera sus comentarios/variables en su idioma, seria un gran problema y de hecho me ha tocado leer codigos de gente sueca/alemana donde entender las cosas es muy dificil, y mas recordar los nombres de las variables.


jajaja, bueno si, tienes razon al decir que el ingles es casi un estandar no solo en C sino en casi todo lo que respecta a la informatica.
Bueno, ya lo he dicho antes y lo digo de nuevo: eres un capo man ojala algun dia codee como tu ;)
En línea
dnebla

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: [C] Punteros como argumentos en funciones
« Respuesta #7 en: 20 Noviembre 2005, 17:26 »


 Buenas a todos, estoy leyendo este post y esta muy interesante
 para entender lo de punteros como argumentos, pero hay algo
 que no entiendo :
Código:
       ................
       char *token = malloc((end - start) + 2 * sizeof(char));
      //plus 2 becouse of the '\0' null terminator
       ...................

Porque separa dos bytes mas para el terminador de cadena
si el terminador de cadena solo ocupa un byte?, bueno espero
me puedan responder a esa duda, gracias por la respuesta de
antemano .
En línea
TheMule

Desconectado Desconectado

Mensajes: 284



Ver Perfil
Re: [C] Punteros como argumentos en funciones
« Respuesta #8 en: 20 Noviembre 2005, 21:36 »


 Buenas a todos, estoy leyendo este post y esta muy interesante
 para entender lo de punteros como argumentos, pero hay algo
 que no entiendo :
Código:
       ................
       char *token = malloc((end - start) + 2 * sizeof(char));
      //plus 2 becouse of the '\0' null terminator
       ...................

Porque separa dos bytes mas para el terminador de cadena
si el terminador de cadena solo ocupa un byte?, bueno espero
me puedan responder a esa duda, gracias por la respuesta de
antemano .



si la cadena es:  S t r  I d  e R
las posiciones:   0 1 2 3 4 5  6
digamos que me piden la subcadena 3-6, para el usuarios no se cuenta desde cero sino desde 1 que lo estaria viendo asi:
cadena:     S  t r I  d e R
posiciones: 1 2 3 4 5 6 7
lo que kiere:     r I d e
kiere 4 caracteres, mas el nulo del final serian 5 (rIde\0). Luego, para calcularlo tengo que hacer el numero mayor menos el menor de la subcadena que me ha pedido:
6 - 3 = 3, y como la subcadena pedida tiene 5 caracteres, se le suma 2  ;)

PD: soy malisimo explicando asi que si kieres, lo puedo redactar mejor mas tarde  ;D
En línea
dnebla

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: [C] Punteros como argumentos en funciones
« Respuesta #9 en: 21 Noviembre 2005, 15:46 »


 Me quedo claro gracias por todo,  :P .
En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[SOLUCIONADO] Problema con punteros como argumentos.
Programación C/C++
APOKLIPTICO 1 821 Último mensaje 21 Diciembre 2010, 03:53
por pucheto
Funciones con número arbitrario de argumentos [PHP]
PHP
madpitbull_99 3 1,183 Último mensaje 6 Marzo 2011, 22:31
por JungleBoogie
ver argumentos de funciones codeblocks
Programación C/C++
_niu 2 587 Último mensaje 15 Diciembre 2011, 21:57
por _niu
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines