Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 27 Agosto 2013, 00:58 am



Título: arreglo de punteros y funciones
Publicado por: m@o_614 en 27 Agosto 2013, 00:58 am
saludos

tengo declarado un arreglo de punteros por ejemplo: char* a[N], y para ingresarle los datos tengo que asignarle memoria a cada uno de los punteros con malloc, una vez que ya hice eso tengo que enviar cada uno de los punteros a una funcion x, y es ahi donde tengo el problema que no se si tengo que enviar: funcion(a) o tambien tengo que enviarle la posicion o sea : *a[1],*a[2],*a[3]

gracias


Título: Re: arreglo de punteros y funciones
Publicado por: rir3760 en 27 Agosto 2013, 03:43 am
Por lo que comentas no puedes pasar a la función "a" porque seria (en la llamada) de tipo "char **" como tampoco "*a[1]" porque es de tipo "char". Debes utilizar "a[0]", "a[1]", etc.

Pero para estar seguros habría que revisar el programa completo.

Un saludo


Título: Re: arreglo de punteros y funciones
Publicado por: Alien-Z en 27 Agosto 2013, 11:17 am
Código
  1. Punto tabla[3]; //Array con semántica valor | Contenido con semántica valor
  2. Punto* tabla[3]; //Array con semántica valor | Contenido con semántica referencia
  3. Punto* tabla[3] = new Punto[3]; //Array con semántica referencia | Contenido con semántica valor
  4. Punto** tabla[3];//Array con semántica referencia | Contenido con semántica referencia

Saludos.


Título: Re: arreglo de punteros y funciones
Publicado por: m@o_614 en 27 Agosto 2013, 21:38 pm
saludos

el programa es algo como esto:

Código
  1. int main()
  2. {
  3.    char B[TAM],*array[N];
  4.    int i;
  5.    for(i=0;i < N;i++)
  6.    {
  7.        printf("Dame el %d dato: ",i+1);
  8.        gets(B);
  9.        *(array+i) = (char*)malloc((strlen(B)+1)*sizeof(char));
  10.        strcpy(array[i],B);
  11.        nombre_funcion(array,i);
  12.    }
  13.    return 0;
  14. }
  15. int nombre_funcion(char *a[],int i)
  16. {
  17.    int c[TAM];
  18.    for(????;????';????)
  19.    return 0;
  20. }
  21.  


en nombre_funcion tengo que pasarle por parametro cada uno de los punteros a los que le asigne memoria en la funcion main, y en el for tengo que recorrer la cadena para hacer un X procedimiento, es ahi donde tngo el problema

gracias por sus respuestas


Título: Re: arreglo de punteros y funciones
Publicado por: Alien-Z en 27 Agosto 2013, 22:18 pm
Los punteros a arrays se utilizan como un array en si, creo que esto es lo que preguntas:

Código
  1. int nombre_funcion(char *a[], int n)
  2. {
  3.   for (int i = 0; i < n; i++)
  4.    cout << a[i] << endl;
  5.   return 0;
  6. }

Un par de cosas:

Código
  1. *(array+i) = (char*)malloc((strlen(B)+1)*sizeof(char));

¿Te das cuenta de que lo que haces es reservar en cada posición de la tabla un byte más que en la posición anterior?, es decir, si array[3] ocupa 3 bytes (y solo caben 3 caracteres), array[4] va a ocupar 4 bytes y caben 4 caracteres, por tanto no todas las posiciones tienen el mismo tamaño.

Además debes añadir la marca fin "\0" a las cadenas de tipo char.

No es correcto el uso de gets, en su lugar utiliza fgets: http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

Un saludo.


Título: Re: arreglo de punteros y funciones
Publicado por: m@o_614 en 29 Agosto 2013, 05:12 am
saludos Alien-Z yo pense que con:

Código
  1. *(romano+i) = (char*)malloc((strlen(B)+1)*sizeof(char));

strlen(B)+1 ya le estaba agregando el fin de cadena \0.


Título: Re: arreglo de punteros y funciones
Publicado por: Alien-Z en 29 Agosto 2013, 10:21 am
saludos Alien-Z yo pense que con:

Código
  1. *(romano+i) = (char*)malloc((strlen(B)+1)*sizeof(char));

strlen(B)+1 ya le estaba agregando el fin de cadena \0.

La función strlen(B) lo que hace es devolver el tamaño en bytes de la cadena B sin contar el byte que ocupa '\0', pero no la modifica ni le asigna nada, ni si quiera la marca fin.

Es luego con strcpy() donde copias el contenido de B en array['i] incluyendo '\0', pero si no tiene suficiente tamaño se queda fuera.

Lo que yo te quería decir es que esto "(strlen(B)+1)" es lo mismo que la constante "TAM", y que debes controlar que la entrada no sea más grande que dicha constante, cosa que no se hace con la función "gets" y por tanto debes incluir tú manualmente la marca fin '\0'.

Saludos.


Título: Re: arreglo de punteros y funciones
Publicado por: rir3760 en 29 Agosto 2013, 17:06 pm
el programa es algo como esto:

Código
  1. int main()
  2. {
  3.    char B[TAM],*array[N];
  4.    int i;
  5.    for(i=0;i < N;i++)
  6.    {
  7.        printf("Dame el %d dato: ",i+1);
  8.        gets(B);
  9.        *(array+i) = (char*)malloc((strlen(B)+1)*sizeof(char));
  10.        strcpy(array[i],B);
  11.        nombre_funcion(array,i);
  12.    }
  13.    return 0;
  14. }
  15.  
  16. int nombre_funcion(char *a[],int i)
  17. {
  18.    int c[TAM];
  19.    for(????;????';????)
  20.    return 0;
  21. }
  22.  


en nombre_funcion tengo que pasarle por parametro cada uno de los punteros a los que le asigne memoria en la funcion main, y en el for tengo que recorrer la cadena para hacer un X procedimiento
En ese caso debes modificar la función ya que no tienes porque pasar la dirección del array (como tampoco se necesita el segundo parámetro).

Con los cambios para que solo imprima los caracteres que componen la cadena:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define TAM  10
  6. #define N    10
  7.  
  8. int fn(char *a);
  9.  
  10. int main(void)
  11. {
  12.   char B[TAM],*array[N];
  13.   int i;
  14.  
  15.   for(i = 0; i < N; i++){
  16.      printf("Dame el %d dato: ",i + 1);
  17.      gets(B);
  18.      array[i] = malloc((strlen(B) + 1));
  19.      strcpy(array[i], B);
  20.      fn(array[i]);
  21.   }
  22.  
  23.   return 0;
  24. }
  25.  
  26. int fn(char *a)
  27. {
  28.   int i;
  29.  
  30.   for (i = 0; a[i] != '\0'; i++)
  31.      putchar(a[i]);
  32.   putchar('\n');
  33.  
  34.   return 0; /* Hay que devolver un valor util */
  35. }

Otro detalle que te falta en tu programa es liberar la memoria reservada.

Un saludo


Título: Re: arreglo de punteros y funciones
Publicado por: m@o_614 en 30 Agosto 2013, 16:25 pm
saludos rir3760 con las correcciones que hiciste ahora el programa funciona perfectamente, ahora solo me queda una duda, por ejemplo si tengo un puntero int *p;

y le quiero asignar memoria con malloc, tendria que hacer esto:

p = (int *) malloc(10*sizeof(int));

pero me pregunto por que al hacer esto, esta mal

*p = (int*) malloc(10*sizeof(int));





Título: Re: arreglo de punteros y funciones
Publicado por: rir3760 en 30 Agosto 2013, 17:38 pm
Porque:
1) "p" es la variable que puede almacenar una dirección de memoria.
2) "*p" es el objeto en la dirección indicada por "p".

En otras palabras "p" es la dirección y "*p" el objeto apuntado.

Un saludo