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.
¿Arrays con multiples subindices?. ¿Que es, lo de hola
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.
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|
+-+-+-+
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...
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.
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:
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
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]
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
Vale, ya lo entiendo.
Gracias peña.
S2.
: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
Citar
Q yo sepa los arrays no empienzan desde 0, sino 1 2 3 4....
pues entonces sabes mal.
"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.
Tranquilo, empiezan por 0 como bien te han dicho, almenos en la mayoría de lenguajes ^_^'
sync
Bueno esto ya se ha dicho antes
pero veo que todavia hay dudas :o
si declaras en C/C++
int array[3];
declaras un array de 3 enteros y puedes
acceder a ellos por
array[0];
array[1];
array[2];
no le deis mas vueltas a la tuerca,
un saludo!
EDIT: vaya se me adelanto sync, :oops: