Speicherverwaltung

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
HellBag
Beiträge: 4
Registriert: Mi 15. Aug 2012, 08:41

Speicherverwaltung

Beitrag von HellBag »

Hallo zusammen,

ich bin ganz neu hier in der Community, darum verzeit, wenn ich diesen Post evt. unter einem flaschen Thema schreibe.
Ich habe beruflich den Quellcode eines recht alten Programms bekommen, welches statistische Zeitreihen von Windgeschwindigkeiten produzieren kann. Das Problem ist, dass mit der heutigen Rechnerleistung wesentlich mehr Datensätze produziert werden können als vorher, was im Programm allerdings limitiert ist. Die Limitation zu entfernen war kein Problem, jedoch besitzt dieses Programm eine eigene Speicherverwaltung, die nicht so leicht auszutricksen ist. Befehle wie

Code: Alles auswählen

maxavail()
und

Code: Alles auswählen

release(Heaporg)
konnte ich bereits erfolgreich auskommentieren, jedoch komme ich jetzt an einen Punkt, an dem meine Erfahrung nicht mehr ausreicht. Ich benutze Win7 und Lazarus IDE v0.9.30.4.
Ich definiere eine Variable Y

Code: Alles auswählen

type
  N2array = array[1..N2max] of single;
  Yp = ^N2array;
var
  Y  : array[1..NVmax] of Yp;
Der orginal Code sieht vor für alle Werte in dem Array Speicher zu reservieren

Code: Alles auswählen

for I:=1 to NT do new(Y[I]);
Da alle Speicherbefehle mehr funktionieren, bleibte es nicht aus, dass ich auch den "new"-Befehl auskommentierte. So weit funktioniert das wunderbar, bis in einer Procedure Y mit Werten gefüllt werden soll.

Code: Alles auswählen

Y[J]^[2*JF+1]:=Bufp^[NC-1];
beim ersten ersten Durchlaufen der Schleifen in der die Zeile steht, bekomme ich die Fehlermeldung
"Projekt project1.exe hat Exception-Klasse >>External: SIGSEGV<< ausgelöst.".
Ich sitze nun schon seit Tagen vor diesem Problem und weiß trotz Internetrecherche nicht weiter. Wie kann ich diesen Fehler umgehen? Bzw. wie bekomme ich die alten Speicherbefehle wieder zum laufen?
Könntet ihr mir bitte helfen?

Mit besten Grüßen
- Hauke

Benutzeravatar
theo
Beiträge: 10951
Registriert: Mo 11. Sep 2006, 19:01

Re: Speicherverwaltung

Beitrag von theo »

Wie kommst du drauf, "new" einfach auszukommentieren? Das kann nicht gehen, da so kein Speicher reserviert wird.
http://www.freepascal.org/docs-html/rtl/system/new.html" onclick="window.open(this.href);return false;

HellBag
Beiträge: 4
Registriert: Mi 15. Aug 2012, 08:41

Re: Speicherverwaltung

Beitrag von HellBag »

Ersteinmal vielen Dank für die Antwort!

Wenn ich "new" nicht auskommentiere erhalte ich folgenden Fehler:
"Projekt project1.exe hat Exception-Klasse >>RunError(203)<< ausgelöst."

Unter http://community.freepascal.org/docs-ht ... rch14.html wird folgendes geschrieben:
" 203 Heap overow error
The heap has grown beyond its boundaries. This is caused when trying to allocate memory exlicitly with New, GetMem or ReallocMem, or when a class or object instance is created and no memory is left. Please note that, by default, Free Pascal provides a growing heap, i.e. the heap will try to allocate more memory if needed. However, if the heap has reached the maximum size allowed by the operating system or hardware, then you will get this error. "


Es kann aber nicht sein, das ich die Grenze meines Speichers erreicht habe... es werden nicht soviele Daten geschreiben, dass 12GB belegt wären.

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

Beitrag von carli »

In welchem Mode kompilierst du denn? Etwa dem 16-Bit-Mode? (welcher blöderweise Standard ist...)

HellBag
Beiträge: 4
Registriert: Mi 15. Aug 2012, 08:41

Re: Speicherverwaltung

Beitrag von HellBag »

Ehrlich gesagt habe ich keine Ahnung... wie stelle ich das um, bzw. wo gucke ich das nach?

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

Beitrag von Socke »

HellBag hat geschrieben:Ehrlich gesagt habe ich keine Ahnung... wie stelle ich das um, bzw. wo gucke ich das nach?
Schau mal unter "Projekt" -> "Projekteinstellungen" -> "Codegenerierung" nach "Ziel-Betriebssystem" und "Ziel-CPU-Familie"; Vielleicht meint carli das.

Ansonsten fällt mir noch ein, dass Windows die maximale Speichermenge für alte 16-bit Programme begrenzt (wie man das ändert, weiß ich leider nicht mehr).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6884
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Speicherverwaltung

Beitrag von af0815 »

Vielleicht ist der linkhttp://support.microsoft.com/kb/126962 mit deinem Problem im Zusammenhang.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

HellBag
Beiträge: 4
Registriert: Mi 15. Aug 2012, 08:41

Re: Speicherverwaltung

Beitrag von HellBag »

Vielen Dank für Eure Antworten!

@ Socke: Das Ändern des Zielsystems und der CPU-Familie hat leider nicht geholfen.

@ af0815: Ich habe mir den Artikel angesehen und habe festgestellt, dass mein System bereits so konfiguriert ist, wie dort vorgeschlagen wird.

Vielleicht sollte man in eine andere Richtung denken und versuchen die Speicherbefehle wie

Code: Alles auswählen

maxavail
und

Code: Alles auswählen

release(HeapOrg)
zu reaktivieren, jedoch habe ich keine Idee wie das funktionieren soll... vielleicht ist das auch eine dämliche Idee.

Antworten