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

significado de linea de código

Estas en el tema de significado de linea de código en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 09/11/2010, 07:15
Avatar de Lizy94  
Fecha de Ingreso: diciembre-2009
Mensajes: 149
Antigüedad: 14 años, 4 meses
Puntos: 0
significado de linea de código

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);
}
  #2 (permalink)  
Antiguo 09/11/2010, 09:46
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: significado de linea de código

Es para acceder a la posición (x,y) de la matriz.

Suponiendo x=3, y=4 (3 columnas, 4 filas), el malloc reserva espacio para 12 flotantes y guarda un puntero a ese espacio en p->datos.
Supongamos ahora que quiero acceder a la columna 2, fila 3 (x=1, y=2):

a.datos -> la matriz
x -> 1: mueve el puntero al primer lugar
y*a.ancho -> y*cantidad de columnas: se desplaza sobre las filas

Veamos paso a paso. Cada [] es una "casilla" de la matriz, de las reservadas por malloc. Agregué las | para ver mejor las casillas que corresponden a cada fila. ^ indica la "casilla" a la que se apunta luego de la suma

Código:
a.datos     [][][] | [][][] | [][][] | [][][]
            ^

+ x         [][][] | [][][] | [][][] | [][][]
  (1)         ^

+ y*a.ancho [][][] | [][][] | [][][] | [][][]
  (3*2=6)                       ^
Finalmente llego a la posición que necesito. el * al principio indica desreferenciar el puntero, y acceder al valor almacenado.


Saludos.
  #3 (permalink)  
Antiguo 09/11/2010, 09:51
 
Fecha de Ingreso: octubre-2010
Ubicación: Edo. de México
Mensajes: 94
Antigüedad: 13 años, 6 meses
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++
  #4 (permalink)  
Antiguo 10/11/2010, 02:36
Avatar de Lizy94  
Fecha de Ingreso: diciembre-2009
Mensajes: 149
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: significado de linea de código

Mil gracias a ambos. Saludos

Etiquetas: linea
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 07:18.