Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Memoria dinámica, estructura con punteros, No encuentro el error.

Estas en el tema de Memoria dinámica, estructura con punteros, No encuentro el error. en el foro de C/C++ en Foros del Web. No puedo hacer funcionar este código: Lo que genera la funcion es un nombre que quiero almazenar en una variable de tipo estructura, y lo ...
  #1 (permalink)  
Antiguo 22/09/2012, 14:45
 
Fecha de Ingreso: julio-2009
Mensajes: 36
Antigüedad: 14 años, 9 meses
Puntos: 0
Pregunta Memoria dinámica, estructura con punteros, No encuentro el error.

No puedo hacer funcionar este código:
Lo que genera la funcion es un nombre que quiero almazenar en una variable de tipo estructura, y lo quiero hacer 280 veses o almenos 100

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. typedef struct nombre_s{
  5. char *nombre; //creo que el error esta en que es un puntero aqui...
  6. //se supone que tengo otras cosas en la estructura, pero les muestro lo que no
  7. // me funciona
  8. }nombre_s;
  9.  
  10. char * generar_nombre(){ //L#LL .... L=letra... #numero
  11. int i;
  12. char *nombre;
  13. nombre=malloc(sizeof(char));
  14.     for(i=0;i<5;i++){
  15.         if(i==1) nombre[i]=(rand()%10)+48; //del 48 al 57 caracteres del 0 al 9 en ASCII
  16.         else if(i==4) nombre[i]='\0'; // ^^
  17.         else nombre[i]=(rand()%24)+66; //del 65 al 90 caracteres mayusculas de A a Z en ASCII (97 a 122 minusculas)
  18.     }
  19. return nombre;
  20. }
  21.  
  22.  
  23. int main(){
  24. int i;
  25. srand(time(0));
  26. nombre_s **vector=NULL;
  27. vector[i]=malloc(sizeof(nombre_s));
  28. for(i=0;i<280;i++){
  29. //vector[i]->nombre=calloc(5,sizeof(char));
  30. vector[i]->nombre=generar_nombre(); //esto no funciona
  31. printf("%s\n",vector[i]->nombre);
  32. }
  33. return 0;
  34. }

Espero que alguien pueda ayudarme con esto...
Gracias.

Última edición por m4rc05; 22/09/2012 a las 19:55
  #2 (permalink)  
Antiguo 23/09/2012, 08:34
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Memoria dinámica, estructura con punteros, No encuentro el error.

Hola! el problema esta aca:
Cita:
nombre_s **vector=NULL;
x que lo declaras como puntero a puntero???


Saludos
  #3 (permalink)  
Antiguo 23/09/2012, 09:04
 
Fecha de Ingreso: julio-2009
Mensajes: 36
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Memoria dinámica, estructura con punteros, No encuentro el error.

Cita:
Iniciado por cesar_casla Ver Mensaje
Hola! el problema esta aca:

x que lo declaras como puntero a puntero???


Saludos
Porque quiero que sea un
mi_structura * vector[].....
entences si hago esto
vector[i]->nombre ... sea correcto...

pero si pongo
mi_structura *vector; .... solo tengo mi structura vector y tendria que hacer
vector[i].nombre .... y yo quiero usar la flechita :3 ->

...
Aunque haciendo lo que tu me recomiendas tuve en avance :| importante GRACIAS!!!!!
...
alguien me puede explicar a mas detalles el puntero a punteros...
Bueno este es el cambio que le e echo y bueno... funciona, pero no es lo que quería, lo ideal es usar -> pero creo que me falta estudiar más.
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. typedef struct nombre_s{
  5. char *nombre;
  6. }nombre_s;
  7.  
  8. void generar_nombre(char nombre[5]){ //L#LL .... L=letra... #numero
  9. int i;
  10.     for(i=0;i<5;i++){
  11.         if(i==1) nombre[i]=(rand()%10)+48; //del 48 al 57 caracteres del 0 al 9 en ASCII
  12.         else if(i==4) nombre[i]='\0'; // ^^
  13.         else nombre[i]=(rand()%24)+66; //del 65 al 90 caracteres mayusculas de A a Z en ASCII (97 a 122 minusculas)
  14.     }
  15. //printf("\n%s\n",nombre);
  16. }
  17.  
  18.  
  19. int main(){
  20. int i;
  21. srand(time(0));
  22. //nombre_s vector[10];
  23. nombre_s *vector=NULL;
  24. vector=(nombre_s*)malloc(sizeof(nombre_s));
  25. if(!vector) return -1;
  26. for(i=0;i<10;i++){
  27. vector[i].nombre=(char*)malloc(sizeof(char)*5);
  28. generar_nombre(vector[i].nombre);
  29. printf("\n%s\n",vector[i].nombre);
  30. printf("ok\n");
  31. }
  32. return 0;
  33. }

Última edición por m4rc05; 23/09/2012 a las 09:56
  #4 (permalink)  
Antiguo 23/09/2012, 14:42
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Memoria dinámica, estructura con punteros, No encuentro el error.

mmm cambiaste un poco el codigo, por algun motivo??... Hay un pequeño detalle cuando reservas memoria para vector: tenes que multiplicar por 10(o cualquier numero) al sizeof; de esta manera tenes un vector de 10 posiciones, ejemplo
Código C:
Ver original
  1. vector=(nombre_s*)malloc(sizeof(nombre_s)*10);



Cita:
alguien me puede explicar a mas detalles el puntero a punteros...
asi como un puntero puede apuntar a cualquier tipo de variable, tambien puede apuntar a otro puntero; esto es lo q se conoce como puntero a puntero. Las ventajas y usos de hacer esto las vas a ver con el tiempo y la practica, no incluyas todo si aun no tenes afianzado los conceptos


Cita:
lo ideal es usar ->
no veo porque es ideal usar la flecha. Lo ideal es saber cuando usar "->" y cuando usar "."
Si en el programa queres usar la flecha, tenes que aplicar la aritmetica de punteros. Ejemplo para reservar memoria en nombre:
Código C:
Ver original
  1. (vector+i)->nombre=(char*)malloc(sizeof(char)*5);


Cualquier cosa segui preguntando. Saludos

Creo q no me olvide de nada, cualquier cosa segui

Etiquetas: estructura, funcion, int, memoria, punteros, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:17.