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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda!! numeros aleatorios con apuntadores
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda!! numeros aleatorios con apuntadores  (Leído 4,363 veces)
erikskate1

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Ayuda!! numeros aleatorios con apuntadores
« en: 4 Marzo 2015, 03:46 am »

Hola amigos otra ves yo molestando y pidiendo su ayuda ya que no entiendo por que me muestra 0 (ya genere los numeros aleatorios con srand,y en la funcion longitud los leo pero en todas las ejecuciones de mi programa sale 0 ):S es un programa que te genera una cadena de num aleatorios y de ahi te cuenta cuantos numeros se generaron. Disculpen las faltas de ortografia espero me puedan orientar por que no entiendo  muy bien este tema :S gracias de antemano
Código
  1. void generacad(int **cadena)
  2. {
  3. int tam,i;
  4. srand(time(NULL));
  5. tam=rand()%361;
  6. *cadena=(int *)malloc(sizeof(int)*tam);
  7.  
  8. for(i=0;i<tam;i++)
  9. {
  10. *(*cadena+i)=rand()%2;
  11. }
  12. }
  13. int Longitud(int *cadena)
  14. {
  15. int i;
  16. for(i=0;*(cadena+i)!='\0';i++)
  17. {
  18. return(i);
  19. }
  20. }
  21. int main()
  22. {
  23. int *cadena;
  24. generacad(&cadena);
  25. printf("La longitud de la cadena es: %d", Longitud(cadena));
  26. getch();
  27. }
  28.  


« Última modificación: 4 Marzo 2015, 05:55 am por erikskate1 » En línea

vangodp


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: ayuda! Problema con conversion int to int* apuntadores
« Respuesta #1 en: 4 Marzo 2015, 05:58 am »

 Lo que pasa es que tienes un puntero normal que es  int *cadena y lo estas intentando pasar a una función "genera_cad(&cadena)" que espera un puntero doble, pero que en su cuerpo lo tratas como puntero normal. En definición estas haciendo una confusión.
Si quieres pasar un puntero a una funcion haz que la funcion espere un puntero de igual tipo. un ejemplo es:
int main(){
int *n
funcion(n);
}
void funcion(int *n){
}

Como ves no hace falta poner el operador & delante porque n es un tipo de variable especial que guarda la dirección del primer elemento de la cadena. A efectos n es lo mismo que &n[0] y por eso no necesitas poner & delante, ya que seria como hacer algo parecido a &&int[0] lo que esta fatal y carece de sentido.

Si necesitas saber el tamaño de la cadena mejor le pasas a 'tamanho' desde main y así te evitas tener que tener otra función para eso.

Otro punto a destacar es que en el caso de los int no hay NULL al final del array por lo que debes saber siempre su tamaño con anterioridad. Solo las cadenas de caracteres tienen el carácter NULL que indica que la cadena termina en un determinado lugar y que no hemos utilizado todo el espacio reservado.

Si reservamos 1000 chars y solo ponemos "Hola mundo" le sobraría 990 espacios de los cuales printf los imprimiría todos sin saber donde parar, incluso seguiría imprimiendo hasta después de que terminara los mil caracteres ya que nunca va a saber hasta donde debe imprimir.

Entonces en el caso de las cadenas de caracteres si reservo 1000 espacios y lo leo con la función que sea(scanf, gets...), esa función se va encargar de poner el null ahí justo al fin de lo que escribimos, si escribimos "Hola mundo" ten por seguro que en memoria esta "Hola mundo\0" ese \0 indica que ahí esta el fin de la cadena que introducimos y que no utilizamos los 1000 espacios reservados, como podemos imprimir como string con un printf ("%s", cadena); que es lo mismo que decir "imprime desde el primer carácter hasta encontrar el nulo \0" y no hasta el infinito y más allá. XD

Si te das cuanta que no puedes imprimir enteros como chars ya sabrás por que no existe ese NULL en los arreglos de enteros, porque eres tú quien se encarga de mostrarlos uno a uno con un bucle ya que no se puede imprimir como cadena.


Me tome la libertad de arreglar un poco su código haciéndolo algo más funcional.
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int* genera_cad (int tam);
  6.  
  7. int main() {
  8.    srand ( time ( NULL ) ); // llame la funcion srand una sola vez al inicio de main
  9.    int tam = rand() % 361;
  10.    int *cadena = genera_cad ( tam );
  11.  
  12.    printf ( "\n la long de la cadena es %d\n", tam );
  13.    printf ( "%d\n", cadena[0]);
  14.  
  15.    free(cadena);
  16.    getchar();
  17.    return 0;
  18. }
  19.  
  20. int* genera_cad (int tam) {
  21.    int *cadena;
  22.    cadena = ( int * ) malloc ( sizeof ( int ) * tam );
  23.    int i;
  24.    for ( i = 0; i < tam; i++ ) {
  25.        * ( cadena + i ) = rand() % 2;
  26.    }
  27.    return cadena;
  28. }
  29.  



En línea

erikskate1

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: ayuda! Problema con conversion int to int* apuntadores
« Respuesta #2 en: 4 Marzo 2015, 06:27 am »

Lo que pasa es que tienes un puntero normal que es  int *cadena y lo estas intentando pasar a una función "genera_cad(&cadena)" que espera un puntero doble, pero que en su cuerpo lo tratas como puntero normal. En definición estas haciendo una confusión.
Si quieres pasar un puntero a una funcion haz que la funcion espere un puntero de igual tipo. un ejemplo es:
int main(){
int *n
funcion(n);
}
void funcion(int *n){
}

Como ves no hace falta poner el operador & delante porque n es un tipo de variable especial que guarda la dirección del primer elemento de la cadena. A efectos n es lo mismo que &n[0] y por eso no necesitas poner & delante, ya que seria como hacer algo parecido a &&int[0] lo que esta fatal y carece de sentido.

Si necesitas saber el tamaño de la cadena mejor le pasas a 'tamanho' desde main y así te evitas tener que tener otra función para eso.

Otro punto a destacar es que en el caso de los int no hay NULL al final del array por lo que debes saber siempre su tamaño con anterioridad. Solo las cadenas de caracteres tienen el carácter NULL que indica que la cadena termina en un determinado lugar y que no hemos utilizado todo el espacio reservado.

Si reservamos 1000 chars y solo ponemos "Hola mundo" le sobraría 990 espacios de los cuales printf los imprimiría todos sin saber donde parar, incluso seguiría imprimiendo hasta después de que terminara los mil caracteres ya que nunca va a saber hasta donde debe imprimir.

Entonces en el caso de las cadenas de caracteres si reservo 1000 espacios y lo leo con la función que sea(scanf, gets...), esa función se va encargar de poner el null ahí justo al fin de lo que escribimos, si escribimos "Hola mundo" ten por seguro que en memoria esta "Hola mundo\0" ese \0 indica que ahí esta el fin de la cadena que introducimos y que no utilizamos los 1000 espacios reservados, como podemos imprimir como string con un printf ("%s", cadena); que es lo mismo que decir "imprime desde el primer carácter hasta encontrar el nulo \0" y no hasta el infinito y más allá. XD

Si te das cuanta que no puedes imprimir enteros como chars ya sabrás por que no existe ese NULL en los arreglos de enteros, porque eres tú quien se encarga de mostrarlos uno a uno con un bucle ya que no se puede imprimir como cadena.


Me tome la libertad de arreglar un poco su código haciéndolo algo más funcional.
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int* genera_cad (int tam);
  6.  
  7. int main() {
  8.    srand ( time ( NULL ) ); // llame la funcion srand una sola vez al inicio de main
  9.    int tam = rand() % 361;
  10.    int *cadena = genera_cad ( tam );
  11.  
  12.    printf ( "\n la long de la cadena es %d\n", tam );
  13.    printf ( "%d\n", cadena[0]);
  14.  
  15.    free(cadena);
  16.    getchar();
  17.    return 0;
  18. }
  19.  
  20. int* genera_cad (int tam) {
  21.    int *cadena;
  22.    cadena = ( int * ) malloc ( sizeof ( int ) * tam );
  23.    int i;
  24.    for ( i = 0; i < tam; i++ ) {
  25.        * ( cadena + i ) = rand() % 2;
  26.    }
  27.    return cadena;
  28. }
  29.  

WOW :D En verdad muchas gracias amigo apenas ando empesando con apuntadores y vectores dinamicos y se me estan dificultando mucho jejeje  tomare en cuenta varios puntos que me mencionaste  ;-) ;-) ;-) ;-) Reitero muchas gracias por tu tiempo y ayuda amigo =D
PD: perdon por citarte jejeje

En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

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