/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

memoria dinamica

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
deryck



Registrado: 16 Mar 2007
Mensajes: 8

MensajePublicado: 29/10/2007 9:26 am
Título: memoria dinamica

He hecho los cambios que me habéis dicho en mi código C, pero sigo teniendo problemas, a ver tengo que hacer otra reserva de memoria dinámica de una matriz y la hago de la siguiente manera:
Código:

//Variables globales
int **TablaEmparejamiento=NULL

Luego reservo memoria para esa matriz de esta manera:

Código:
//Reservamos memoria para la tabla de emparejamiento

        TablaEmparejamiento=(int **)malloc(sizeof(int *)*NumParejas);

        if(TablaEmparejamiento==NULL){

                printf("\nERROR en la asignacion de memoria. TablaEmparejamiento");

                exit(1);

        }

        for(i=0;i<NumParejas;i++){

        TablaEmparejamiento[i]=(int *)malloc(NumParejas*sizeof(int));

                                  if(TablaEmparejamiento[i]==NULL){

                                  printf("\nERROR en la asignacion de memoria. TablaEmparejamiento");

                                  exit(1);

                                  }

                                  else{

                                       for(j=0;j<NumParejas;j++){

                                                                printf("\nTabla emparejamiento");

                                                                TablaEmparejamiento[i][j]=0;

                                                                }

                                       }

        }


A ver si alguien sabe que estoy poniendo mal, porque yo no lo encuentro, muchas gracias a todos por adelantado!


Mi problema es el siguiente, ya publique otro post pero ponía el código entero, ahora creo que ya tengo localizado el problema (o eso creo xDD): tengo esta estructura
Código:
 struct mujer {
    int libre;
    int *mujerPreferencia;
};


struct hombre {
    int libre;
    int *hombrePreferencia;
    int proponerMat;
};


y quiero reservar memoria dinamica, lo que no sé si la reservo bien; yo hago lo siguiente:

primero reservo memoria para la estructura:
Código:
struct mujer *preferenciaM;
    struct hombre *preferenciaH;
   
    preferenciaM=(struct mujer *)malloc(sizeof(struct mujer *));
    preferenciaH=(struct hombre *)malloc(sizeof(struct hombre *));


y luego reservo memoria para los elementos que hay dentro de dicha estructura:
Código:
 if((preferenciaM->mujerPreferencia=(int *)malloc(sizeof(int *)* NumParejas* NumParejas))==NULL){
                printf("\nERROR en la asignacion de memoria.");
                exit(1);
        }
       
        if((preferenciaH->hombrePreferencia=(int *)malloc(sizeof(int *)* NumParejas *NumParejas))==NULL){
                printf("\nERROR en la asignacion de memoria.");
                exit(1);
        }


Mi duda es si lo hago bien, yo creo que fallo en algo, pero por mas que lo miro no se en que.

Un saludo


Ultima edición por deryck el 31/10/2007 2:06 am; editado 1 vez
Volver arriba
guimel



Registrado: 17 Oct 2007
Mensajes: 11

MensajePublicado: 29/10/2007 11:50 am
Título:

Hola!
El primer malloc es incorrecto, porque deberías solicitar suficiente memoria para albergar la estructura completa, y no para un puntero a ella.

Es decir, deberías usar el siguiente código:
Código:


    struct mujer *preferenciaM;
    struct hombre *preferenciaH;
   
    preferenciaM=(struct mujer *)malloc(sizeof(struct mujer));
    preferenciaH=(struct hombre *)malloc(sizeof(struct hombre));


Una vez hecho eso, no necesitas volver a solicitar memoria con malloc para los miembros, salvo para los que sean punteros, y debes proceder de la misma forma que arriba, es decir, pidiendo memoria para el tipo, no para un puntero a él (aunque en este caso, el tamaño del int y el del puntero a int pueden coincidir por pura suerte):

Código:

 if((preferenciaM->mujerPreferencia=(int *)malloc(sizeof(int)* NumParejas* NumParejas))==NULL){
                printf("\nERROR en la asignacion de memoria.");
                exit(1);
        }
       
        if((preferenciaH->hombrePreferencia=(int *)malloc(sizeof(int)* NumParejas *NumParejas))==NULL){
                printf("\nERROR en la asignacion de memoria.");
                exit(1);
        }

_________________
Las ciencias de la computación están tan poco relacionadas con las computadoras como la astronomía con los telescopios

Edsger Dijkstra
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3650
Ubicación: Mexico

MensajePublicado: 29/10/2007 4:51 pm
Título:

Seria bueno que indicaras que lenguaje de programacion estas utilizando, C o C++.

En el caso de C la conversion explicita al valor retornado por malloc no es necesaria y el error que comenta guimel se podria haber evitado si se utiliza el idioma (convencion informal dada por la practica) y que es:
Código:
p = malloc(N * sizeof *p)

Donde p es el puntero donde almacenaremos la direccion del bloque y N es, de ser necesario, el numero de elementos en este.

Siguiendo este idioma las dos primeras llamadas a malloc quedarian asi:
Código:
preferenciaM = malloc(sizeof *preferenciaM);
preferenciaH = malloc(sizeof *preferenciaH);


Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
deryck



Registrado: 16 Mar 2007
Mensajes: 8

MensajePublicado: 30/10/2007 1:17 am
Título:

Muchas gracias por la ayuda que me habéis prestado, voy a realizar los cambios que me habéis dicho. Lo siento, se me olvido ponerlo, el lenguaje en el que estoy trabajando es C.

Un saludo
Volver arriba
deryck



Registrado: 16 Mar 2007
Mensajes: 8

MensajePublicado: 31/10/2007 2:06 am
Título:

He hecho los cambios que me habéis dicho en mi código C, pero sigo teniendo problemas, a ver tengo que hacer otra reserva de memoria dinámica de una matriz y la hago de la siguiente manera:
Código:

//Variables globales
int **TablaEmparejamiento=NULL

Luego reservo memoria para esa matriz de esta manera:

Código:
//Reservamos memoria para la tabla de emparejamiento

        TablaEmparejamiento=(int **)malloc(sizeof(int *)*NumParejas);

        if(TablaEmparejamiento==NULL){

                printf("\nERROR en la asignacion de memoria. TablaEmparejamiento");

                exit(1);

        }

        for(i=0;i<NumParejas;i++){

        TablaEmparejamiento[i]=(int *)malloc(NumParejas*sizeof(int));

                                  if(TablaEmparejamiento[i]==NULL){

                                  printf("\nERROR en la asignacion de memoria. TablaEmparejamiento");

                                  exit(1);

                                  }

                                  else{

                                       for(j=0;j<NumParejas;j++){

                                                                printf("\nTabla emparejamiento");

                                                                TablaEmparejamiento[i][j]=0;

                                                                }

                                       }

        }


A ver si alguien sabe que estoy poniendo mal, porque yo no lo encuentro, muchas gracias a todos por adelantado!
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3650
Ubicación: Mexico

MensajePublicado: 31/10/2007 7:44 am
Título:

El fragmento de codigo que muestras es correcto y no deberia darte problemas, tal vez el error se genere en otra parte de tu programa y para encontrarlo lo mas sencillo es que publiques el codigo fuente completo de este.

Tambien ayudaria bastante si compilas en el modo mas estricto que permita tu compilador de C ya que esa es la forma mas sencilla de encontrar errores de compilacion. Y antes de que pregunten como hacerlo depende del compilador utilizado y debe estar bien explicado en la documentacion de este.

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
daltomi



Registrado: 28 Abr 2007
Mensajes: 114
Ubicación: Argentina

MensajePublicado: 31/10/2007 5:59 pm
Título:

Existe una confusión:
En el tú "post" anterior Problema reservar memoria dinamica en matrimoniso estables tienes...
Código:

preferenciaH=(struct hombre *)malloc(sizeof(struct hombre));

...es decir, no es un array. Luego en las fucniones valorInicial y asignarHMPreferencias recorres la memoria asignada como si fuera un array, un fragmento:
Código:

void valorInicial(struct mujer *preferenciaM,struct hombre *preferenciaH) {

    int i;

    for(i=0; i<NumParejas; i++) {

   preferenciaH[i].libre = -1; //Inicialmente todos los hombres son libres de proponer a cualquier mujer

   preferenciaH[i].proponerMat = 0; //Nos da la siguiente mujer libre que puede ser propuesta

   preferenciaM[i].libre = -1;

    }

}


Saludos.
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com