Borland Pascal und Datensegment

Von: , Frage gestellt am Mo, 27. Sep 1999

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

12 Antworten zu dieser Frage

  1. Antwort von nach 41 Minuten hilfreich
    Re: Borland Pascal und Datensegment

    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(p)

    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(p)

    wieder freigeben.

    Ich hoffe, ich konnte Dir helfen.

    MfG
    Martin

    • Antwort von nach einer Stunde hilfreich
      Re^2: Borland Pascal und Datensegment

      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

  2. Antwort von nach 49 Minuten hilfreich
    Re: Borland Pascal und Datensegment

    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

    • Antwort von nach einer Stunde hilfreich
      Re^2: Borland Pascal und Datensegment

      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 :-)) 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 :-)
      von wegen Datensegment und so...

      Jedenfalls danke
      alois

      • Antwort von nach 2 Stunden hilfreich
        Re^3: Borland Pascal und Datensegment

        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 :-)) 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 :-)
        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

        • Antwort von nach 4 Stunden hilfreich
          Re^4: Borland Pascal und Datensegment

          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 :-)
          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

          • Antwort von nach 4 Stunden hilfreich
            Re^5: Borland Pascal und Datensegment

            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 :-)
            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

            • Antwort von nach 5 Stunden hilfreich
              Re^6: Borland Pascal und Datensegment

              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. :-(

              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

            • Antwort von nach 5 Stunden hilfreich
              Re^7: Borland Pascal und Datensegment

              Hallo! naja, nicht ganz, der einstellbare Heap
              ist eben der lokale Heap.
              Der globale Heap (GlobalAlloc,...) der
              darf wie er will...
              Sonst nix. :-(
              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



Keine passende Antwort gefunden? Jetzt eigene Frage stellen!