dynamische Zuweisung mehrdimensionales Array

Für Fragen von Einsteigern und Programmieranfängern...
Benutzeravatar
Beach
Lazarusforum e. V.
Beiträge: 44
Registriert: Di 2. Nov 2021, 22:41
OS, Lazarus, FPC: Lazarus 3.0RC1 (rev lazarus_3_0_RC1-10-gfe49fef4fc) FPC 3.2.2 x86_64-win64-win32
CPU-Target: 64Bit
Wohnort: Hunsrück

dynamische Zuweisung mehrdimensionales Array

Beitrag von Beach »

Ich bin aktuell einfach verschiede Sachen am ausprobieren um wieder etwas mehr Übung zu bekommen. Nun scheitere ich bei der dynamischen Zuweisung eines mehrdimensionalen Array.
Ich lese eine TXT Datei in eine Stringlist und übergebe diese an meine Funktion. In der Datei gibt es am Ende den Bereich [Data] wo mehrere Werte Kommaseperiert angegeben sind. Die Anzahl der Werte in einer Zeile kann dabei von 2 bis 7 variieren und die Anzahl der Zeilen ebenfalls.
Beispiel:

Code: Alles auswählen

[Data]
1099.97049364,1099.96941205
1099.97049364,1099.96838455
1099.97049364,1099.97343712
859.94872536,859.94240791
859.94872536,859.95336941
859.94872536,859.95046989

Nun möchte ich diese Werte aufgesplittet in einem 2 dimensionalen Array (Teil eines Record) haben.
Dazu durchlaufe ich die Stringlist von der Zeile in der die Daten anfangen bis zum Ende und weiße dem HIlfsarray 'a' durch meine Funktion explode(), die anhand eines Trennzeichen den String zerlegt, die einzelnen Werte zu.
Nun durchlaufe ich das Hilfsarray 'a' vom Low() bis zum High() Wert und möchte dem mehrdimensionalen Array 'Data' diese Werte dynamisch zuweisen.
Soweit ich das bis jetzt sehe, wird bei Result.Data[j][k] := a[k]; eine Exeption "External: SIGSEGV" ausgelöst.

Ich stehe total auf dem Schlauch und hoffe jemand blickt durch was ich da machen will.
Wenn mehr Infos/Code gebraucht wird, einfach sagen was.

Vielen Dank

Code: Alles auswählen

function TClassZeissERG.Analyse(StrList: TStringList): TERGValues;

var
  i, j, k, m, n: integer;              //Zählvariablen
  a: array of string;                  //Zwischenarray

begin
  Result.Error := False;
  Result.ErrorNum := 0;
  Result.ErrorText := '';

  Result.Text := StrList[0];


  // In der ersten Zeile muss '[Header]' stehen sonst ist es keine gültige ERG Datei


  if Result.Text <> '[Header]' then
  begin
    Result.Error := True;                                 // Fehlermeldung bei falschem
    Result.ErrorNum := 1000;                              // Datenformat
    Result.ErrorText := 'Keine passenden Daten gefunden';
  end
  else
  begin

    Result.cmmnr := explode('=', StrList[1], 1);          // Aufsplitten der Datei in
    Result.cmmType := explode('=', StrList[2], 1);        // den vorgesehenen Record
    Result.aufgabe := explode('=', StrList[3], 1);        // Nochmal überarbeiten
    Result.modus := explode('=', StrList[4], 1);          // Auswertung eingekürzt


    if StrList[25] = '[Data]' then                     // In Zeile 26 MUSS [Data] stehen.
    begin
      i := 26;                                         // Auswertung ab Zeile 27
      j := 0;                                          // Zähler nullen
      k := 0;
      m := 0;
      n := 0;
      while i <= StrList.Count - 1 do                  //Durchlauf ab Zeile 27 bis Listenende
      begin
        if (Result.aufgabe[1] = 'DIST') or
           (Result.aufgabe[1] = 'KUGELST') then    // Voraussetzung für die Auswertung
        begin                                      // Zuweisung in ein Zwischenspeicherarray

          a := explode(',', StrList[i], 5);            // Messwerte aufplitten
          setlength(Result.Data, j + 1, high(a));      // 2D Array Dimensionieren
          m := Low(a);
          n := High(a);

          for k := m to n do
            // Alle Einträge im Zwischenspeicherarray durchlaufen und im 2D Array ablegen
          begin
            Result.Data[j][k] := a[k];
          end;
          Inc(j);                                       // Zähler 1. Dimension erhöhen
          k := 0;                                       // Zähler Zwischenarray zurücksetzen

        end
        else
        begin                                          // Fehlermeldung bei falscher "aufgabe"
          Result.Error := True;
          Result.ErrorNum := 1001;
          Result.ErrorText := 'Nur Daten im Modus DIST oder KUGELST implementiert';

        end;

      end;

    end;

  end;
end;
MfG
Beach

Shit happens... Always in my shift

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: dynamische Zuweisung mehrdimensionales Array

Beitrag von wp_xyz »

Es wäre hilfreich zu wissen, die der Typ TERGValues deklariert ist.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: dynamische Zuweisung mehrdimensionales Array

Beitrag von Winni »

Hi!

Zeig mal bitte die Definition von

TERGValues

Winni

Ups - wp_xyz war schneller

Benutzeravatar
Beach
Lazarusforum e. V.
Beiträge: 44
Registriert: Di 2. Nov 2021, 22:41
OS, Lazarus, FPC: Lazarus 3.0RC1 (rev lazarus_3_0_RC1-10-gfe49fef4fc) FPC 3.2.2 x86_64-win64-win32
CPU-Target: 64Bit
Wohnort: Hunsrück

Re: dynamische Zuweisung mehrdimensionales Array

Beitrag von Beach »

Gerne...
Aber der Fehler war eigentlich ganz simpel. Habe das Array dynamisch dimsnioniert aber mit nur einer 1 wertigen 2. Dimension, brauchte aber mindestens eine 2 wertige. Also einfach den High() Wert vom Zwischenspeicherarray +1 nehmen.

Code: Alles auswählen

          setlength(Result.Data, j + 1, high(a)+1);      // 2D Array RICHTIG Dimensionieren
 
Nun gab es nur noch eine kleine Endlosschleife da ich den Schleifenzähler 'i' nicht erhöht habe. Das war dann einfach:

Code: Alles auswählen

          Inc(j);                                       // Zähler 1. Dimension erhöhen
          Inc(i);                                       // auch den Schleifenzähler erhöhen!!
Manchmal hilft es doch wenn man einfach mal darüber schreibt. Dann fällt es einem wie Plattfische von den Augen.
Aber vielen Dank das Ihr euch die Mühe macht.

Code: Alles auswählen

  
    TStringArray = array of string;
   TStringArray2D = array of array of string;

  
  TERGValues = record
    Text: string;
    cmmnr: TStringArray;
    cmmType: TStringArray;
    aufgabe: TStringArray;
    modus: TStringArray;
    axis: TStringArray;
    posX: TStringArray;
    posY: TStringArray;
    posZ: TStringArray;
    tempX: TStringArray;
    tempY: TStringArray;
    tempZ: TStringArray;
    alphaX: TStringArray;
    alphaY: TStringArray;
    alphaZ: TStringArray;
    tempW: TStringArray;
    alphaW: TStringArray;
    u1K1: TStringArray;
    u1K2: TStringArray;
    u1K3: TStringArray;
    anwender: TStringArray;
    date: TStringArray;
    bezeichnung: TStringArray;
    dkd: TStringArray;
    Data: TStringArray2D;

    Error: boolean;
    ErrorNum: word;
    ErrorText: string;
  end;
MfG
Beach

Shit happens... Always in my shift

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: dynamische Zuweisung mehrdimensionales Array

Beitrag von wp_xyz »

Warum speicherst du numerische Größen (PosX, PosY, ...) eigentlich in einem StringArray? So musst du bei jedem Zugriff z.B. auf ein Element von PosX eine String-zu-Integer (oder zu-Float)-Umwandlung durchführen. Ich fände es viel geschickter, die Strings gleich beim Einlesen in ein Integer-Array (oder Double-Array, je nachdem) umzuwandeln. Das einzig Verwirrende dabei ist, das TIntegerArray kein dynamisches Array ist, sondern eines über den ganzen Integer-Raum. TIntegerDynArray aus der Unit Types wäre das dynamische Array, oder analog dazu TDoubleDynArray, usw. Ein weiterer Vorteil wäre, dass du dich nur 1x um die richtige Behandlung des Dezimal-Punktes kümmern musst.

Benutzeravatar
Beach
Lazarusforum e. V.
Beiträge: 44
Registriert: Di 2. Nov 2021, 22:41
OS, Lazarus, FPC: Lazarus 3.0RC1 (rev lazarus_3_0_RC1-10-gfe49fef4fc) FPC 3.2.2 x86_64-win64-win32
CPU-Target: 64Bit
Wohnort: Hunsrück

Re: dynamische Zuweisung mehrdimensionales Array

Beitrag von Beach »

wp_xyz hat geschrieben:
Di 16. Nov 2021, 11:22
Warum speicherst du numerische Größen (PosX, PosY, ...) eigentlich in einem StringArray?[...]
Wie gesagt, ich bin aktuell noch am Üben um überhaupt wieder rein zu kommen.
Hier ging es mir darum überhaupt erstmal die Werte zu bekommen, bevor ich mir Gedanken mache wie ich diese Weiterverarbeite. Das wird dann der nächste Schritt.
Nun erstmal ausprobieren wie ich auch dynamischer an die Werte komme. Da die Reihenfolge gar nicht so fix ist wie ich anfangs angenommen habe. und auch nicht immer alle da sind.


Werde mir den von dir genannten Typen aber mal genauer anschauen. Der kommt mir aktuell unbekannt vor. :mrgreen:

Bei den Datentypen wirds eh noch interessant, da ich mit den Werten rechnen will. Und das mit einer bestimmten Genauigkeit.
Die Werte können positiv wie auch negativ sein. Dabei bis zu 6 Stellen vor dem Komma und 8 Stellen nach dem Komma haben
Ich erinnere mich das man hier genau überlegen muß welchen Datentyp man nimmt weil das auch direkt die Genauigkeit der Berechnungen beeinflusst.
MfG
Beach

Shit happens... Always in my shift

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: dynamische Zuweisung mehrdimensionales Array

Beitrag von wp_xyz »

Beach hat geschrieben:
Di 16. Nov 2021, 11:34
Bei den Datentypen wirds eh noch interessant, da ich mit den Werten rechnen will. Und das mit einer bestimmten Genauigkeit.
Die Werte können positiv wie auch negativ sein. Dabei bis zu 6 Stellen vor dem Komma und 8 Stellen nach dem Komma haben
Das sind zusammen 14 Stellen. Da könnte es mit dem Typ Double (15-16 Stellen) eng werden. Du kannst zu Extended ausweichen (19-20 Stellen), aber das gibt es nicht bei allen Plattformen, insbesondere nicht für Windows 64-bit. Es ginge auch, mit dem Integer-Typ Int64 (der reicht bis 10^19), wenn man die Eingangs Floating-Point-Werte mit 1E8 multipliziert - ist aber wahrscheinlich Gemurks.

Was sind das für Rechnungen? Außer bei astronomischen Rechnungen kann ich mir kaum etwas vorstellen, wo man das braucht. Kommt mir so vor wie das Streamen von HDTV-Videos auf Smartphones mit winzigen Display.

Generell solltest du dir zuerst überlegen, ob du diese Genauigkeitsanforderungen wirklich brauchst und ob du das nicht evtl durch bessere Auswahl der Algorithmen oder geeignete Normierung umgehen kannst. So nah am Ende des Wertebereichs zu arbeiten, halte ich immer für riskant.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: dynamische Zuweisung mehrdimensionales Array

Beitrag von Socke »

wp_xyz hat geschrieben:
Di 16. Nov 2021, 11:52
Beach hat geschrieben:
Di 16. Nov 2021, 11:34
Bei den Datentypen wirds eh noch interessant, da ich mit den Werten rechnen will. Und das mit einer bestimmten Genauigkeit.
Die Werte können positiv wie auch negativ sein. Dabei bis zu 6 Stellen vor dem Komma und 8 Stellen nach dem Komma haben
Das sind zusammen 14 Stellen. Da könnte es mit dem Typ Double (15-16 Stellen) eng werden. Du kannst zu Extended ausweichen (19-20 Stellen), aber das gibt es nicht bei allen Plattformen, insbesondere nicht für Windows 64-bit. Es ginge auch, mit dem Integer-Typ Int64 (der reicht bis 10^19), wenn man die Eingangs Floating-Point-Werte mit 1E8 multipliziert - ist aber wahrscheinlich Gemurks.
Currency macht doch auch nichts anderes nur mit 1E4. Wenn eine bestimmte Anzahl Dezimalstellen gefordert ist, wäre das tatsächlich eine recht einfach machbare Variante.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: dynamische Zuweisung mehrdimensionales Array

Beitrag von wp_xyz »

Socke hat geschrieben:
Di 16. Nov 2021, 13:25
Currency macht doch auch nichts anderes nur mit 1E4. Wenn eine bestimmte Anzahl Dezimalstellen gefordert ist, wäre das tatsächlich eine recht einfach machbare Variante.
Schon klar. Aber es kommt darauf an, was unter "Berechnungen" gemeint ist. Finanzielle Rechnungen kommen in der Regel mit den 4 Grundrechenarten aus, aber ich glaube nicht, dass man mit so einem erweiterten Currency-Typ eine Wahrscheinlichkeitsverteilung oder eine Bessel-Funktion berechnen kann, zumindest nicht aus der Tüte.

Benutzeravatar
Beach
Lazarusforum e. V.
Beiträge: 44
Registriert: Di 2. Nov 2021, 22:41
OS, Lazarus, FPC: Lazarus 3.0RC1 (rev lazarus_3_0_RC1-10-gfe49fef4fc) FPC 3.2.2 x86_64-win64-win32
CPU-Target: 64Bit
Wohnort: Hunsrück

Re: dynamische Zuweisung mehrdimensionales Array

Beitrag von Beach »

Um Licht ins Dunkel zu bringen.
Bei den Daten handelt es sich um Koordinaten in Millimeter in einem 3 dimensionalen Raum.
Als Berechnungen sind geplant:
  • Abstände zwischen 2 Punkten im Raum (kartesisches Koordinatensystem)
  • Geometrische Abweichungen vom (theoretischen) 90° / 90° /90° Ursprung
Also vorwiegend Winkelfunktionen und geometrische Berechnungen mit allem was dazu gehört.
Als Genauigkeit würde ich mal die 4. Stelle nach dem Komma annehmen evtl auch die 5.

Sinn des Ganzen ist das Verständnis der CAA (Computer Aided Accuracy) bei KMGs evtl Rückschlüsse auf die Zugrunde liegenden Freiheitsgrade bzw Winkligkeiten der Führungssysteme.
Habe beruflich damit zu tun und möchte mir damit versuchen einige Sachen einfacher machen. IM Zweifelsfalle aber einfach auch nur eine, jedenfalls für mich interessante, Programmierübung zu haben.
MfG
Beach

Shit happens... Always in my shift

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: dynamische Zuweisung mehrdimensionales Array

Beitrag von wp_xyz »

Beach hat geschrieben:
Di 16. Nov 2021, 16:03
Habe beruflich damit zu tun und möchte mir damit versuchen einige Sachen einfacher machen. IM Zweifelsfalle aber einfach auch nur eine, jedenfalls für mich interessante, Programmierübung zu haben.
Toll, das ist die beste Methode, das Programmieren zu lernen.
Beach hat geschrieben:
Di 16. Nov 2021, 16:03
KMGs
Google:
KMG steht für:
Kriegsmaterialgesetz, das Bundesgesetz über das Kriegsmaterial 514.51 der Schweiz
Kapitalmarktgesetz in Österreich
Karl-May-Gesellschaft
KazMunayGas, kasachisches Mineralölunternehmen
KMG Records, Killen Music Group (Buddy Killen), christliches Plattenlabel
Klitschko Management Group, Vermarktungsagentur in Hamburg
KMG Kliniken, Gesundheitskonzern
Königin-Mathilde-Gymnasium Herford
Koordinatenmessgerät
Krav Maga Global, weltweiter Verband für das israelische Selbstverteidigungssystem Krav Maga
Kroon Machinebouw Groep, niederländischer Fahrgeschäftehersteller
Flughafen Kunming-Changshui (IATA-Code), chinesischer Flughafen
Kunming Wujiaba International Airport (IATA-Code bis 2012), ehemaliger chinesischer Flughafen

KM-G steht für:
Grande Comore (ISO-3166-2-Ländercode), größte Insel der Komoren

KmG steht für:
Kommanditgesellschaft (Schweiz)

kmg steht für:
Kâte (ISO-639-3-Code), Papuasprache im Distrikt Finschhafen, Morobe Province, Papua-Neuguinea
Ich nehme an: "Koordinatenmessgerät"?

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: dynamische Zuweisung mehrdimensionales Array

Beitrag von Winni »

Hi!

Bau Dir Doch etwa so etwas

Code: Alles auswählen

TYPE
FPoint = Record
               x,y : Double;
               end;

FPointArray = Array of FPoint;

TheData = Record
                  Header: String;
                  FPoints : FPointArray;
                  end;
Damit kannst Du die Messwerte gleich in ein dynamisches Array einfügen und hast auch noch den Header string.

In ein Double gehen definitiv 15 Stellen, manchmal auch 16. Also müsste ein Double für Dich genügen. Musst also nicht auf Extended und die Spezialfälle bei den verschiedenen Betriebssystemen Rücksicht nehmen.

Voricht bei der Type definition:

PointF gibt es schon in der unit Types. Das ist ein auch Fließkomma-Punkt, aber mit Singles. Die reichen für deine Genauigkeit nicht.

Winni

PS.: Oder doch Karl May Gesellschaft? Du vermisst, wie genau seinerzeit Lex Barker Mario Adorf getroffen hat?????

Benutzeravatar
Beach
Lazarusforum e. V.
Beiträge: 44
Registriert: Di 2. Nov 2021, 22:41
OS, Lazarus, FPC: Lazarus 3.0RC1 (rev lazarus_3_0_RC1-10-gfe49fef4fc) FPC 3.2.2 x86_64-win64-win32
CPU-Target: 64Bit
Wohnort: Hunsrück

Re: dynamische Zuweisung mehrdimensionales Array

Beitrag von Beach »

Winni hat geschrieben:
Di 16. Nov 2021, 18:25
[...]
PS.: Oder doch Karl May Gesellschaft? Du vermisst, wie genau seinerzeit Lex Barker Mario Adorf getroffen hat?????
Ja genau. Und Brices ihr Pierre fehlt auch noch.....

Sorry, Berufskrankheit....
KMG -> Koordinatenmessgerät
MfG
Beach

Shit happens... Always in my shift

wp_xyz
Beiträge: 4892
Registriert: Fr 8. Apr 2011, 09:01

Re: dynamische Zuweisung mehrdimensionales Array

Beitrag von wp_xyz »

Nochmals zu den Stellen: Wenn die Messgrößen Millimeter sind, wie anfangs gesagt 6 Stellen vor dem Komma und, wie später gesagt, 6 Stellen nach dem Komma, dann bedeutet das, eine Distanz von mehreren Kilometern mit Nanometer-Auflösung zu messen. Da staunt der Physiker...

Daher gebe ich winni völlig recht, dass Double als Datentyp für die Koordianten-Werte absolut ausreicht. Immer auf dem Boden bleiben.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: dynamische Zuweisung mehrdimensionales Array

Beitrag von Winni »

wp_xyz hat geschrieben:
Di 16. Nov 2021, 19:02

Daher gebe ich winni völlig recht, dass Double als Datentyp für die Koordianten-Werte absolut ausreicht. Immer auf dem Boden bleiben.
Hi!

Zumal die Messfehler-Witze aus der angewandten Physik unzählig sind.....

Hier werden keine Exo-Planeten vermessen, kein Weltraumschrott und keine erdbedrohenden Asteroiden. Da braucht man wohl ein bischen mehr als ein Double.

Winni

Antworten