Dynamische Arrays

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
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: Dynamische Arrays

Beitrag von mschnell »

Socke hat geschrieben:Bei der Funktion ReAllocMem steht: Die Adresse kann sich ändern. Es hängt also davon ab, ob am Ende des Arrays noch ausreichend ungenutzter Speicher vorhanden ist. Falls nicht, muss kopiert werden. Beim Anlegen eines Arrays wird jedoch nicht automatisch mehr Speicher allokiert als notwendig. Es wird lediglich auf ganze Blöcke (16 Byte auf 32bit-Systemen und 32 Byte auf 64bit-Systemen) aufgerundet.
Yep. Und das Betriebssystem wird nur dann aufgerufen, wenn die Heap-Verwaltung nicht mehr genug Speicher hat, Ansonsten läuft alles im User-Mode in der RTL.
Socke hat geschrieben:An und für sich ist aber der Programmierer für die Reservierung von zusätzlichem Speicher verantwortlich. Ein schönes Beispeil sind die Standardklassen für Listen (TStringList, TFPList etc.) Dort wird zum Beispiel der verfügbare Platz immer verdoppelt.
Das ist natürlich sinnvoll. " TStringList" ist in der RTL realisiert. Ich finde es erstaunlich dass "Setlength", das auch in der RTL realisiert ist, nicht ebenfalls so arbeitet. (Ist eigentlich einen Feature-Request in Mantis wert.)

-Michael
Zuletzt geändert von mschnell am Do 13. Mär 2014, 10:54, insgesamt 2-mal geändert.

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: Dynamische Arrays

Beitrag von mschnell »

Maik81SE hat geschrieben:.. ich auf ACCESS angewiesen bin. Wie ich aber auch weiß geht das unter Lazarus wenn überhaupt nur Sehr schwer.
Du meinst die "Jet Engine" DLL.

Das wurde hier im Forum diskutiert. Es gibt einen Zusatz zu Zeos, der das (in Windows) problemlos ermöglichen sollte. Die Such-Performance ist natürlich relativ mager gegenüber einer richtigen Client-Server-Lösung.

Warum bist Du darauf angewiesen ? MySQL und andere Datenbanken laufen unter Windows, wenn Du willst auch auf demselben Rechner und kosten nix.

Datenbank ist aber auf jeden Fall viel langsamer als eine gut angepasste Spezial-Lösung, die komplett im Memory läuft.

-Michael

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: Dynamische Arrays

Beitrag von Socke »

mschnell hat geschrieben:
Socke hat geschrieben:An und für sich ist aber der Programmierer für die Reservierung von zusätzlichem Speicher verantwortlich. Ein schönes Beispeil sind die Standardklassen für Listen (TStringList, TFPList etc.) Dort wird zum Beispiel der verfügbare Platz immer verdoppelt.
Das ist natürlich sinnvoll. " TStringList" ist in der RTL realisiert. Ich finde es erstaunlich dass "Setlength", das auch in der RTL realisiert ist, nicht ebenfalls so arbeitet. (Ist eigentlich einen Feature-Request in Mantis wert.)
Es geht hier nicht darum, wo etwas her kommt, sondern wofür es entworfen wurde. TStringList ist eine allgemeine Anwendung und darf daher auch Speicher anfordern, als tatsächlich benötigt wird. SetLength hingegen realisiert eine Basisfunktionalität. Wenn hier mehr Speicher reserviert wird, als tatsächlich benötigt wird, mag das in einigen Spezialfällen wie Desktop-Anwendungen noch sinnvoll erscheinen. In vielen anderen Fällen bringt das viele Probleme mit sich. Wenn ich zum Beispiel 300 MB für Messdaten benötige, aber nur 512 MB RAM besitze, darf SetLength nicht einfach 150 oder 200 Prozent anfordern, weil ich dann nicht mehr genug Platz für andere Dinge habe. Ein ähnliches Problem habe ich, wenn ich viele kleine Arrays anlege: In einem Server kann ich so nur noch die Hälfte der Anfragen gleichzeitig bearbeiten usw.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
Maik81SE
Beiträge: 327
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.4 FPC 3.2.2)
CPU-Target: x86-64; avr
Wohnort: Lübeck
Kontaktdaten:

Re: Dynamische Arrays

Beitrag von Maik81SE »

[quote="wp_xyz"]... Ich würde TKabel nicht stur als Array[0..7] of String deklarieren, weil, wie ich deinem 1. Code entnehme, auch numerische Daten enthalten sind. Da wäre ein Record viel klarer, auch weil du nicht immer nachschlagen musst, welche Größe jetzt das 3. Arrayelement bedeutet. Und vielleicht kannst du sowas wie "Leitungstyp" als eigenen Typ codieren, denn die Vielfalt eines Strings wird hier nicht auftreten (und jedes überflüssige Byte ist ein Hindernis für die Realisierung von mehr als 2.147.483.648 Kabeln - siehe oben). Dasselbe auch mit den Kontaktarten und Leitungsfarben.

Code: Alles auswählen

 
type
  TLeitungstyp = (ltSchutzleiter, ltNullLeiter, ltPhaseA, ltPhaseB, ltPhaseC, usw);
  TLeitungsfarbe = (lfSchwarz, lfBlau, lfBraun, lfGelbGruen, usw);
  TKontaktart = (--- hierzu fallen mir keine Beispiele ein ---);
  TKabel = record
     Quelle: String;
     KontaktartQuelle: TKontaktart;
     LeitungsTyp: TLeitungsTyp;
     LeitungsQuerschnitt: double;
     LeitungsLaenge: Double;
     Leitungsfarbe: TLeitungsfarbe;
     KontaktartZiel: TKontaktart;
     ZielKontakt: String;
  end;
 
Hmmm, zugegeben, die Überwegung mit der Vordefinition ist auch nicht doof, nur hat diese einen Kleinen Nachteil. wie soll dann der Anwender eine "Schleppkettenleitung nachtragen, welche seine Firma nicht auf lager hat? Aber vom Grund wäre dies schon mal nicht das Problem... :D :D Hier mal ein auszug, wie ich es im Momentan gelöst habe :D

Code: Alles auswählen

[[Leitung0]]
Quelle=X1-L
Kontaktart Quelle=FSH 6,3x0,8
Leitungstyp=M
Leitungsquerschnitt=AWG16
Leitungslänge=800
Leitungsfarbe=sw1
Kontaktart Ziel=S1.1-2
Zielkontakt=FSH 6,3x0,8
 
[[Leitung1]]
Quelle=X1-N
Kontaktart Quelle=FSH 6,3x0,8
Leitungstyp=M
Leitungsquerschnitt=AWG16
Leitungslänge=800
Leitungsfarbe=sw2
Kontaktart Ziel=S1.2-2
Zielkontakt=FSH 6,3x0,8
 
[[Leitung2]]
Quelle=X1-PE
Kontaktart Quelle=FSH 6,3x0,8
Leitungstyp=M
Leitungsquerschnitt=AWG16
Leitungslänge=800
Leitungsfarbe=gnge
Kontaktart Ziel=X2.1-4
Zielkontakt=AEH 1,5²
die dazugehörige eingabemaske siehst Hier
Bildschirmfoto.png
Bildschirmfoto.png (23.24 KiB) 819 mal betrachtet

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.4 FPC 3.2.2);

Antworten