Pasar vector de puntero a char a las funciones[C]

Iniciado por NOB2014, 20 Junio 2016, 16:14 PM

0 Miembros y 1 Visitante están viendo este tema.

NOB2014

Hola, que tengan un muy buen día. -
Continuo con mis dudas pero ante quiero efectuar una aclaración, si consideran que esto de preguntar y preguntar, y no recurrir a un manual a buscar por mí mismo y piensan que eso es lo que debo hacer, todo ben, yo tengo mi criterio formado del porqué continuamente recurro a Uds. para evacuar mis dudas, en definitiva, si este post no tuviera respuesta lo entendería perfectamente y si me pegaran una bofetada psicológica también. -
Dicho esto pasa a consultarles sobre mis dudas.
Intento pasar el ingreso de los datos a una función y tengo (aparentemente) un solo error y esta en la siguiente linea. - 
ptrFrases = ingreso( frases );
Citarayp.c:10:2: error: invalid operands to binary & (have 'int' and 'char **')
Y la pregunta del millón, porque debo utilizar doble apuntador, tengo claro que lo que contiene la variable apuntador es una dirección de memoria y que un doble apuntador contiene la dirección de memoria de otro puntero. -

#include <stdio.h>
#include <stdlib.h>

char ingreso( char **frases );

int main( void ){
char **frases=NULL, **ptrFrases=NULL;
size_t i = 0

ptrFrases = ingreso( frases );

while(i < 5){
printf( "\n Frases Ingresadas....: %s", ptrFrases[i] );
free(frases[i]);
i++;
}

return 0;
}


char ingreso( char **frases ){
size_t i=0;

while(i < 5){
i++;
frases = (char**)realloc( frases, i * sizeof(char*) );
frases[i-1] = calloc(20,1);
printf( "\n Ingrese frase....:" );
fgets( frases[i-1], 20, stdin );
}

return **frases;
}

Los dobles punteros son lo que no puedo interpretar, por lo menos en este caso. -
Saludos.
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

Si la funcion esta devolviendo un doble apuntador
deberia de ser:
char** ingreso( char **frases );

Con eso corrijes el error

Respecto a  tu duda.
CitarY la pregunta del millón, porque debo utilizar doble apuntador

No se exactamente por donde va la pregunta.

Pero se usa doble apuntador para darle mas sentido al programa, que el contenido que esta siendo apuntado es un vector de apuntadores. Que a su vez cada apuntadorindividual  apunta un vector de caracteres...

Es complicado pero una vez que lo pillas al 100 estarias entendiendo uno de los topics mas complicados del lenguaje.

Te dejo mi video, creo que ya te lo habia pasado en otro de mis respuestas.

[youtube=640,360]https://www.youtube.com/watch?v=BLrJnp1x--w[/youtube]
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

NOB2014

Citarel contenido que esta siendo apuntado es un vector de apuntadores.
Ya había leído esto en alguna parte y creo que es la clave para entender los punteros dobles, en cuanto a
la solución que escribiste no me funciona, sigue sin compilar.-
Saludos.
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

Debes de cambiar

el prototipo de funcion.
la funcion en si
y el return no deberia de tener los 2 asteriscos.

De ahi en mas en que otra linea te da error?

Saludos

Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

NOB2014

#14
Hola, buen día para todos.
Como se nota en el código pude efectuar un avance pero me falta algo importante y es que no logro retomar la dirección de memoria a main del puntero frases como lo sugería Alberto.
CitarLa 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.

#include <stdio.h>
#include <stdlib.h>

void ingreso( char** );

int main( void ){
char **frases=NULL;

ingreso( frases );

return 0;
}

void ingreso( char** frases ){
size_t i=0;

while(i < 5){
i++;
frases = (char**)realloc( frases, i * sizeof(char*) );
frases[i-1] = calloc(20,1);
printf( "\n Ingrese frase....:" );
fgets( frases[i-1], 20, stdin );
}
i=0;
while(i < 5){
printf( "\n Frases Ingresadas....: %s", frases[i] );
free(frases[i]);
i++;
}
}


PD: En definitiva, lo que me falta es poder imprimir los datos ingresados desde main y no desde la función ingreso.-

Espero puedan ayudarme con esto también.
Saludos.  
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

#include <stdio.h>
#include <stdlib.h>

char** ingreso( char** );

int main( void ){
char **frases=NULL;

frases= ingreso( frases );
       imprimir(frases);
return 0;
}

char** ingreso( char** frases ){
size_t i=0;

while(i < 5){
i++;
frases = (char**)realloc( frases, i * sizeof(char*) );
frases[i-1] = calloc(20,1);
printf( "\n Ingrese frase....:" );
fgets( frases[i-1], 20, stdin );
}
      return frases;
}

void imprimir(char **frases){
int i=0;
while(i < 5){
printf( "\n Frases Ingresadas....: %s", frases[i] );
free(frases[i]);
i++;
}
       free(frases);
}


Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

NOB2014

Muy bien maestro funciona a la perfección, por si alguien quiere correr tu código como Ej. deberías agregarle el prototipo. -

Muchas gracias por tu tiempo, Saludos.
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.-