Zugriff auf Array außerhalb Grenzen?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Zugriff auf Array außerhalb Grenzen?

Beitrag von Timm Thaler »

Ich dachte ja eigentlich, dass einer der Vorteile von Pascal gegenüber C die Verhinderung von Bufferüberläufen ist. Nun ist es mir aber schon zweimal passiert, dass ich auf ein Array ausserhalb seiner Grenzen zugegriffen habe, was komische Erscheinungen, aber keine Fehlermeldung zur Folge hatte.

Folgende Konstellation...

Code: Alles auswählen

// ein Record mit integriertem Array
  dbuf = record
    tpos : integer;
    ttim : TDateTime;
    vval : array[1 .. 20] of real;  // <= hier kann ich leider nicht cdcnt verwenden, da const erst nach type  festgelegt
  end;
// Größe von Messwerten und Ringbuffer
const
  ctanz = 720;    // Größe Ringbuffer Daten
  cdcnt = 25;   // Anzahl Messwerte
// Ringbuffer zuweisen
var
  daten : array[0 .. ctanz - 1] of dbuf;    // Ringbuffer Daten
...
for i := 1 to cdcnt do
  for k := 0 to ctanz - 1 do
    val := daten[k].vval[i]// <= ergibt ungültige Daten für i > 20, aber keine Fehlermeldung
 


... gibt mir ungültige Werte zurück, wenn ich cdcnt erhöhe ohne das Array vval anzupassen. Sollte doch aber eine Fehlermeldung für Zugriff ausserhalb des Array zurückgeben, oder?

Disclaimer: In Basic hab ich cdcnt vor dem Array definiert, und damit das Array automatisch angepasst, geht leider in Pascal nicht, da type vor const vor val.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Zugriff auf Array außerhalb Grenzen?

Beitrag von wp_xyz »

Timm Thaler hat geschrieben:In Basic hab ich cdcnt vor dem Array definiert, und damit das Array automatisch angepasst, geht leider in Pascal nicht, da type vor const vor val.

Wer behauptet sowas? Natürlich kannst du const, type und var-Bereiche in beliebiger Reihenfolge aufrufen.

Und das mit der Fehlermeldung: Mache in den Projekt-Optionen > "Debugging" die Option "Bereich" unter "Überprüfungen" an... Es wird empfohlen, diese Überprüfungen während der Entwicklung ein- und in der Endversion wieder auszuschalten. Oder arbeite mit "Erstellmodi": Klicke auf die "..." neben "Erstellmodi" und dann auf "Create Debug and Release Mode". Im Debug-Mode sind alle Debug-Optionen eingeschaltet, im Release-Mode sind sie aus. Du kannst schnell zwischen Debug- und Release-Mode wechseln, in dem du den Toolbutton links neben dem grünen Start-Pfeil verwendest (2. Toolbar).

P.S. Falls du unter Windows arbeitest, ist lästig, dass am Programmende immer ein Fenster mit Speicherlecks aufpoppt. Das kannst du verhindern, indem du im Debugmode das Häkchen vor "Heaptrc-Unit verwenden" ("Andere Debugger-Optionen") wegmachst. Natürlich gelegentlich zur Prüfung auf Speicherlecks wieder anmachen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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: Zugriff auf Array außerhalb Grenzen?

Beitrag von af0815 »

Schalte dir beim Programmieren die Überprüfungen an.
Dateianhänge
Debuggingeinstellungen
Debuggingeinstellungen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Zugriff auf Array außerhalb Grenzen?

Beitrag von Mathias »

// <= hier kann ich leider nicht cdcnt verwenden, da const erst nach type festgelegt

Was hindert dich daran, die Const vor dem Type zu deklarieren ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Zugriff auf Array außerhalb Grenzen?

Beitrag von Timm Thaler »

Mathias hat geschrieben:Was hindert dich daran, die Const vor dem Type zu deklarieren ?


Meine Dummheit?

Ich war der festen Überzeugung, man müsse die Reihenfolge type > const > var in der Deklaration einhalten.

Aber danke für den Hinweis mit den Debugger-Einstellungen. Ich hab da bisher alles auf Standard gelassen, will ja nichts kaputtmachen. ;-)

Antworten