elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pasar vector de puntero a char a las funciones[C]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Pasar vector de puntero a char a las funciones[C]  (Leído 11,106 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Pasar vector de puntero a char a las funciones[C]
« en: 20 Junio 2016, 16:14 pm »

Hola.
Tengo una duda que deseo evacuarla ahora porque me impide seguir estudiando y es: como se pasan los vectores de punteros a las funciones.

Código
  1. void ingreso( char *ptrFrases );
Código
  1. void ingreso( char ptrFrases[] );
Código
  1. int main( void ){
  2. char *ptrFrases = NULL;
  3.  
  4. ingreso( ptrFrases );
  5. ordenar( ptrFrases );
  6. mostrar( ptrFrases );
  7.  
  8. return 0;
  9. }
  10.  
Dejo el programa por si les hace falta para interpretar mejor la duda, luego tengo que continuar consultándolos porque la siguiente linea sé que estoy haciendo todo mal pero es la primera vez que lo intento y realmente no logro solucionarlo, hacer lo mismo con números me funciona a la perfección, en cambio, con cadenas no. -

Código
  1. tmp = (char*)realloc( ptrFrases+i, CARACTERES * sizeof(char) );
  2. if( tmp!=NULL ){
  3. strcpy( ptrFrases[i-1], tmp );
  4. }
  5.  

Código
  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. #define CARACTERES 21
  6. #define safeFree(p) saferFree((void**)&(p))
  7.  
  8. void ingreso( char *ptrFrases );
  9. void vaciarBuffer( char tmp[] );
  10. void ordenar( char *ptrFrases );
  11. void mostrar( char *ptrFrases );
  12. void saferFree( void **pp );
  13.  
  14. int main( void ){
  15. char *ptrFrases = NULL;
  16.  
  17. ingreso( ptrFrases );
  18. ordenar( ptrFrases );
  19. mostrar( ptrFrases );
  20.  
  21. return 0;
  22. }
  23.  
  24.  
  25. void ingreso( char *ptrFrases ){
  26. int i = 0, ok, opc;
  27. char tmp[CARACTERES], ch;
  28.  
  29. while( 1 ){
  30. printf( "\n Ingrese una palabra(maximo %d caracteres).....:", CARACTERES-1 );
  31. fgets( tmp, CARACTERES, stdin );
  32. vaciarBuffer( tmp );
  33.  
  34. do{
  35. printf( "\n 1 - Ingresa otra frase\n 0 - Finalisa\n Ingrese opcion...: " );
  36. ok = scanf( "%d", &opc ) == 1 && opc >= 0 && opc <=1;
  37. while ((ch = getchar()) != EOF && ch != '\n');
  38. }while( !ok );
  39. if( opc == 0){
  40. break;
  41. }
  42. i++;
  43. tmp = (char*)realloc( ptrFrases+i, CARACTERES * sizeof(char) );
  44. if( tmp!=NULL ){
  45. strcpy( ptrFrases[i-1], tmp );
  46. }
  47. else{
  48. safeFree( ptrFrases );
  49. puts( "Error (re)allocating memory" );
  50. exit(1);
  51. }
  52. }
  53.  
  54. }
  55.  
  56. void vaciarBuffer( char tmp[] ){
  57. char *p = NULL;
  58. size_t ch;
  59.  
  60. if((p=strchr(tmp, '\n'))){
  61. *p='\0';
  62. }
  63. else{
  64. while((ch = getchar()) !='\n' && ch!=EOF);
  65. }
  66. }
  67.  
  68. void saferFree(void **pp) {
  69. if (pp != NULL && *pp != NULL) {
  70. free(*pp);
  71. *pp = NULL;
  72. }
  73. }
  74.  
  75. void ordenar( char *ptrFrases ){
  76. printf( "\n No desarrollado" );
  77. }
  78. void mostrar( char *ptrFrases ){
  79. printf( "\n No desarrollado" );
  80. }
  81.  
Saludos y gracias. -


En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Pasar vector de puntero a char a las funciones[C]
« Respuesta #1 en: 20 Junio 2016, 16:29 pm »

tmp es un vector de caractes:

Código
  1. char tmp[CARACTERES]

No puedes posteriormente tratar de reasignarle memoria.

Código
  1. tmp = (char*)realloc( ptrFrases+i, CARACTERES * sizeof(char) );

Si quieres usarlo asi tienes que declararlo como apuntador desde el principio.

Código
  1. char *tmp = malloc(CARACTERE);


No entiendo cual es exactamente tu duda.

si es sobre el strcpy, el primer parametro es el destino de la copia y el segundo es el origen.

http://www.cplusplus.com/reference/cstring/strcpy/

Adicional a eso hice un video el dia de ayer sobre cadenas precisamente toco el tema de copiar cadenas de un buffer a otro.



Saludos.


« Última modificación: 20 Junio 2016, 16:36 pm por AlbertoBSD » En línea

geeke

Desconectado Desconectado

Mensajes: 93


Ver Perfil
Re: Pasar vector de puntero a char a las funciones[C]
« Respuesta #2 en: 20 Junio 2016, 17:10 pm »

como se pasan los vectores de punteros a las funciones.

Con

Código
  1. void f(char** array_ptr);

O

Código
  1. void f(char* array_ptr[]);
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Pasar vector de puntero a char a las funciones[C]
« Respuesta #3 en: 20 Junio 2016, 17:41 pm »

Aaa pasar el vector de apuntadores si es como te dice geeke, como no vi ningun vector de apuntadores declarado pense que era otra cosa.

Por cierto deberia de declarar el vector de fraces como

Código
  1. char **fraces;

y cada que asignes un espacio para un apuntador mas. Tambien tienes que inicializar ese Nuevo apuntador.

Es decir:

Código
  1. ptrFrases = (char*)realloc( ptrFrases, i * sizeof(char*) );
  2.       ptrFrases[i-1] = malloc(CARACTERES);
  3. if( ptrFrases[i-1]!=NULL ){
  4. strcpy( ptrFrases[i-1], tmp );
  5. }
  6. else{
  7. safeFree( ptrFrases );
  8. puts( "Error (re)allocating memory" );
  9. exit(1);
  10. }


La otra es que debes de retornat el valor del apuntador de fracea ya que si realloc cambia la posición de memoria de fraces dentro de una de las funciones la funcion main no se va a enterar y va a tener una copia antigua del apuntador.

En mi canal hice un video sobre Apuntadores dobles.

No pongo en link por que va a parecer spam

XD

Saludos
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Pasar vector de puntero a char a las funciones[C]
« Respuesta #4 en: 20 Junio 2016, 21:46 pm »

Hola.
Creo que nunca me costo tanto entender un tema como en este caso, tan solo para intentar avanzar me podrían decir que tengo que modificar para que no me del siguiente error.

Citar
ayp.c:11:10: warning: assignment from incompatible pointer type [enabled by default]
frases = (char*)realloc( frases, i * sizeof(char*) );

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main( void ){
  5. char **frases, *tmp;
  6. size_t i=0;
  7.  
  8. while(i < 5){
  9. frases = (char*)realloc( frases, i * sizeof(char*) );
  10. tmp = calloc(20,1);
  11. printf( "\n Ingrese frase....:" );
  12. fgets( tmp, 20, stdin );
  13. frases[i] = tmp;
  14. i++;
  15. }
  16. i=0;
  17. while(i < 5){
  18. printf( "\n Frases Ingresadas....: %s", frases[i] );
  19. i++;
  20. }
  21.  
  22. return 0;
  23. }
No tendrá mucha relación con el programa que quiero hacer pero trate de hacerlo sencillo para poder entenderlo. -


Saludos.
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Pasar vector de puntero a char a las funciones[C]
« Respuesta #5 en: 20 Junio 2016, 21:55 pm »

Siempre es bueno simplificar los ejemplos para entender los conceptos.

Recuerda que es un doble apuntador y deberia de ser doble *
Código
  1. frases = (char**)realloc( frases, i * sizeof(char*) );

Deberia de funcionar con eso.

Saludos.
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Pasar vector de puntero a char a las funciones[C]
« Respuesta #6 en: 20 Junio 2016, 23:25 pm »

Al fin logre que funcione, dejo el código porque además del error que me solucionaste tenía 2 más. -
El incremento de la variable i va al comienzo del bucle y no al final, creo que es porque en la primer iteración valiendo cero i no reservaría memoria. - 
Y el segundo lo producía porque no igualaba a NULL el puntero frases. -

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main( void ){
  5. char **frases=NULL, *tmp=NULL;
  6. size_t i=0;
  7.  
  8. while(i < 5){
  9. i++;
  10. frases = (char**)realloc( frases, i * sizeof(char*) );
  11. tmp = calloc(20,1);
  12. printf( "\n Ingrese frase....:" );
  13. fgets( tmp, 20, stdin );
  14. frases[i-1] = tmp;
  15. }
  16. i=0;
  17. while(i < 5){
  18. printf( "\n Frases Ingresadas....: %s", frases[i] );
  19. i++;
  20. }
  21.  
  22. free(frases);
  23.  
  24. return 0;
  25. }
  26.  

Saludos.
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
geeke

Desconectado Desconectado

Mensajes: 93


Ver Perfil
Re: Pasar vector de puntero a char a las funciones[C]
« Respuesta #7 en: 21 Junio 2016, 01:13 am »

Tienes fugas de memoria en el interior del bucle en cada llamada a calloc() asignas un nuevo bloque de memoria a tmp y el anterior se pierde. Debes reservar espacio fuera del bucle o liberar en cada iteración y no olvides liberar al final en ambos casos.
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Pasar vector de puntero a char a las funciones[C]
« Respuesta #8 en: 21 Junio 2016, 01:20 am »

No tiene fugas de memoria si te fijas las asigna a su variable frases.

Código
  1. frases[i-1] = tmp;

Mas bien la variable tmp la tiene de mas pudo usar directamente.

Código
  1. frases[i-1] = calloc(20,1);

Pero es entendible que tenga esos detalles ya que apenas esta aprendiendo a usar apuntadores dobles.

Eso si solo esta liberando el apuntador a frases y no todos los apuntadores individuales.

Solo seria agregar un

Código
  1. free(frases[i]);
en el segundo while justo despues de imprirlas y antes de incrementar el contador.

Saludos
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Pasar vector de puntero a char a las funciones[C]
« Respuesta #9 en: 21 Junio 2016, 02:04 am »

Hola.
Bueno al fin en este día aprendí más de lo esperado, con la primer respuesta pensé que no podría nunca explicar mis dudas, pero todo se fue encaminando, muchas gracias a todos los que me ayudaron en este post.
Espero que ahora este aceptable y me quiero ver encajando todo esto en el otro programa, espero lograrlo.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main( void ){
  5. char **frases=NULL;
  6. size_t i=0;
  7.  
  8. while(i < 5){
  9. i++;
  10. frases = (char**)realloc( frases, i * sizeof(char*) );
  11. frases[i-1] = calloc(20,1);
  12. printf( "\n Ingrese frase....:" );
  13. fgets( frases[i-1], 20, stdin );
  14. }
  15. i=0;
  16. while(i < 5){
  17. printf( "\n Frases Ingresadas....: %s", frases[i] );
  18. free(frases[i]);
  19. i++;
  20. }
  21.  
  22. return 0;
  23. }

Saludos.    
« Última modificación: 21 Junio 2016, 02:40 am por NOB2014 » En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
martiz de char doble puntero
Programación C/C++
neo_from_cs_matrix 2 6,641 Último mensaje 15 Julio 2011, 00:05 am
por rir3760
duda doble puntero char a matriz de char
Programación C/C++
neo_from_cs_matrix 3 6,315 Último mensaje 5 Septiembre 2011, 03:53 am
por rir3760
Como pasar una cadena char a hexadecimal por argumento a un constant char?
Programación C/C++
ahaugas 3 5,815 Último mensaje 13 Enero 2013, 14:09 pm
por ahaugas
¿Pregunta puntero a char en c++? « 1 2 »
Programación C/C++
Zodiak98 11 6,706 Último mensaje 23 Abril 2013, 17:01 pm
por rir3760
Pasar tipo const char* a char « 1 2 »
Programación C/C++
jorge_hura 15 11,593 Último mensaje 25 Julio 2013, 09:50 am
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines