2016-08-08 47 views
-1

Ich habe 45 Werte in einem Array gespeichert, sample. Es muss in drei einzelne Arrays der Größe 15, sample1, sample2 und sample3 aufgeteilt werden: die ersten 15 Elemente in sample1, die nächsten 15 in sample2 und die restlichen 15 in sample3. Ich habe versucht, dass mit diesem Code zu tun:Ein Array in 3 einzelne Arrays teilen

var 
    sample: array of integer; // Source Array which contains data 
    sample1, sample2, sample3: array of integer; //Target arrays which needs to be worked upon 
    i: integer; 
begin 
SetLength(sample1, 15); 
SetLength(sample2, 15); 
SetLength(sample3, 15); 
for i := 0 to 14 do 
    sample[i] := sample1[i]; 
for i:= 15 to 29 do 
    sample[i] := sample2[i]; 
for i:= 30 to 44 do 
    sample[i] := sample3[i]; 
i := i + 1; 

Ich bin in der Lage, die Ergebnisse in der ersten Reihe zu bekommen, aber nicht in dem anderen Arrays. Was mache ich falsch?

+2

Sie müssen den Index des Quell-Arrays versetzen. * z. B. *, '...: = sample2 [i-15]'. Andernfalls indizieren Sie es falsch (von 15 bis 29). – lurker

+0

Ich habe die Indexierung vor, aber immer noch funktioniert es nicht – delsql

+0

Ihr Code wie gezeigt hat andere Probleme, oder zumindest unvollständig. So wie die Länge von 'sample' nicht eingestellt wird, und es gibt keine Schleife. Bitte zeigen Sie den aktuellen Code an, den Sie zuletzt ohne Fragmentierung versucht haben. – lurker

Antwort

1

Wenn ich Sie gut verstehe, ist das folgende was Sie wollen. Ich nehme an, Ihre sample Array genau 45 Elemente hat, so möchten Sie wahrscheinlich, dies zu tun:

var 
    sample: array of Integer; 
    sample1, sample2, sample3: array of Integer; 
    i: Integer; 
begin 
    SetLength(sample, 45); 
    { fill sample with values } 
    ... 
    { now split: } 
    SetLength(sample1, 15); 
    SetLength(sample2, 15); 
    SetLength(sample3, 15); 
    for i := 0 to 14 do 
    begin 
    sample1[i] := sample[i]; 
    sample2[i] := sample[i + 15]; { i = 0..14, so i+15 = 15..29 } 
    sample3[i] := sample[i + 30]; { i = 0..14, so i+30 = 30..44 } 
    end; 

Das sollte es tun. Wenn dies nicht das ist, was Sie wollten, sollten Sie Ihr Problem etwas besser spezifizieren. Wenn das Array sample länger ist, teilt dies nicht alles auf. Wenn Ihr Array sample kürzer ist, erhalten Sie einen Überlauf, der zu einem Fehler oder einem nicht definierten Verhalten führt.

+0

Ich habe alle Kommentare hier entfernt, weil sie rausgekommen sind von der Hand. Ich werde dies jedoch sagen: Einen Beschuldigten zu beschimpfen, der nur versucht, hilfreich zu sein, ist etwas, das ich nicht schätze. –

+0

@Brad verstanden. Ich persönlich glaube nicht, dass die Beantwortung armer Fragen, ohne die Frage zu beantworten, tatsächlich hilfreich für die Website ist. Vielleicht muss ich die abnehmende Qualität von SO-Fragen akzeptieren. –

+0

FWIW, ich habe die Frage bearbeitet, um sie verständlicher zu machen. Aber ich habe den Code natürlich nicht geändert. –

3

Sie ordnen die Ziel-Arrays dem Quell-Array zu, und nicht umgekehrt. Und Sie verwenden sowieso die falsche Indizierung.

etwas mehr wie diese stattdessen versuchen:

var 
    sample: array of integer; 
    sample1, sample2, sample3: array of integer; 
    i: integer; 
begin 
    ... 
    SetLength(sample1, 15); 
    SetLength(sample2, 15); 
    SetLength(sample3, 15); 
    for i := 0 to 14 do 
    sample1[i] := sample[i]; 
    for i := 0 to 14 do 
    sample2[i] := sample[15+i]; 
    for i := 0 to 14 do 
    sample3[i] := sample[30+i]; 
    ... 

Alternativ:

var 
    sample: array of integer; 
    sample1, sample2, sample3: array of integer; 
    i: integer; 
begin 
    ... 
    SetLength(sample1, 15); 
    SetLength(sample2, 15); 
    SetLength(sample3, 15); 
    for i := 0 to 14 do 
    begin 
    sample1[i] := sample[i]; 
    sample2[i] := sample[15+i]; 
    sample3[i] := sample[30+i]; 
    end; 
    ... 

Da Ihr Ziel-Arrays ohnehin dynamisch ist, würde ich vorschlagen, mit Copy() statt jedes Handbuch bei allen Schleifen:

var 
    sample, sample1, sample2, sample3: array of integer; 
begin 
... 
sample1 := Copy(sample, 0, 15); 
sample2 := Copy(sample, 15, 15); 
sample3 := Copy(sample, 30, 15); 
+1

Ich glaube nicht, dass 'Copy() 'dies in älteren Versionen, wie Delphi 7, die das OP zu verwenden scheint, (Index starten usw.) ausführen kann. Aber ich kann das nicht überprüfen, da ich kein D7 mehr installiert habe. –

+0

WIW, in Ihrem ersten Codeschnipsel gibt es einen 'Anfang' zu viele (Ende der Sekunde' für'). –

+1

@RudyVelthuis Ja kann es. Tatsächlich hat sich die Methode Copy() seit Turbo Pascal nicht viel geändert, wo sie dieselben Parameter wie in den neuesten Versionen von Delphi akzeptiert. – SilverWarior