Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Enorme desánimo (ARRAYS multiples subindices)

Iniciado por J_F_NASH, 06 de Mayo de 2003, 09:52:04 AM

« anterior - próximo »

J_F_NASH

                                El asunto es que estoy siguiendo un libro "Cómo programar en C/C++ (Deitel)" y he llegado al tema de los arrays.
Todo parece sencillo pero llego a un punto que ¡no entiendo EN ABSOLUTO!. Me refiero a los ARRAYS CON MULTIPLES SUBINDICES.

Si por favor podeis darme algunos consejillos, sugerencias, trucos,... Entiendo como funciona un ARRAY pero con multiples subindices ya no se pa donde tirar.




Gracias de antemano.

S2.                                

rrc2soft

                                ¿Arrays con multiples subindices?. ¿Que es, lo de hola
  • [y]?                                

J_F_NASH

                                Arrays multidimensionales es exactamente lo que no entiendo.

Por ejemplo:

a [2] [3] = {{1, 2} {3, 4}}


¿Cual sería el valor de 2 y 3?




S2.                                

sés

                                No son más que tablas de dos dimensiones, donde un índice es la columna y otro la fila (X e Y).

Ejemplo:
int t[3][2];



Esto daría algo como:
+-+-+-+

|0|0|0|

+-+-+-+

|0|0|0|

+-+-+-+



Si hacemos:
t[2][1] = 4;  // Columna 2, fila 1



Tenemos:
+-+-+-+

|0|0|0|

+-+-+-+

|0|0|4|

+-+-+-+

                               
Soy indeciso... ¿o no?

Grugnorr

                                Nunca me ha gustado inicializar así los arrays, pero..



a [2] [3] = {{1, 2} {3, 4}}



Eso es una warrería ;), inicializa 2 de los 3 pares, quedando
a [2] [3] = {{1, 2} ,{3, 4},{basura,basura}}

Citar¿Cual sería el valor de 2 y 3?

:?: , me temo que andas confundido(será la noche ;))  :I .  la sentencia esa declara el array, rellenando algunos de sus contenidos. Pero ni existe a[2][3], porque los arrays se indexan empezando por 0 hasta dimensión -1, ni a[][2] o algo así es posible.

El post de sés te ayudará a comprenderlo...                                
hat the hells!

J_F_NASH

                                A ver, comienzo a entender pero os pido que tengais paciencia, no tengo ni idea de programación (soy grafista) y hay cosas que no me cuadran.  

En el ejemplo sés:
t[2][1] = 4
Entiendo lo que sigue:

0  1  2  (columna 0, columna 1, columna 2)
---------
0  0  0 (fila 0)
0  0  4 (fila 2)
El tema es, por lo que veo en el ejemplo, que comienzo a contar filas y columnas empezando con cero, uno, dos, ...

Pero el otro ejemplo no parece seguir esa lógica:
int t[3][2]

0  1  2  3 (¿NO DEBERAMOS INDICAR COLUMNA 3 Y FILA 2?)
------------
0  0  0   ?
0  0  0   ?
?  ?  ?   ?

¿Que es lo que planteo mal?

No se si me explico.




S2.                                

rrc2soft

                                A ver si lo he cogido...
Citar
Pero el otro ejemplo no parece seguir esa lógica:  
int t[3][2]  

0 1 2 3 (¿NO DEBERAMOS INDICAR COLUMNA 3 Y FILA 2?)  
------------  
0 0 0 ?  
0 0 0 ?  
? ? ? ?  
Cuando dices int t[3][2], estas declarando un array bidimensional de 3 columnas y 2 filas.


0 1 2

-------

0 0 0  | 0

0 0 0  | 1

(como puedes ver aqui hay 3 columnas y 2 filas. Pero mira los indices...)


...pero si llegaste a ver los array unidimensionales (char str[n]), te acordaras de que en C los array empiezan en 0, y acaban en n-1. Lo mismo pasa con los multidimensionales.
Cuando declaras un array
  • [y], estas construyendo un armario con "x" columnas e "y" filas de cajones. Eso si, tu primer cajon (esquina superior izq.) no será el [1][1], sino el
  • , y tu ultimo cajon (esquina inferior dch.) no será el
  • [y], sino el [x-1][y-1].


    0 1 2 ... x-1

    ---------------

    0 0 0 ...  0 | 0

    0 0 0 ...  0 | 1

    . . . ...  . | ...

    0 0 0 ...  0 | y-1



    PD: No te querajas de los peazo de profesores que tenemos aqui, eh?  :ojo:                                

fiero

                                No es por liar, pero yo siempre pienso en los arrays bidimensionales al revés que como ha explicado rrc2soft, o sea, declarados como array[y]
  • . Con lo cual, un array[3][2] estaría representado así:


     0  1

    --------

     X  X    0

     X  X    1

     X  X    2



    Así, si recorremos todas las posiciones del array una a una, se leen de izquierda a derecha y de arriba a abajo, tal y como se almacena en la memoria.

    un saludo                                
www.videopanoramas.com Videopanoramas 3D player

sés

                               
CitarNo es por liar, pero yo siempre pienso en los arrays bidimensionales al revés que como ha explicado rrc2soft, o sea, declarados como array[y]
  • . Con lo cual, un array[3][2] estaría representado así:
     0  1

    --------

     X  X    0

     X  X    1

     X  X    2



    Así, si recorremos todas las posiciones del array una a una, se leen de izquierda a derecha y de arriba a abajo, tal y como se almacena en la memoria.

    un saludo
Realmenteo NO existen ni filas ni columnas, eso es sólo un criterio de cada uno. Lo que sí está claro es que si llenas la memoria que ocupa esa tabla, usando un contador:

int t[3][2];

int x, y;

int *p = (int *)t;



for( int x=0; x<3*2; x++ ) p[x] = x;



for( y=0; y<2; y++ ) {

 for( x=0; x<3; x++ ) {

   printf( "%d,", t[x][y] );

 }

 printf( "n" );

}



el resultado sería:

0,2,4,

1,3,5,



¿Por qué?

t[3][2] es lo mismo que decir TRES tablas de DOS elementos:

t[0] contiene una tabla tal que: t0[2]
t[1] contiene una tabla tal que: t1[2]
t[2] contiene una tabla tal que: t2[2]

y en memoria, t0, t1 y t2 están consecutivas:

 t0     t1     t2  

------ ------ ------

[0][1] [2][3] [4][5]

                               
Soy indeciso... ¿o no?

fiero

                               
Citar
Realmenteo NO existen ni filas ni columnas, eso es sólo un criterio de cada uno.

En eso tienes toda la razón, lo de filas y columnas es solo un artificio humano.

Y ya que computacionalmente da lo mismo de las dos maneras. Lo que yo digo es que es más "natural" aprenderse los arrays multiples en el otro sentido: array[y]
  • , la razón es por como se organiza la memoria del ordenador.
    Por ejemplo la de video, si tu pones un pixel accediendo directamente a la memoria de video, luego incrementas la dirección de memoria y vuelves a escribir otro pixel, se obserba que el 2º pixel aparece a la derecha del 1º. Sería lógico pensar que incrementando el puntero que accede a un array bidimensional en una posición, se acceda tambien una posición a la derecha; no una posición hacia abajo como muy bien demuestra el bucle de relleno de sés.

    Para gustos los colores, dos formas de ver la misma cosa...

    un saludo                                
www.videopanoramas.com Videopanoramas 3D player

J_F_NASH

                                Vale, ya lo entiendo.




Gracias peña.





S2.                                

MaSteR

                                :D


.......................................







Q yo sepa los arrays no empienzan desde 0, sino 1 2 3 4.... :P no se si lo habeis contestado y nuse pa q m meto yo aki si ya se ha enterao :D lol                                

fiero

                               
Citar
Q yo sepa los arrays no empienzan desde 0, sino 1 2 3 4....  

pues entonces sabes mal.                                
www.videopanoramas.com Videopanoramas 3D player

J_F_NASH

                                "MaSteR escribió:

Q yo sepa los arrays no empienzan desde 0, sino 1 2 3 4.... "



Vale, no lo entiendo.
Un ARRAY empieza con 0. Si esto es así todo me cuadra. Sino... volvamos a empezar.



S2.                                

synchrnzr

                                Tranquilo, empiezan por 0 como bien te han dicho, almenos en la mayoría de lenguajes ^_^'

sync                                






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.