2016-10-08 3 views
2

Gibt es eine Möglichkeit zu zählen, wie viele Elemente in einem Array mit Code vorhanden sind?Zählen Sie, wie viele Elemente im Array

zum Beispiel:

arrName : array[1..20] of string; 

Ich weiß schon, dass es sechs Namen in diesem Array gespeichert ist, aber wie kann ich das bestimmen, verwenden Codierung?

+0

Warum verwenden Sie kein dynamisches Array? Dann würdest du es wissen, indem du length (arrName) verwendest ... –

+0

Es ist für eine Schuletätigkeit ... und sie bestehen darauf, dass ich diese –

+0

benutze, dann iteriere das Array und zähle ... –

Antwort

7

Ja, aber nur, wenn das Array verwaltete Typen enthält.
Sehen Sie sich das folgende Codebeispiel an.

procedure TForm1.Button1Click(Sender: TObject); 
var 
    sa: array[0..19] of string; 
    i: Integer; 
begin 
    for i := 0 to 5 do 
    sa[i]:= 'test'+IntToStr(i); 
    for i := 6 to High(sa) do begin 
    if sa[i] <> '' then ShowMessage('oops'); //will never be triggered. 
    end; 
end; 

Beachten Sie, dass die leere Zeichenfolge aka '' eine gültige Zeichenfolge ist. Wenn Sie zulassen, dass das Programm leere Zeichenfolgen in diesem Array speichert, schlägt Ihr Schema fehl. Wenn dies der Fall ist, müssen Sie das Array mit einer Platzhalterzeichenfolge initialisieren.

Managed-Typen sind leer initialisiert
Wenn Sie diese Probe debuggen und die CPU-Fenster zu öffnen, werden Sie die folgende Initialisierungscode sehen:

Unit1.pas.30: begin 
005C9B24 55    push ebp 
005C9B25 8BEC    mov ebp,esp 
...... 
005C9B3F E8F811E4FF  call @InitializeArray 
...... 
Unit1.pas.31: for i := 0 to 5 do 

In der begin Anweisung ein Aufruf gemacht wird InitializeArray, da das Array string enthält.

If the array contains: string, interface , dynamic array, variant or anonymous method (or records containing any of these) then it will be initialized.

Nicht verwaltete Typen sind nicht
Wenn das Array enthält etwas anderes wird es nicht initialisiert werden initialisiert; was bedeutet, dass es alles enthalten wird, was vorher in diesem Teil der Erinnerung war.

procedure TForm1.Button1Click(Sender: TObject); 
var 
    sa: array[0..19] of integer; 
    i: Integer; 
begin 
    for i := 0 to 5 do 
    sa[i]:= i+1; 
    for i := 6 to High(sa) do begin 
    //will most likely be triggered 
    if sa[i] <> 0 then ShowMessage('no init for integer'); 
    end; 
end; 

(Offensichtlich ein **dynamic** array (ein Array ohne vorgegebene Grenzen wird) vor der Verwendung auf Null gesetzt werden und bei der Erweiterung)

Dies nicht zu den Teilnehmern gilt
Alle Mitglieder (auch bekannt als Felder) einer Klasse werden auf Null initialisiert, wenn ein Objekt (Instanz dieser Klasse) erstellt wird.
Global variables are also zero initialized. Variablen lokal zu einer Methode sind nicht.

Clever Programmierung
Wenn Sie irgendwie eine feste Länge Array zu verwenden sind gezwungen, eine variable Anzahl von Strings zu speichern, ist es verschwenderisch die Anzahl der Elemente zu zählen, durch die Anordnung durchquert.
Viel besser, einen Zähler zu haben, der die Anzahl der Elemente verfolgt.

type 
    TNames = record 
    count: integer; 
    items: array[0..20] of string; 
    end; 

Sonst fallen Sie in eine Schlemiel the painter Falle; ein bekanntes Antipattern.

+0

Als Zuschauer ist dies eine sehr gute Antwort! – AdrianGW

+1

Leere Zeichenfolge ist eine gültige Zeichenfolge. Wenn es nicht als Sentinel reserviert werden kann, fällt es auseinander. –

0
procedure TForm1.Button1Click(Sender: TObject); 
var 
    i, ArrayCount: integer; 
    ArrName : Array[1..20] of string; 
begin 
    ArrayCount := 0; 
    ArrName[1] := 'Bob'; 
    ArrName[2] := 'Bill'; 
    for i := low(ArrName) to high(ArrName) do 
    if ArrName[i] <> '' then 
     inc(ArrayCount); 

    showmessage(IntToStr(ArrayCount)); 
end; 

Sie können auch eine Funktion zum Zählen Sie Ihre Array für Sie erstellen:

function ArrayValueCount(const InputArray: Array of string): integer; 
var 
    i: integer; 
begin 
    result := 0; 
    for i := low(InputArray) to high(InputArray) do 
    if InputArray[i] <> '' then 
     inc(result); 
end; 
0

So haben Sie eine feste Größe Array von 20 Elementen, aber nicht alle von ihnen sind gültig Saiten.

Eine Option besteht darin, die Anzahl der gültigen Elemente beim Füllen des Arrays in einer speziellen Variablen zu verfolgen. Diese Variable beginnt mit 0, und jedes Mal, wenn Sie dem Array eine Zeichenfolge hinzufügen, inkrementieren Sie sie. Dies setzt voraus, dass alle gültigen Elemente in einem zusammenhängenden Bereich vom Start des Arrays liegen (d. H. Es gibt keine Lücken und "leere" Elemente werden nur am Ende gefunden). Dies ist, wie Klassen wie TList verfolgen die Anzahl ihrer Artikel.

Da in diesem Fall die Elemente Zeichenfolgen sind, können Sie einfach die gültigen Zeichenfolgen zählen. Zeichenfolgen werden auf '' initialisiert, so dass Sie einfach nach '' testen können. Um die Dinge später zu vereinfachen, definieren Sie zunächst einen Typ für das Array. Dann können Sie eine Variable dieses Typs deklarieren und diesen Typ in einer Parameterdeklaration wiederverwenden.

type 
    TStringArray = array[1..20] of string; 

var 
    arrName: TStringArray; 

function ItemCount(const A: array of string): Integer; 
var 
    I: Integer; 
begin 
    Result := 0; 
    for I := Low(A) to High(A) do 
    if A[I] <> '' then 
     Inc(Result); 
end; 

Natürlich funktioniert das nur, wenn '' kein gültiger Eintrag ist.

Verwandte Themen