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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  arreglo de punteros y funciones
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: arreglo de punteros y funciones  (Leído 2,637 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
arreglo de punteros y funciones
« 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


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: arreglo de punteros y funciones
« Respuesta #1 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


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Alien-Z

Desconectado Desconectado

Mensajes: 177


C++ Programmer


Ver Perfil
Re: arreglo de punteros y funciones
« Respuesta #2 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.
« Última modificación: 27 Agosto 2013, 21:52 pm por Alien-Z » En línea

m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: arreglo de punteros y funciones
« Respuesta #3 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
En línea

Alien-Z

Desconectado Desconectado

Mensajes: 177


C++ Programmer


Ver Perfil
Re: arreglo de punteros y funciones
« Respuesta #4 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.
En línea

m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: arreglo de punteros y funciones
« Respuesta #5 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.
En línea

Alien-Z

Desconectado Desconectado

Mensajes: 177


C++ Programmer


Ver Perfil
Re: arreglo de punteros y funciones
« Respuesta #6 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.
« Última modificación: 29 Agosto 2013, 10:29 am por Alien-Z » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: arreglo de punteros y funciones
« Respuesta #7 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: arreglo de punteros y funciones
« Respuesta #8 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));



En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: arreglo de punteros y funciones
« Respuesta #9 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines