Una de las bizarradas características de Visual Basic al menos en sus versiones anteriores a VB.NET era la posibilidad de utilizar rangos arbitrarios a la hora de acceder a las posiciones de un array. Es decir, que para un array de n elementos ya no estamos limitados a usar las posiciones [0, n-1], sino cualquier otra: [-1, n-2], [-n, 0], etc.
Lo más común era utilizar el rango [1, n] que puede resultar más natural a la hora de contar los elementos de un array. El problema es que todo esto va en contra de la representación real en memoria de un array: un conjunto de datos del mismo tipo ordenados consecutivamente en memoria. Es precisamente por eso que comenzamos a contar las posiciones de un array en cero:
La posición del primer elemento en el array está en la posición de memoria 0x00fa, el segundo elemento se encuentra en la posición de memoria 0x00fa + 1 (suponiendo que el array contiene tipos que ocupan 1byte) y así sucesivamente.
Aunque hay gente que lo defiende no creo que vayas a crear "mejor código" haciendo esto
for (int i = 1; i<=array.Length; ++i)que haciendo esto:
array[i] = i;
for (int i = 0; i<array.length;++i)
array[i] = i;
De todas maneras ya que a veces puede ser necesario crear este tipo de arrays, por ejemplo para llamar desde .NET a código VB6, podemos disponer de esta funcionalidad por medio de una factoría expuesta por la clase Array, más concretamente, con el método estático Array.CreateInstance:
public static Array CreateInstance (
Type elementType,
int[] lengths,
int[] lowerBounds
)
Necesitamos el tipo de los elementos que almacenará el Array, y además un par de arrays de enteros. El primero define la longitud de cada dimensión del array, por lo que esto nos permite crear arrays multidimensionales. El segundo define el índice inferior de cada una de las dimensiones.
Por ejemplo, para crear un array unidimensional de enteros de tamaño 100, con un índice inferior de 1 haríamos:
Array.CreateInstance( typeof(int), new int[]{100}, new int[]{1})for (int i = 1; i <= 100; ++i)
{
// se debe de usar SetValue y GetValue en un array
a1.SetValue(i,i);
Console.WriteLine(a1.GetValue(i));
}Bueno, y ahora que sabéis cómo hacerlo ¡no lo hagáis! ![]()
2 Comentarios:
En Python también hay cosas raras con la indexación. Puedes hacer cosas tan raras como referirte a elementos de dcha. a izda. dentro del array (lista) utilizando índices negativos.
Puedes comprobarlo en www.python.com
...
www.python.com
¬_¬
Si seguro que en la página de "Pitón" hay multitud de ejemplos de "indexaciones" extrañas :P :P
http://blog.wired.com/gadgets/internet_for.jpg
Publicar un comentario en la entrada