| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
deryck
Registrado: 16 Mar 2007 Mensajes: 8
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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 | |
 |
|
|