2010-11-03 13 views
8

Quiero hacer una ArrayList en Delphi 5.0. Así que encontré una solución que hace este código:¿Matriz comienza desde 0 o 1 en Delphi 5.0 Pascal?

var arr: array of String; 

bien, pero cada vez que agrego algo que hago esto:

var 
    Form1: TForm1; 
    var arr : array of String; 

procedure TForm1.Button1Click(Sender: TObject); 
var aux :string; 
var len:integer; 
begin 
    len := Length(arr) + 1; 
    SetLength(arr, len); 
    arr[len-1] := 'abc' + IntToStr(len); 
    Button1.Caption := arr[len-1]; // just to writeout something 
end; 

Soy un programador de C++, y yo no sé nada acerca de Pascal . Siempre escuché que el índice de Pascal comienza en 1, no en 0. Como en el procedimiento anterior, hago arr [len-1] porque comienza el índice 0.

¿Hay una mejor manera que las matrices de Pascal? Al igual que con C++ 's std::vector?

Respuesta

34

matrices dinámicas índices empezar de cero

var 
    a: array of Integer; 
begin 
    SetLength(a, 500); 
    a[0] := 0; 

matrices estáticas pueden tener índices arbitrarios

var 
    i: Integer; 
    b: array [50..100] of Integer; 
    c: array[-10..10] of Integer; 
begin 
    for i := 50 to 100 do b[i] := i * i; 

    // Note negative starting index above in declaration 
    for i := -10 to 10 do c[i] := i * i; 

Strings' índices comienzan con una

var 
    c: String; 
begin 
    c := 'Zap!'; 
    c[1] := 'W'; 
    ShowMessage(c); /// shows 'Wap!' 

De todos modos siempre puede usar las funciones Baja() y Alta() que devuelven el índice inferior y superior de una matriz.

para manejar una lista de cadenas de la clase más comúnmente utilizado es TStringList que se encuentra en la unidad Clases.

+2

No he usado Pascal durante mucho tiempo, pero si la memoria funciona bien, la razón para los índices de cadena comienzan desde 1 es porque el primer elemento es la longitud de la cadena, y puede editar directamente para cambiar la longitud –

+0

Ahora esta es la respuesta anticuado. En el compilador NextGen Delphi, el índice de cadena está basado en 0. – jachguate

+5

+ jachguate ¿Cómo es que esta respuesta está desactualizada cuando las preguntas son sobre "Delphi 5.0 Pascal"? :-) – Trinidad

10

Lo que está utilizando se conoce como dynamic array que es diferente de una matriz clásica Pascal. Los arrays dinámicos son de tamaño variable y el índice está basado en 0.

Las matrices clásicas de Pascal no están basadas en 0 ni en 1 ... Corresponde al programador dónde comienza o termina el índice. La única restricción del compilador es que el índice debe ser de tipo ordinal. Se puede declarar

procedure x; 
    var 
     IntArr: array[50..75] of Integer; 
     StrArr: array[0..49] of string; 
     DblArr: array[1..10] of Double; 
+1

¿Estás seguro de esa "breve declaración"? –

+1

Quizás pueda agregar una matriz con un índice de tipo enum como 'array [TAlign] of ...'. –

+0

@Ulrich: Tienes razón ... ese _short_ dije de memoria simplemente no compila. Mi respuesta se actualiza ahora – jachguate

6

Delphi Pascal también tiene una buena característica que ayuda iteración a través de una matriz de cualquier dimensión:

simplemente usar para i:= Low(Array) to High(Array) do.... que es completamente transparente para offset inicial es decir, 0,1 o 5 o lo que sea.

0

Traté de editar la respuesta anterior para mejorarla, pero el editor sigue rechazando mi publicación. Las matrices pueden tener negativos índices.

var 
    A:array[-20..9] of integer; 
    B:array[-30..-10] of integer; 

Estos son ambos el mismo, un conjunto de 20 números enteros pero no se tratará de la misma por el compilador porque el intervalo de índice es diferente. Le permite hacer que los datos se ajusten al dominio del problema, no al revés.

Ahora, una cadena como var S:string[200]; es técnicamente equivalente a var s:packed array[0..200] of char, donde el byte 0 es la longitud, excepto cuando se utiliza una cadena sin longitud o la longitud especificada es mayor que 255, entonces la cadena es de 1 a cualquier tamaño actual, es .Como las cadenas pueden ser dinámicas, no es bueno depender del elemento 0 para contener la longitud.

0

Cuando usa SetLength(array, length), vale la pena mencionar que tiene índices que comienzan desde 0 como se mencionó hasta la longitud-1. También en índice pascal en matriz puede ser un carácter de la tabla ANSI. Entonces puede definir una matriz como a:array['A'..'Z'] of integer. Esto es útil cuando necesitas todos los personajes de tus Cuerdas o Char Array.

Cuestiones relacionadas