Tema destacado: Sigue las noticias más importantes de elhacker.net en twitter!
Autor
|
Tema: [C] Punteros como argumentos en funciones (Leído 1,210 veces)
|
TheMule
Desconectado
Mensajes: 284
|
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. 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
Mensajes: 133
|
Es lógico que te devuelva sólo un caracter porque has definido la funcion asi: char funcion(char*Cadena, int IntMa, int IntMe) y aqui le estas diciendo que devuelve solo un caracter (char). Tendría que ser: 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: return pSub; Saludos, espero que te sirva, yo no lo he probado...
|
|
|
|
|
En línea
|
Human knowledge belongs to the world
|
|
|
TheMule
Desconectado
Mensajes: 284
|
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 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
|
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 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 no se si lo que te refieras sea pSub 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
Mensajes: 284
|
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  PD: una pregunta: xq siempre pones tus codes en ingles?... solo curiosidad
|
|
|
|
|
En línea
|
|
|
|
|
heap
|
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
Mensajes: 284
|
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
Mensajes: 10
|
Buenas a todos, estoy leyendo este post y esta muy interesante para entender lo de punteros como argumentos, pero hay algo que no entiendo : ................ 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
Mensajes: 284
|
Buenas a todos, estoy leyendo este post y esta muy interesante para entender lo de punteros como argumentos, pero hay algo que no entiendo : ................ 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 
|
|
|
|
|
En línea
|
|
|
|
dnebla
Desconectado
Mensajes: 10
|
Me quedo claro gracias por todo,  .
|
|
|
|
|
En línea
|
|
|
|
|
|