Autor
|
Tema: arreglo de punteros y funciones (Leído 4,033 veces)
|
m@o_614
Desconectado
Mensajes: 389
|
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
Mensajes: 1.639
|
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
Mensajes: 177
C++ Programmer
|
Punto tabla[3]; //Array con semántica valor | Contenido con semántica valor Punto* tabla[3]; //Array con semántica valor | Contenido con semántica referencia Punto* tabla[3] = new Punto[3]; //Array con semántica referencia | Contenido con semántica valor 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
Mensajes: 389
|
saludos el programa es algo como esto: int main() { char B[TAM],*array[N]; int i; for(i=0;i < N;i++) { printf("Dame el %d dato: ",i +1); nombre_funcion(array,i); } return 0; } int nombre_funcion(char *a[],int i) { int c[TAM]; for(????;????';????) return 0; }
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
Mensajes: 177
C++ Programmer
|
Los punteros a arrays se utilizan como un array en si, creo que esto es lo que preguntas: int nombre_funcion(char *a[], int n) { for (int i = 0; i < n; i++) cout << a[i] << endl; return 0; }
Un par de cosas: *(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.htmlUn saludo.
|
|
|
En línea
|
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
saludos Alien-Z yo pense que con:
strlen(B)+1 ya le estaba agregando el fin de cadena \0.
|
|
|
En línea
|
|
|
|
Alien-Z
Desconectado
Mensajes: 177
C++ Programmer
|
saludos Alien-Z yo pense que con:
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
Mensajes: 1.639
|
el programa es algo como esto: int main() { char B[TAM],*array[N]; int i; for(i=0;i < N;i++) { printf("Dame el %d dato: ",i +1); nombre_funcion(array,i); } return 0; } int nombre_funcion(char *a[],int i) { int c[TAM]; for(????;????';????) return 0; }
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: #include <stdio.h> #include <stdlib.h> #include <string.h> #define TAM 10 #define N 10 int fn(char *a); int main(void) { char B[TAM],*array[N]; int i; for(i = 0; i < N; i++){ printf("Dame el %d dato: ",i + 1); fn(array[i]); } return 0; } int fn(char *a) { int i; for (i = 0; a[i] != '\0'; i++) return 0; /* Hay que devolver un valor util */ }
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
Mensajes: 389
|
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
Mensajes: 1.639
|
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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
función con arreglo de punteros. C++
Programación C/C++
|
yookino
|
2
|
2,117
|
4 Febrero 2014, 23:14 pm
por Yoel Alejandro
|
|
|
función con arreglo de punteros. C++
« 1 2 »
Programación C/C++
|
yookino
|
10
|
7,329
|
6 Febrero 2014, 16:59 pm
por yookino
|
|
|
doble duda (arreglo dinamico y funciones entre clases)
Programación C/C++
|
rulovive
|
5
|
3,494
|
5 Abril 2014, 22:11 pm
por rulovive
|
|
|
Pasar a función un arreglo con punteros o con el nombre del arreglo como puntero
Programación C/C++
|
NOB2014
|
3
|
3,486
|
9 Junio 2016, 17:10 pm
por geeke
|
|
|
Confusión: arreglo de arreglo de strings (o con punteros)
Programación C/C++
|
Skali
|
3
|
2,525
|
18 Mayo 2018, 19:22 pm
por MAFUS
|
|