AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Dynamische Arrays in Dynamisches Array vergrößern

Dynamische Arrays in Dynamisches Array vergrößern

Ein Thema von Helmi · begonnen am 6. Aug 2011 · letzter Beitrag vom 7. Aug 2011
Antwort Antwort
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.304 Beiträge
 
Delphi XE2 Professional
 
#1

Dynamische Arrays in Dynamisches Array vergrößern

  Alt 6. Aug 2011, 23:37
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?
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.607 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Dynamische Arrays in Dynamisches Array vergrößern

  Alt 7. Aug 2011, 07:56
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 If High(...) < i_Index then oder 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.
Und ja, beim ersten Durchlauf wird das Array nicht vergrößerst, da i_Index vermutlich 0, Length auch 0 und somit 0 < 0 natürlich nicht zutrifft.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 7. Aug 2011 um 08:00 Uhr)
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#3

AW: Dynamische Arrays in Dynamisches Array vergrößern

  Alt 7. Aug 2011, 09:51
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);
Tipp: Aktiviere auch mal (bevor zu was änderst) in den Projektoptionen die Index-Prüfung.
Ist doch bei dynammischen Arrays sinnlos, oder?
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.677 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Dynamische Arrays in Dynamisches Array vergrößern

  Alt 7. Aug 2011, 10:35
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#5

AW: Dynamische Arrays in Dynamisches Array vergrößern

  Alt 7. Aug 2011, 10:43
Das Range-Checking wird zur Laufzeit durchgeführt und wirkt sehr wohl auch bei dynamischen Arrays.
Tatsache. Und ich dachte immer...
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.304 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Dynamische Arrays in Dynamisches Array vergrößern

  Alt 7. Aug 2011, 10:57
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...

Ahhh, an deiner Stelle würde ich mit If High(...) < i_Index then oder 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.

Tipp: Aktiviere auch mal (bevor zu was änderst) in den Projektoptionen die Index-Prüfung.
Die Indexprüfung ist immer aktiv! Und von der hab ich ja einen Fehler gemeldet bekommen.

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
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#7

AW: Dynamische Arrays in Dynamisches Array vergrößern

  Alt 7. Aug 2011, 14:03
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.
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 07:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf