Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Dynamische Arrays in Dynamisches Array vergrößern (https://www.delphipraxis.net/162107-dynamische-arrays-dynamisches-array-vergroessern.html)

Helmi 6. Aug 2011 22:37

Dynamische Arrays in Dynamisches Array vergrößern
 
Hallo,

ich steh grad auf dem Schlauch:

Ich hab ein dynamisches Array das wie folgt aufgebaut ist:

Delphi-Quellcode:
type
  TSI_Daten = packed record
    MD36998 : array [0..1] of String;
    MD36999 : array [0..1] of String;
    MD1399  : String;
  end;

{...}

var
  SI_Achs_Array : array of TSI_Daten;

{...}

und wird so verwendet:

Delphi-Quellcode:
        //Setzen der Array-Größe (nur wenn die Größe nicht passt)
        If length(SI_Achs_Array) < i_Ax_Drv_Nr then
          SetLength(SI_Achs_Array, i_Ax_Drv_Nr);

        //abhängig vom Maschinendatum ins Array schreiben
        If i_Pos_MD36998 = 1 then
          SI_Achs_Array[Pred(i_Ax_Drv_Nr)].MD36998[i_Index] := S_Wert;

        If i_Pos_MD36999 = 1 then
          SI_Achs_Array[Pred(i_Ax_Drv_Nr)].MD36999[i_Index] := S_Wert;

        If i_Pos_MD1399 = 1 then
          SI_Achs_Array[Pred(i_Ax_Drv_Nr)].MD1399 := S_Wert;
Das ging bisher ganz gut - nur hat sich jetzt der Datensatz verändert. Dadurch kann
i_Index größer 1 werden.

Nun wollt ich MD36998 und MD36999 auf dynamische Array umstellen und die größe
der zwei Variablen via SetLength vergrößern.

So hab ich es probiert:

Delphi-Quellcode:
        If i_Pos_MD36998 = 1 then
          If length(SI_Achs_Array[Pred(i_Ax_Drv_Nr)].MD36998) < i_Index then
            SetLength(SI_Achs_Array[Pred(i_Ax_Drv_Nr)].MD36998, i_Index);

        If i_Pos_MD36999 = 1 then
          If length(SI_Achs_Array[Pred(i_Ax_Drv_Nr)].MD36999) < i_Index then
            SetLength(SI_Achs_Array[Pred(i_Ax_Drv_Nr)].MD36999, i_Index);
Aber so werden die Variablen nicht erhöht.

Nun meine Frage: Wie kann ich dynamische Arrays in einem dynamischen Array vergrößern?

himitsu 7. Aug 2011 06:56

AW: Dynamische Arrays in Dynamisches Array vergrößern
 
Die Zeile
Delphi-Quellcode:
         If length(SI_Achs_Array) < i_Ax_Drv_Nr then
          SetLength(SI_Achs_Array, i_Ax_Drv_Nr);
Hast du aber drinnengelasen?


[add]
Ahhh, an deiner Stelle würde ich mit
Delphi-Quellcode:
If High(...) < i_Index then
oder
Delphi-Quellcode:
If Length(...) <= i_Index then
prüfen, da i_Index wohl direkt den 0-basierten Index darstellt (oder du hast im Zugriff das Pred vergessen) und i_Ax_Drv_Nr anscheinend ein 1-basierender Index ist.

Tipp: Aktiviere auch mal (bevor zu was änderst) in den Projektoptionen die Index-Prüfung. :angle2:
Und ja, beim ersten Durchlauf wird das Array nicht vergrößerst, da i_Index vermutlich 0, Length auch 0 und somit
Delphi-Quellcode:
0 < 0
natürlich nicht zutrifft.

FredlFesl 7. Aug 2011 08:51

AW: Dynamische Arrays in Dynamisches Array vergrößern
 
Bisserl unübersichtlich, findest du nicht?
Ich würde es so probieren:
Delphi-Quellcode:
type
  TDataArray = Array Of String;
  TSI_Daten = packed record
    MD36998 : TDataArray;
    MD36999 : TDataArray;
    MD1399  : String;
  end;

{...}
var
  SI_Achs_Array : array of TSI_Daten;
{...}
Procedure AddValueToArray (Var aArray : TDataArray; aIndex : Integer; aValue : String);
Begin
  If aIndex >= High(aArray) Then
    SetLength (aArray, aIndex + 1);
  aArray[aIndex] := aValue;
End;

{...}
Var
  iAchse : Integer;
{...}
  iAchse := Pred (i_Ax_drv_Nr);
 
  If iAchse >= High(SI_Achs_Array) Then
    SetLength (SI_Achs_Array, iAchse + 1);
 
  If i_Pos_MD36998 = 1 then
    AddValueToArray (SI_Achs_Array[iAchse].MD36998, i_Index, S_Wert);

  If i_Pos_MD36999 = 1 then
    AddValueToArray (SI_Achs_Array[iAchse].MD36999, i_Index, S_Wert);
Zitat:

Zitat von himitsu (Beitrag 1115445)
Tipp: Aktiviere auch mal (bevor zu was änderst) in den Projektoptionen die Index-Prüfung.

Ist doch bei dynammischen Arrays sinnlos, oder?

Uwe Raabe 7. Aug 2011 09:35

AW: Dynamische Arrays in Dynamisches Array vergrößern
 
Zitat:

Zitat von FredlFesl (Beitrag 1115449)
Zitat:

Zitat von himitsu (Beitrag 1115445)
Tipp: Aktiviere auch mal (bevor zu was änderst) in den Projektoptionen die Index-Prüfung.

Ist doch bei dynammischen Arrays sinnlos, oder?

Das Range-Checking wird zur Laufzeit durchgeführt und wirkt sehr wohl auch bei dynamischen Arrays.

FredlFesl 7. Aug 2011 09:43

AW: Dynamische Arrays in Dynamisches Array vergrößern
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1115467)
Das Range-Checking wird zur Laufzeit durchgeführt und wirkt sehr wohl auch bei dynamischen Arrays.

Tatsache. Und ich dachte immer... :wall:

Helmi 7. Aug 2011 09:57

AW: Dynamische Arrays in Dynamisches Array vergrößern
 
Zitat:

Zitat von himitsu (Beitrag 1115445)
Die Zeile
Delphi-Quellcode:
         If length(SI_Achs_Array) < i_Ax_Drv_Nr then
          SetLength(SI_Achs_Array, i_Ax_Drv_Nr);
Hast du aber drinnengelasen?

Ja natürlich - habs nur nicht in den Thread geschrieben!
Aber brauchen tu ich es ja...

Zitat:

Zitat von himitsu (Beitrag 1115445)
Ahhh, an deiner Stelle würde ich mit
Delphi-Quellcode:
If High(...) < i_Index then
oder
Delphi-Quellcode:
If Length(...) <= i_Index then
prüfen, da i_Index wohl direkt den 0-basierten Index darstellt (oder du hast im Zugriff das Pred vergessen) und i_Ax_Drv_Nr anscheinend ein 1-basierender Index ist.

Da war der Fehler begraben!
Du hast recht, i_Ax_Drv_Nr ist 1-basierened, i_Index 0-basierend.
Habs einfach übersehen.

Zitat:

Zitat von himitsu (Beitrag 1115445)
Tipp: Aktiviere auch mal (bevor zu was änderst) in den Projektoptionen die Index-Prüfung. :angle2:

Die Indexprüfung ist immer aktiv! Und von der hab ich ja einen Fehler gemeldet bekommen.

Zitat:

Zitat von FredlFesl (Beitrag 1115449)
Bisserl unübersichtlich, findest du nicht?

klar mag es unübersichtlich sein! Aber das war erstmal nur ein Test. Wenn alles funktioniert kann ich es ja noch verschönern/verbessern

FredlFesl 7. Aug 2011 13:03

AW: Dynamische Arrays in Dynamisches Array vergrößern
 
Zitat:

Zitat von Helmi (Beitrag 1115473)
klar mag es unübersichtlich sein! Aber das war erstmal nur ein Test. Wenn alles funktioniert kann ich es ja noch verschönern/verbessern

Ich wollte damit andeuten, das übersichtliche Programmierung Fehler dieser Art von vorneherein vermeidet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz