Ver Mensaje Individual
  #3 (permalink)  
Antiguo 09/11/2010, 09:51
Trovaz
 
Fecha de Ingreso: octubre-2010
Ubicación: Edo. de México
Mensajes: 94
Antigüedad: 14 años, 1 mes
Puntos: 9
Respuesta: significado de linea de código

Cita:
Iniciado por Lizy94 Ver Mensaje
hola, si alguien me pudiese decir que quiere decir esta linea de código

*(a.datos+x+y*a.ancho),/*se que es para accesar a los datos de una matriz, pero no entiendo como*/

/*la estructura está declarada asi*/

typedef struct mat MATRIZ;
void inic_matriz (MATRIZ *p,int x,int y)
{
p->ancho = x;
p->alto = y;
p->datos = (float *)malloc(sizeof(float)*x*y);
}

main()
{
MATRIZ a;
inic_matriz (&a,3,3);
.....
borrar_matriz (&a);
}
Cuando almacenas informacion por medio del malloc, lo que estas es reservar memoria contigua. Tomando tu codigo, estas inicializando una matriz de 3 x 3, por lo que estas almacenano un espacio de.
[code]
p->datos = (float *)malloc(sizeof(float)*x*y);
[code}

Es decir:

[code]
p->datos = (float *)malloc(8 * 3 * 3); // p->datos = (float *)malloc(72);
// los float ocupan 8 bytes en memoria
[code}

72 bytes en total!!!!, pero en realidad "datos" almacena una direccion de memoria, digamos que esta direccion es 5000.

Ahora tomemos el pedazo de codigo en el que tienes duda

Código:
*(a.datos+x+y*a.ancho)
recuerda que a.ancho == 3, y que a.datos es 5000. Ahora para que vizualices un poco lo que pasa, hagamos un mapa de la memoria que tienes. Para esto voy a utilizar direcciones de memoria en decimal para que no haya confusion alguna,

Código:
representacion de "datos" en memoria contigua
datos -----> ([5000][5008][5016][5024][5032][5040][5048][5056][5064])
Recuerda que cada float ocupa 8 bytes, por lo que la ultima localidad va de 5064 a 5071.
entonces.
5071 - 5000 + 1 = 72

Los 72 bytes que reservamos!!!
Código:
    Ahora solo lo representamos como una martriz de 3x3
    Matriz "datos"
               [5000][5008][5016]
               [5024][5032][5040]
               [5048][5056][5064]
retomando tu codigo, (porfin va la explicacion hehe).

Código:
*(a.datos+x+y*a.ancho)
digamos que queremos acceder al dato 1,1 (segunda columna, segunda fila), osea a la localidad de memoria 5032.

Entonces sustituyamos.
*(5000 + 1 + (1 * 3)) = 5004

WTF!!, no queriamos 5032?, bueno en realidad lo que pasa aqui esque el compilador es mas listo de lo que pensabamos, al dasre cuenta que datos, osea 5000, es un apuntador a un float, cualquier aumento que se le haga al apuntador, lo multiplicara antes por el tamaño de un float, es decir.

*(5000 + 8 * (1 + (1*3))) = *(5000 + 8 * 4) = *(5000 + 32) = *(5032)

Justo la localidad de memoria que necesitamos hehe

Bueno espero haberte ayudado.

Saludos++