Borland Pascal und Datensegment

Hallo!
Ich habe ein ziemlich umfangreiches Programm hier compiliert und stehe vor dem Problem, dass das Datensegment voll ist.
Welche Maßnahmen kann ich nun setzen, damit ich wieder mehr Platz hier bekomme?
Das ganze unter BP7, Windowsprogramm.

Alle Ideen sind willkommen, ich selbst hab schon einiges ausprobiert und gemacht, aber es ist immer noch zuwenig…

Danke
Alois

Hallo Alois!

Hast Du schon versucht, einige größere Strukturen auf den Heap zu verlegen? Ich nehme an, Du weißt, was ich meine. Wenn Du beispielsweise ein Array mit 1000 REAL-Elementen „normal“ deklarierst, also schreibst

VAR a: ARRAY[0…999] OF REAL;

dann wird das Datensegment mit 6000 Bytes
„belastet“ (pro REAL 6 Bytes).

Wenn Du stattdessen aber zuerst einen Datentyp für dieses Array definierst…

TYPE TRealFeld = ARRAY[0…999] OF REAL;

…und dann eine Zeigervariable anlegst…

VAR p: ^TRealFeld;

(„Zeiger p zeigt auf Variable vom Typ TRealFeld“) …dann belastet diese Zeigervariable das Datensegment nur mit 4 Bytes.

Die 6000 Bytes des Arrays werden dann nicht im Datensegment, sondern auf dem Heap belegt. Diesen Speicher forderst Du erst zur Programmlaufzeit an, und zwar mit

New§

Danach kannst Du z. B. auf das 431ste Element des Arrays zugreifen, indem Du
schreibst

x := p^[431]

Wenn Du das Array aus irgendeinem
Grund irgendwann nicht mehr benötigst,
solltest Du den Heapspeicher mit

Dispose§

wieder freigeben.

Ich hoffe, ich konnte Dir helfen.

MfG
Martin

Hi!

Was auch noch Schuld sein könnte: Viele Const-Deklarationen. Ich meine damit zB

Const Hausnummer : String = ‚15a‘;

also typed constants. Die werden im Datensegment abgelegt.

Wenn Du viele Strings so definiert hast, versuche die Sring-Länge herabzusetzen. Statt 255 halt soviel, wie da max. rein muß. Und überlege, ob es notwenig ist, daß diese Konstanten nach dem Programmstart verändert werden können. Fixe Konstanten

Const Version = ‚1.1.23‘;

belegen nämlich überhaupt keinen Speicherplatz (außer im Code-Segment).

Auch globale Variablen werden im Datensegment abgelegt!!! Lokale Variablen hingegen am Stack. Vermeide also globale Variablen und mach mehr mit Übergabeparametern in Prozeduren und Functions.

Bye
Hansi

Hallo!

Hast Du schon versucht, einige größere
Strukturen auf den Heap zu verlegen?

Ja, schon ziemlich viel, das ist auch derzeit meine einzige Stütze, die ich noch überall durchziehen muss.

Der Heap (New,…) ja ungleich dem Global Heap (GlobalAlloc,…). Wie wirken denn die zwei sich auf das Datensegment aus?

danke erstmal!

alois

Const-Deklarationen. Ich meine damit zB
Const Hausnummer : String = ‚15a‘;

Gibts viele, ja.
Gibts denn dann auch einen Unterschied zwischen
CONST haha: integer=10;
und
VAR haha:INTEGER;

in Hinsicht auf das Datensegment??
(dass der eine vorbelegt wird, ist mir schon klar :smile:)

Auch globale Variablen werden im
Datensegment abgelegt!!! Lokale Variablen
hingegen am Stack.

Ja, ich weiß. Nur hab ich den Stack auch schon auf 8192 Byte runtergedreht :smile:
von wegen Datensegment und so…

Jedenfalls danke
alois

Hallo!

Const-Deklarationen. Ich meine damit zB
Const Hausnummer : String = ‚15a‘;

Gibts viele, ja.
Gibts denn dann auch einen Unterschied
zwischen
CONST haha: integer=10;
und
VAR haha:INTEGER;

Wenn das Var global ist, dann schon. Wenns lokal ist nicht.

Vermeide globale Variablen! Wozu braucht man die? Globale Variblen sollte man nur dazu verwenden, um im HAUPTPROGRAMM was zu machen. Die Prozeduren kriegen alle alles mit Parametern bzw. Functions gebens dann wieder zurück. Auch untereinander.

in Hinsicht auf das Datensegment??
(dass der eine vorbelegt wird, ist mir
schon klar :smile:)

Auch globale Variablen werden im
Datensegment abgelegt!!! Lokale Variablen
hingegen am Stack.

Ja, ich weiß. Nur hab ich den Stack auch
schon auf 8192 Byte runtergedreht :smile:
von wegen Datensegment und so…

Damit wird das DS nicht größer. Das Datensegment kann maximal 65520 Bytes groß werden (knapp 64kB). Ganz egal, was sonst noch ist. Dabei tut er aber von allen Units alles zusammen rein. Codesegment kriegt jede Unit ihr eigenes.

Dreh den Stack ruhig wieder auf 64KB rauf.

Bye
Hansi

Wenn das Var global ist, dann schon.
Wenns lokal ist nicht.

hmm, wie zählen Variable, die aus UNITS kommen? dort im Interface deklariert sind?

Ja, ich weiß. Nur hab ich den Stack auch
schon auf 8192 Byte runtergedreht :smile:

Damit wird das DS nicht größer. Das
Datensegment kann maximal 65520 Bytes
groß werden (knapp 64kB).
Dreh den Stack ruhig wieder auf 64KB
rauf.

hmm, wie erklärts du dir dann das:
Einstellung: Windows- Stack Size 8192
-> Compile+Link OK
Einstellung: Windows-Stack Size 16384
-> nix mehr ok (Datensegmentgrenzenüberschritten)

und CompileInfo:
Daten+Stack+lokalerHeap ist immer unter diesen 65520
und eben nicht nur der Stack oder nur die Daten

that´s the point

alois

Hi Alois!

Wenn das Var global ist, dann schon.
Wenns lokal ist nicht.

hmm, wie zählen Variable, die aus UNITS
kommen? dort im Interface deklariert
sind?

Dann is sie auch Global. Alles was nicht in einer Prozedure oder Function drin steht, ist global.

Ja, ich weiß. Nur hab ich den Stack auch
schon auf 8192 Byte runtergedreht :smile:

Damit wird das DS nicht größer. Das
Datensegment kann maximal 65520 Bytes
groß werden (knapp 64kB).
Dreh den Stack ruhig wieder auf 64KB
rauf.

hmm, wie erklärts du dir dann das:
Einstellung: Windows- Stack Size 8192
-> Compile+Link OK
Einstellung: Windows-Stack Size 16384
-> nix mehr ok
(Datensegmentgrenzenüberschritten)

und CompileInfo:
Daten+Stack+lokalerHeap ist immer unter
diesen 65520
und eben nicht nur der Stack oder nur die
Daten

Aha! Interessant! Das is mir neu! Aja! Du schreibst ja auch ein Windows-Programm. Da kenn ich mich nicht so gut aus. Trotzdem wunderts mich. Sogar der Heap? Der kann doch so groß werden, wie man will???

Bye
Hansi

Hi Alois!

Daten+Stack+lokalerHeap ist immer unter
diesen 65520

schreibst ja auch ein Windows-Programm.

Trotzdem wunderts mich. Sogar der Heap?
Der kann doch so groß werden, wie man
will???

HI!
naja, nicht ganz, der einstellbare Heap ist eben der lokale Heap.
Der globale Heap (GlobalAlloc,…) der darf wie er will…
Sonst nix. :frowning:

naja
bei inzwischen 285000 Code Zeilen gehts eben langsam an die Grenzen des BP Compilers.

Debuggen geht schon lange nicht mehr.
geschweige denn debug info in die exe packen…

-(

bye
alois

Hallo!

naja, nicht ganz, der einstellbare Heap
ist eben der lokale Heap.
Der globale Heap (GlobalAlloc,…) der
darf wie er will…
Sonst nix. :frowning:

Aha! Das is mir schon wieder neu. Meine Windows-Künste beschränken sich auf Delphi. Da is das leichter.

naja
bei inzwischen 285000 Code Zeilen gehts
eben langsam an die Grenzen des BP
Compilers.

Uff! Das is ja schon riesig!

HAAA! Jetzt weiß ich! Du mußt DLLs machen! Dann geht’s! Die haben alle ein eigenes DS! Außerdem wird dann die Haupt-EXE-Datei nicht so groß, und dann wirds Debuggen wieder leichter!

Oder nimm den FPC! Der kann mehr. Der is ein echter 32-Bit Compiler. Oder nimm gleich Delphi.

Bye
Hansi

Hallo!

Delphi. Da is das leichter.

oh yes, i know!!

bei inzwischen 285000 Code Zeilen gehts

Uff! Das is ja schon riesig!

yes :smile:

HAAA! Jetzt weiß ich! Du mußt DLLs
machen!

Das weiss ich auch. Nur genau das ist das Problem. Dass die eben ein eigenes Datensegment haben. Mit der Borland Database Engine kommts da zu wunderbaren nix-geht-mehr Situationen.

Oder nimm den FPC! Der kann mehr. Der is
ein echter 32-Bit Compiler. Oder nimm
gleich Delphi.

FPC ist was???
Delphi geht nicht aus den verschiedensten Gründen. Ich will ja meinen Code nicht neu schreiben!

bye
alois

Hallo!

HAAA! Jetzt weiß ich! Du mußt DLLs
machen!

Das weiss ich auch. Nur genau das ist das
Problem. Dass die eben ein eigenes
Datensegment haben. Mit der Borland
Database Engine kommts da zu wunderbaren
nix-geht-mehr Situationen.

Aso? Was is die Borland Database Engine? War die beim BP7 dabei? Noch nie gehört!

Oder nimm den FPC! Der kann mehr. Der is
ein echter 32-Bit Compiler. Oder nimm
gleich Delphi.

FPC ist was???

FPC = Free Pascal Compiler. Der is fast 100% kompatibel zu BP7. Und is absolut gratis. OpenSource! Und geht für DOS, Windows, Linux, OS/2, Amiga, … :smile:))))))) Ein Problem kannst allerdings kriegen: Ob da das OWindows dabei is, glaubi nicht.

Delphi geht nicht aus den verschiedensten
Gründen. Ich will ja meinen Code nicht
neu schreiben!

Ja, das versteh ich.

Die beiden Ideen kommen daher, weil ich Dir statt dem (dummen) 16-Bit-Kompiler einen 32-Bit empfehlen wollte. Und Delphi (zumindest die neueren Versionen) machen 32-Bit-Code, und können deshalb auch DS > 64kB.

Bye
Hansi

Hallo!
Ich habe ein ziemlich umfangreiches
Programm hier compiliert und stehe vor
dem Problem, dass das Datensegment voll
ist.
Welche Maßnahmen kann ich nun setzen,
damit ich wieder mehr Platz hier bekomme?
Das ganze unter BP7, Windowsprogramm.

Irgendwie habe ich das Gefühl, daß ihr um den heißen Brei herumredet. Deswegen poste ich mal hier, GAAAAAANZ am Anfang.

Das Problem ist doch, das das DATENSEGMENT voll ist. Das Datensegment ist aber nicht der Heap. Demnach ist auf dem Heap doch noch etwas frei, oder? Wenn ich mich nicht irre, ist der nämlich bei BP7 und Windows als Target auch bis zu 16Mb groß, wie bei DPMI. Du mußt nur unter Options\Memory Sizes das einstellen (8Mb ist Voreinstellung).

Dann legst Du ganz einfach globale Pointer an, statt globale Variablen zu verwenden.

Oder ist der Heap etwa auch voll?
Dann kannst Du immer noch GlobalAlloc benutzen.

–Mathias Ricken