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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


  Mostrar Mensajes
Páginas: 1 ... 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 [192] 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 ... 401
1911  Programación / Programación C/C++ / Re: Punteros y memoria dinamica en: 29 Agosto 2015, 02:58 am
No, es correcto. Pon malloc(sizeof(Array)), puesto que estás reservando memoria del tamaño de Array.

Otra cosa importante: en vez de:
Código
  1. Persona vecPersona[];
pon:
Código
  1. Persona *vecPersona;
Puesto que es un puntero.

Además, tienes otros errores como, en push_back:

Código
  1. int newSize = (*vec)->size*2-(*vec)->size+1;

No sé qué pretendes sacar con esa ecuación. Al principio, siendo size=1, haces un realloc((*vec)->vecPersona, 0). Y ya luego, valores altos. Eso debería quedar:

Código
  1. int newSize = (*vec)->size+1;

En fin, he reconstruido esa función:
Código
  1. void push_back(Array ** vec, Persona tipito){
  2. int newSize = (*vec)->size+1;
  3. Persona *tmp = realloc((*vec)->vecPersona, newSize*sizeof(Persona));
  4. if(tmp){
  5. (*vec)->vecPersona = tmp;
  6. (*vec)->vecPersona[(*vec)->size] = tipito;
  7. (*vec)->size++;
  8. }
  9.    printf("%d-", (*vec)->size);
  10. }

Además, inicialicé el contenido de vecPersona en getArrayInstance:
Código
  1. Array* getArrayInstance(){
  2.    Array *vec;
  3.    vec = (Array*) malloc (sizeof(Array));
  4. vec->vecPersona = 0;
  5.    vec->size = 0;
  6.    return vec;
  7. }

Y otro tema muy importante:

Código
  1. char *hombres[] = {"Carlos", "Pablo"};
No puedes poner un doble puntero para ser inicializado de ese modo.


Además, en push_back te recomiendo poner:

Código
  1. (*vec)->vecPersona[(*vec)->size].nombre = (char*) malloc((strlen(tipito.nombre)+1)*sizeof(char));
  2. strcpy((*vec)->vecPersona[(*vec)->size].nombre, tipito.nombre);

Copiar las cadenas, no copiar los punteros, puesto que si se libera la memoria de uno de ellos, todos los demás perderán lso datos, y podrán tirar errores.

Claro que si vas a hacer un método "pop", tendrás que recordar liberarlos.

Bueno, este es el código completo, por si quieres ver qué se cambió más claramente:

Para strlen y strcpy, la librería <string.h>

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. typedef struct persona{
  7.    char *nombre;
  8.    int edad;
  9.    int sexo;
  10. }Persona;
  11.  
  12. typedef struct {
  13.    int size;
  14.    Persona *vecPersona;
  15. }Array;
  16.  
  17. Array* getArrayInstance(){
  18.    Array *vec;
  19.    vec = (Array*) malloc (sizeof(Array));
  20. vec->vecPersona = 0;
  21.    vec->size = 0;
  22.    return vec;
  23. }
  24.  
  25. void push_back(Array ** vec, Persona tipito){
  26. int newSize = (*vec)->size+1;
  27. Persona *tmp = realloc((*vec)->vecPersona, newSize*sizeof(Persona));
  28. if(tmp){
  29. (*vec)->vecPersona = tmp;
  30. (*vec)->vecPersona[(*vec)->size] = tipito;
  31. (*vec)->vecPersona[(*vec)->size].nombre = (char*) malloc((strlen(tipito.nombre)+1)*sizeof(char));
  32. strcpy((*vec)->vecPersona[(*vec)->size].nombre, tipito.nombre);
  33. (*vec)->size++;
  34. }
  35. }
  36.  
  37. void mostrarPersonas(Array *vec){
  38.    int i;
  39.    printf("\n\n");
  40.    for(i=0; i<vec->size; i++){
  41.        printf("(%d) Nombre: %s - Edad: %d - Sexo: ", i, vec->vecPersona[i].nombre, vec->vecPersona[i].edad);
  42.        if(vec->vecPersona[i].sexo == 0)
  43.            printf("Masculino");
  44.        else
  45.            printf("Femenino");
  46.        printf("\n");
  47.    }
  48. }
  49.  
  50. void cargarPersonas(Array **vec){
  51.    int i, edad, random;
  52.    int cantPersonas = rand()%30+1;
  53.    Persona aux;
  54.    char *hombres[] = {"Ramiro","Pedro","Federico","Jose","Antonio","Pablo","Raul","Gustavo","Gonzalo","Airton"};
  55.    char *mujeres[] = {"Mariana","Jennifer","Luz","Roxana","Ana","Sol","Micaela","Romina","Melina","Camila"};
  56.    for(i=0; i<cantPersonas; i++){
  57.        edad = rand()%80+1;
  58.        aux.edad = edad;
  59.        if( (random = rand()%10) %2 == 0){ // hombres
  60.            aux.nombre = hombres[random];
  61.            aux.sexo = 0;
  62.        }
  63.        else{
  64.            aux.nombre = mujeres[random];
  65.            aux.sexo = 1;
  66.        }
  67.  
  68.        push_back(vec, aux);
  69.    }
  70. }
  71.  
  72.  
  73. int main()
  74. {
  75.    srand(time(NULL));
  76.    Array *vecPersonas = getArrayInstance();
  77.    cargarPersonas(&vecPersonas); // Esto no
  78.    printf("%d", vecPersonas->size);
  79.    mostrarPersonas(vecPersonas);
  80.  
  81.    return 0;
  82. }
1912  Programación / Programación C/C++ / Re: Punteros y memoria dinamica en: 29 Agosto 2015, 01:20 am
Código
  1. Array* getArrayInstance(){
  2.    Array *vec;
  3.    vec = (Array*) malloc (sizeof(Persona));
  4.    vec->size = 0;
  5.    return vec;
  6. }

(Array*) malloc(sizeof(Persona));

Si vas a crear un Array, entonces tendrás que poner sizeof(Array), puesto que Array tiene un tamaño de sizeof(Persona*) + sizeof(int) = 8 bytes, mientras que Persona tiene un tamaño de 12 bytes.
1913  Foros Generales / Dudas Generales / Re: Es necesario ir a la universidad ?? en: 28 Agosto 2015, 20:34 pm
Siempre tienes ciclos de formación profesional.
1914  Programación / .NET (C#, VB.NET, ASP) / Re: [C#] ¿Repetir procesos de mejor forma? en: 28 Agosto 2015, 18:40 pm
Código
  1. //Verificamos que opcion desea realizar
  2. if(opcion == "sumar")
  3. {
  4.    do{
  5.        operacion.Sumando();
  6.        Console.WriteLine("Desea repetir el proceso (si/no)? ");
  7.        repetir = Console.ReadLine();
  8.    }while(repetir == "si");
  9. }
1915  Programación / Programación C/C++ / Re: Ayuda con hilos en C en: 27 Agosto 2015, 21:10 pm
Los diferentes hilos no tienen por qué ir coordinados. Si el main acaba antes que los otros threads, los otros threads se acaban al momento.
1916  Foros Generales / Foro Libre / Re: No entiendo la evolución. en: 27 Agosto 2015, 20:00 pm
Otro aspecto importante, es que no podemos "perder" una característica. En todo caso puede quedar latente, pero geneticamente está ahí.

Un cambio en el ADN puede hacer que una característica se pierda :/
1917  Foros Generales / Foro Libre / Re: No entiendo la evolución. en: 27 Agosto 2015, 18:17 pm
Se fueron desarrollando en una rama evolutiva por mutaciones, y al final, llegó a ser lo que es hoy.

Los especímenes sin esas ventosas, 1 de 2: o se convirtieron en otra especie, o desaparecieron.
1918  Programación / Programación C/C++ / Re: Ayuda con hilos en C en: 27 Agosto 2015, 18:14 pm
Coloca un sleep(1) en el main para ver si el thread llega a ejecutarse antes del join.
1919  Programación / Programación C/C++ / Re: Ayuda con hilos en C en: 27 Agosto 2015, 16:01 pm
Lo peor que podría pasar es que se mezclasen las salidas.

Pon el join al final del main, y mira si la salida es igual.

En caso de que la salida siga siendo incorrecta, comprueba si el thread se ejecuta.
1920  Programación / Programación C/C++ / Re: Ayuda con hilos en C en: 27 Agosto 2015, 15:18 pm
El for se ejecuta correctamente.

Coloca el join al final del hilo principal para evitar que se cierre el programa con el hilo abierto.
Páginas: 1 ... 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 [192] 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 ... 401
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines