Array oder Record???

Rund um die LCL und andere Komponenten
Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Array oder Record???

Beitrag von Maik81ftl »

Moin zusammen.

bin gerade am Überlegen, ob es sich groß unterscheidet, ob ein Array in 6 Demisionen oder ein Record mit 6 Einzelvariablen verwende. einzige bedingung. Array soll offen ergo Dynamisch sein und die werte auch Speichern.

als Reines Array würde ich es so machen

Code: Alles auswählen

TFID: Array of Array of Array of Array of Array of Array of single
als Record array dachte ich an diese Richtung

Code: Alles auswählen

TFID: array of Record
               MP1, MP2, MP3, MP4, MP5 MP6: Single
               end;
Nun eure Meinung, was macht sich Verwaltungs- und Programm technisch sinnvoller?
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Socke
Lazarusforum e. V.
Beiträge: 3178
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: Array oder Record???

Beitrag von Socke »

Maik81ftl hat geschrieben:Nun eure Meinung, was macht sich Verwaltungs- und Programm technisch sinnvoller?
Das Sinnvollste ist das, was deine Bedürfnisse/die Bedürfnisse deines Programms am ehesten umsetzt. Arrays und Records sind an sich völlig unterschiedliche Strukturen für völlig unterschiedliche Aufgaben (wobei man ein statisches eindimensionales Array auch immer als Record abbilden kann).

Ein 6-dimensionales Array ist etwas ganz anderes als ein Record mit 6 Elementen.

Code: Alles auswählen

// dein Record als Array:
TFID = array[0..5] of single;
 
// dein Array als Records; angenommen, in jede Dimension ist genau 1 Element lang:
TRec6 = record
  val: single;
end;
TRec5 = record
  val: TRec6;
end;
TRec4 = record
  val: TRec5;
end;
// ... weiter kannst du dir denken
TFID = record
  val: TRec1;
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Array oder Record???

Beitrag von Hitman »

Klingt nicht vergleichbar. Der Record wäre eher ein zweidimensionales Array, bei dem die zweite Dimension 6 Elemente fasst. also eher ein array of array[0..5] of Single;

Der Semantik wegen würde ich zum Record tendieren. Wenn du hingegen über die 6 Werte iterieren willst/kannst, dann nimm lieber das zweidimensionale Array.

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Array oder Record???

Beitrag von u-boot »

jo wie schon gesagt ... völlig verschiedene Dinge. Wenn das mit deinem Record deinen Zweck erfüllen kann, ist es imo einfacher den Überblick zu behalten.

Wenn du dich zwischen den beiden aber gar nicht entscheiden kannst, hab ich hier noch einen Vorschlag:

Code: Alles auswählen

TFIDArray=Array of single;
 
  TFID:record
     TFIDArr1, TFIDArr2, TFIDArr3, TFIDArr4, TFIDArr5, TFIDArr6:TFIDArray;
  end;
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Array oder Record???

Beitrag von mschnell »

TFID: array of Record
MP1, MP2, MP3, MP4, MP5 MP6: Single
end;

ist einfach nur zweidimensional mit der Größe n * 6


TFIDArray=Array of single;

TFID:record
TFIDArr1, TFIDArr2, TFIDArr3, TFIDArr4, TFIDArr5, TFIDArr6:TFIDArray;
end;

ist auch zweidimension mit der Größe 6 * n

-Michael

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Array oder Record???

Beitrag von carli »

Willst du eine jetzt eine 6dimensionale Datenstruktur mit dynamischer Länge oder eine eindimensionale Datenstruktur mit fester Länge 6 haben?

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Array oder Record???

Beitrag von Maik81ftl »

u-boot hat geschrieben:jo wie schon gesagt ... völlig verschiedene Dinge. Wenn das mit deinem Record deinen Zweck erfüllen kann, ist es imo einfacher den Überblick zu behalten.

Wenn du dich zwischen den beiden aber gar nicht entscheiden kannst, hab ich hier noch einen Vorschlag:

Code: Alles auswählen

TFIDArray=Array of single;
 
  TFID:record
     TFIDArr1, TFIDArr2, TFIDArr3, TFIDArr4, TFIDArr5, TFIDArr6:TFIDArray;
  end;
Das schaut schon eher nach meinem Geschmack aus...
carli hat geschrieben:Willst du eine jetzt eine 6dimensionale Datenstruktur mit dynamischer Länge oder eine eindimensionale Datenstruktur mit fester Länge 6 haben?
6 Dimensionen mit Dynamischer länge... Grund :!: Jede Messreihe hat Ihre 6 MP. Diese werden bei jedem Gerät in eine Linearität umgerechnet und somit wird die Endkurfe immer genauer.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Array oder Record???

Beitrag von carli »

Maik81ftl hat geschrieben:
carli hat geschrieben:Willst du eine jetzt eine 6dimensionale Datenstruktur mit dynamischer Länge oder eine eindimensionale Datenstruktur mit fester Länge 6 haben?
6 Dimensionen mit Dynamischer länge... Grund :!: Jede Messreihe hat Ihre 6 MP. Diese werden bei jedem Gerät in eine Linearität umgerechnet und somit wird die Endkurfe immer genauer.
Wozu misst du denn in 6dimensionalen Würfeln? Sicher, dass du weiß, was 6-dimensional bedeutet? Und warum gurkst du mit einem 6-elementigem Record von Arrays rum, das ist eine zweidimensionale Datenstruktur.

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Array oder Record???

Beitrag von Maik81ftl »

carli hat geschrieben:
Maik81ftl hat geschrieben:
carli hat geschrieben:Willst du eine jetzt eine 6dimensionale Datenstruktur mit dynamischer Länge oder eine eindimensionale Datenstruktur mit fester Länge 6 haben?
6 Dimensionen mit Dynamischer länge... Grund :!: Jede Messreihe hat Ihre 6 MP. Diese werden bei jedem Gerät in eine Linearität umgerechnet und somit wird die Endkurfe immer genauer.
Wozu misst du denn in 6dimensionalen Würfeln? Sicher, dass du weiß, was 6-dimensional bedeutet? Und warum gurkst du mit einem 6-elementigem Record von Arrays rum, das ist eine zweidimensionale Datenstruktur.
:?: :?: :?: Irgendwie Stehst du hier Grad auf der Leitung... ich habe ein gerät mit 6 Messwerten... aus den einzelnen Messerten, welche einen Def. Sollwert haben soll ein für Jeden MP ein Istwert gesetzt und am ende der Mittelwert errechnet werden. am einem Bsp. erklärt.

MP1:
  • 1,75
  • 2,13
  • 1,85
  • 0,00
  • 0,09
  • ...
  • ...
  • ...
Der vorgegeben Mittelwert liegt bei ca 1,75 ppm bzw 25mgC/m³ ich brauche deshalb ein Dynamisches Array mit 6 Demisionen, das weder bekannt ist, wie viele geräte / a geprüft werden, noch wie lange wir diese Geräte noch prüfen.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Array oder Record???

Beitrag von u-boot »

Wenn schon falsch dann wenigstens aus Überzeugung........
Ich fang mal an zu überlegen und stelle fest: Ein 6D-Array benötigt sechs Indizes beim Zugriff auf ein Element.

Wir nehmen also mal das Element MyArr[8][3][5][2][9][4]. Jetzt würde ich gerne wissen, welche Zahl wofür stehen soll...
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2825
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Array oder Record???

Beitrag von m.fuchs »

Maik81ftl hat geschrieben:Irgendwie Stehst du hier Grad auf der Leitung... ich habe ein gerät mit 6 Messwerten... aus den einzelnen Messerten, welche einen Def. Sollwert haben soll ein für Jeden MP ein Istwert gesetzt und am ende der Mittelwert errechnet werden. [...] ich brauche deshalb ein Dynamisches Array mit 6 Demisionen, das weder bekannt ist, wie viele geräte / a geprüft werden, noch wie lange wir diese Geräte noch prüfen.
Wie immer wirre Erklärungen, ich fasse mal zusammen:

aktueller Zustand für ein Gerät mit sechs Messwerte => eine Zeile mit sechs Spalten (Werten)

Code: Alles auswählen

TGeraetzustand = array [0..5] of Single;
aktueller Zustand für beliebig viele Geräte => eine Tabelle mit beliebig vielen Zeilen mit jeweils sechs Spalten

Code: Alles auswählen

TTabelle = array of TGeraetzustand;
beliebig viele Zustände für beliebig viele Geräte => beliebig viele Tabellen mit beliebig vielen Zeilen mit jeweils sechs Spalten

Code: Alles auswählen

TMessreihe = array of TTabelle;
Oder verkürzt:

Code: Alles auswählen

array of array of array[0..5] of Single;
Und das sieht nach drei Dimensionen aus.

Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Array oder Record???

Beitrag von Maik81ftl »

m.fuchs hat geschrieben:
Maik81ftl hat geschrieben:Irgendwie Stehst du hier Grad auf der Leitung... ich habe ein gerät mit 6 Messwerten... aus den einzelnen Messerten, welche einen Def. Sollwert haben soll ein für Jeden MP ein Istwert gesetzt und am ende der Mittelwert errechnet werden. [...] ich brauche deshalb ein Dynamisches Array mit 6 Demisionen, das weder bekannt ist, wie viele geräte / a geprüft werden, noch wie lange wir diese Geräte noch prüfen.
Wie immer wirre Erklärungen, ich fasse mal zusammen:

aktueller Zustand für ein Gerät mit sechs Messwerte => eine Zeile mit sechs Spalten (Werten)

Code: Alles auswählen

TGeraetzustand = array [0..5] of Single;
aktueller Zustand für beliebig viele Geräte => eine Tabelle mit beliebig vielen Zeilen mit jeweils sechs Spalten

Code: Alles auswählen

TTabelle = array of TGeraetzustand;
beliebig viele Zustände für beliebig viele Geräte => beliebig viele Tabellen mit beliebig vielen Zeilen mit jeweils sechs Spalten

Code: Alles auswählen

TMessreihe = array of TTabelle;
Oder verkürzt:

Code: Alles auswählen

array of array of array[0..5] of Single;
Und das sieht nach drei Dimensionen aus.

Micha
m.fuchs, wenn ich dies via reine Tablle machen möchte würde es reichen und da könnt ich das auch via Openoffice calc machen :D will dies aber via Lazarus umschreiben, wobei der Grundalgorythmus dann auch auf eine SPS-steuerung übertragen werden soll. da kann und darf ich icht mit tabellen arbeiten. die werte soll am ende keiner sehen sondern nur intern zur verfühgung stehen. Hier mal einige werte, die ich aus beispielmessungen schon mal habe.

Code: Alles auswählen

1,60 	6,60 	22,45 	39,53 	56,89 	74,83         <--- Mittelwert 
 
1,88 	7,30 	24,00 	41,14 	57,98 	76,90          <--- erste Messreihe
3,08 	8,76 	24,78 	41,65 	58,69 	76,66          <--- 
0,00 	4,20 	21,68 	41,11 	60,79 	80,62 
1,32 	6,18 	21,26 	37,79 	54,98 	72,02 
1,56 	5,96 	20,68 	37,28 	54,30 	71,14 
1,78 	7,20 	22,31 	38,23 	54,59 	71,66         <--- n. Messreihe
auf dem mittelwert werden 2 Diagramme erstellt.

Teilwerte dieses Ergebnis sehen in Textform so aus...

Code: Alles auswählen

Istwerte	Sollwerte	korrigierte Istwerte	Abweichung	Abw. v. MBE
	1,60 	75,47	73,86	73,86%
	6,60 	75,47	68,87	68,87%
	22,45 	75,47	53,02	53,02%
	39,53 	75,47	35,93	35,93%
	56,89 	75,47	18,58	18,58%
	74,83 	75,47	0,00	0,00%

Hier ein bsp von älteren geräten...
Bildschirmfoto-1.png
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Array oder Record???

Beitrag von mschnell »

Das sieht verdächtig nach eine Ausgleichs-Graden aus ("Linearisierung")...

Dann brauchst Du im Speicher nur die Messwerte (x und y als Array), und von der geraden die Steigung und den Offset. Alles andere (Abweichung etc.) lässt sich gederzeit leicht genau dann errechnen wenn man es braucht.

-Michael

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2825
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Array oder Record???

Beitrag von m.fuchs »

Maik81ftl hat geschrieben:m.fuchs, wenn ich dies via reine Tablle machen möchte würde es reichen und da könnt ich das auch via Openoffice calc machen :D will dies aber via Lazarus umschreiben, wobei der Grundalgorythmus dann auch auf eine SPS-steuerung übertragen werden soll. da kann und darf ich icht mit tabellen arbeiten. [...]

Code: Alles auswählen

1,60 	6,60 	22,45 	39,53 	56,89 	74,83         <--- Mittelwert 
 
1,88 	7,30 	24,00 	41,14 	57,98 	76,90          <--- erste Messreihe
3,08 	8,76 	24,78 	41,65 	58,69 	76,66          <--- 
0,00 	4,20 	21,68 	41,11 	60,79 	80,62 
1,32 	6,18 	21,26 	37,79 	54,98 	72,02 
1,56 	5,96 	20,68 	37,28 	54,30 	71,14 
1,78 	7,20 	22,31 	38,23 	54,59 	71,66         <--- n. Messreihe
Hm, du sagst dass dir Tabellen nichts nützen und zeigst dann prompt deine Daten in Tabellenform. Wenn das da die Daten eines Gerätes darstellt, dann ist mein Vorschlag genau was du brauchst. Wenn du der Meinung bist dass er das nicht ist, dann beschreibe dein Problem mal richtig.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Array oder Record???

Beitrag von Maik81ftl »

m.fuchs hat geschrieben:
Maik81ftl hat geschrieben:m.fuchs, wenn ich dies via reine Tablle machen möchte würde es reichen und da könnt ich das auch via Openoffice calc machen :D will dies aber via Lazarus umschreiben, wobei der Grundalgorythmus dann auch auf eine SPS-steuerung übertragen werden soll. da kann und darf ich icht mit tabellen arbeiten. [...]

Code: Alles auswählen

1,60 	6,60 	22,45 	39,53 	56,89 	74,83         <--- Mittelwert 
 
1,88 	7,30 	24,00 	41,14 	57,98 	76,90          <--- erste Messreihe
3,08 	8,76 	24,78 	41,65 	58,69 	76,66          <--- 
0,00 	4,20 	21,68 	41,11 	60,79 	80,62 
1,32 	6,18 	21,26 	37,79 	54,98 	72,02 
1,56 	5,96 	20,68 	37,28 	54,30 	71,14 
1,78 	7,20 	22,31 	38,23 	54,59 	71,66         <--- n. Messreihe
Hm, du sagst dass dir Tabellen nichts nützen und zeigst dann prompt deine Daten in Tabellenform. Wenn das da die Daten eines Gerätes darstellt, dann ist mein Vorschlag genau was du brauchst. Wenn du der Meinung bist dass er das nicht ist, dann beschreibe dein Problem mal richtig.
Noch werden die Daten in Tabellenform dargestellt... Aber wir wollen weg davon. Ergo! Messreihen Tabellen weg und nur die Tabelle, wo die endwerte stehen.
mschnell hat geschrieben:Das sieht verdächtig nach eine Ausgleichs-Graden aus ("Linearisierung")...

Dann brauchst Du im Speicher nur die Messwerte (x und y als Array), und von der geraden die Steigung und den Offset. Alles andere (Abweichung etc.) lässt sich gederzeit leicht genau dann errechnen wenn man es braucht.

-Michael
:mrgreen: :mrgreen: Genau davon rede ich die ganze Zeit :D nur wollt ich im ansatz wissen, ob als Array oder Record.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Antworten