Mit Array rechnen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
ErnstVolker
Beiträge: 327
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Mit Array rechnen

Beitrag von ErnstVolker »

Hallo Lazarusgemeinde,

ich hab' als Neuling schon mal gleich ein Problem und frag' mich selbst ob noch alle Latten am Zaun sind.

Ich esrtellte in FreePascal folgendes kleine Progrämmchen:

Code: Alles auswählen

program arraytest;
uses math;
var x, y: array [0..10] of integer;
          i: integer;
const dx=1;
begin
   for i:=0 to high(x) do begin
      x[i]:=0; //Erstmal Nullen reinpumpen
      y[i]:=0;
   end;
 
   //Mit den Arrays rechnen
   for i:=0 to high(x) do begin
        x[i+1]:=x[i]+dx;
                     y[i]:=sqr(x[i]);
        writeln(x[i],'   ',y[i]);
   end;
readln;
end.


Das funktioniert auch. Im Dos-Fenster erscheint:
0 0
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
10 100
Prima Sache, funktioniert.
Nur unter Lazarus, auch bei Konsolenanwendung erscheint die Fehlermeldung:
"Project raised exception. Class Externel: SIGSEGV.
Das SIGSEGV ist hier schon mehrfach aufgetaucht.

Lazarus mag scheinbar den Aufruf:
x[i+1]:=x[i]+dt;
nicht.

Aber ich kenne Array-Behandlung eigentlich nicht anders. In SCILAB mache ich es genauso.
Wenn ich es wie folgt abändere:

Code: Alles auswählen

for i:=1 to high(x) do begin
        x[i]:=x[i-1]+dx;
                     y[i]:=sqr(x[i]);
        writeln(x[i],'   ',y[i]);
   end;

Dann kommt die Fehlermeldung nicht, aber ich finde es komisch.
Muß ich bei Lazarus und Array's grundsätzlich umdenken?
Blöd ist dabei nur, daß ich einen Algorithmus aus einem Buch abgetippt habe, der recht umfangreich ist, dieser sich an SCILAB orientiert
und ich ihn eigentlich nicht abändern wollte.

Kann mir jemand auf die Sprünge helfen?

MfG

Volker
Zuletzt geändert von monta am Di 17. Feb 2009, 12:38, insgesamt 1-mal geändert.
Grund: Codetags gesetzt

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

Re: Mit Array rechnen

Beitrag von theo »

Hier

or i:=0 to high(x) do begin
x[i+1]:

greifst du doch auf das 11. Element zu (10+1), welches es nicht gibt.
Oder?

ErnstVolker
Beiträge: 327
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Mit Array rechnen

Beitrag von ErnstVolker »

Hallo theo,

das mit Index 11 stimmt wohl, aber das 11. Element ist doch vorhanden.
Mit high(x) in dem Fall x=10 wird von i:=0 an die Schleife doch 11 mal durchlaufen.
Das Array hat, incl. Index "0" genau 11 Elemente.
Sollte also gehen.
Mit Python funktioniert es, mit Scilab auch.

Aufgefallen ist mir das, weil ich Werte an Plotpanel übergeben wollte. Da gab's den Fehler.

Hängt es vielleicht damit zusammen, daß ich Plotpanel installiert hab' und anschließend TAGarph
ausprobieren wollte? Das hat sich nämlich gebissen.

Ich wer' heute Abend mal Lazarus Deinstallieren und neu Installieren, ohne Plotpanel.
Mal sehen was passiert.
Ich dachte ich frag' vorher mal im Forum, bevor ich alles niedermache.

Gruß

Volker

m97rtin
Beiträge: 1
Registriert: Di 17. Feb 2009, 17:13

Re: Mit Array rechnen

Beitrag von m97rtin »

Schon richtig das das 11. Element vorhanden ist aber da du dein array erst ab dem zweiten Element beschreibst und dieses dann 11mal wiederhohlst landest du beim 12. Element.
Glaube das meinte theo.

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: Mit Array rechnen

Beitrag von creed steiger »

Ich denke das kann so nicht funktionieren
(siehe Demo)
Dateianhänge
Archiv.zip
(95.06 KiB) 67-mal heruntergeladen

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

Re: Mit Array rechnen

Beitrag von theo »

m97rtin hat geschrieben:Schon richtig das das 11. Element vorhanden ist aber da du dein array erst ab dem zweiten Element beschreibst und dieses dann 11mal wiederhohlst landest du beim 12. Element.
Glaube das meinte theo.


Ja klar, ich meinte x[11], also durchgezählt das 12. Element. Ist aber eig. Wurscht.
Tatsache ist, dass Volker im letzten Schleifendurchlauf auf x[high(x)+1] zugreift, und das kann nicht sein.
RangeChecks einschalten macht das Ganze noch etwas deutlicher.

ErnstVolker
Beiträge: 327
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Mit Array rechnen

Beitrag von ErnstVolker »

Hallo und vielen Dank für die Antworten.

Ihr habt recht. Ich greife auf ein Elemnt zu was nicht da ist. Das kann nicht gehen.
Ich dachte wenn die Schleife bei high(x) angekommen ist, dann sei (high(x)+1)=11, aber absolut ist die Schleife bereits 11 mal durchgelaufen
und ich greife auf "Element 12" zu. Das geht natürlich nicht.

Was mich nur wundert ist, daß unter FreePascal auf Dos-Ebene es zu keinem Konflikt kam oder zumindest keine Fehlermeldung.
Und witzigerweise lief meine "Lazarus-Konsolenanwendung" auch bei Doppelklick im Explorer ohne Fehlermeldung, nur innerhalb der Entwicklungsumgebung
gab es den Fehler.

Allerdings mein Programm, welches Plotpanel benutzt, das schmierte bei Doppelklick im Explorer und zwei bis dreimaligem Ausführen besagter
Berechnungsroutine dann ab, zu recht.

Vielen Dank zusammen für die Hilfe.

Hinsichtlich PlotPanel bzw. der Package-Installation würde mich interessieren, wie man es anstellt "ta" doppelt zu nutzen.
Ich hatte PlotPanel installiert und wollte zuaätzlich TAGraph ausprobieren. Das gab einen, ich nenne es mal Paktkonflickt, denn es war
"ta" schon da und Lazarus ließ sich nicht neu erstellen.
Sollte man beides nicht gemeinsam nutzen?

Danke im voraus

Volker

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: Mit Array rechnen

Beitrag von af0815 »

ErnstVolker hat geschrieben:Was mich nur wundert ist, daß unter FreePascal auf Dos-Ebene es zu keinem Konflikt kam oder zumindest keine Fehlermeldung.

Wenn man keine Überprüfungen (Compilereinstellung->Quelltext->Überprüfungen oder Equivalent in FP) hineinkompiliert, dann gibt es auch niemand der dir unmittelbar die rote Karte zeigt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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: Mit Array rechnen

Beitrag von mschnell »

ErnstVolker hat geschrieben:Was mich nur wundert ist, daß unter FreePascal auf Dos-Ebene es zu keinem Konflikt kam oder zumindest keine Fehlermeldung.

Ob es in zu einer "Protection" Exception kommt, wenn man auf nicht ecistierende Array-elemente zugreift, hängt von allem möglichen ab, und ist eher unwahrscheinlich. Wahrscheinlicher ist, dass irgendetwas im Speicher überschrieben wird und schwer später dann völlig zusammenhanglose schwer zu findende Fehler auftreten.

Es gibt einen Compiler-Switch, der das realtime-Testen von Array-grenzen einschaltet. Das kostet eine Menge Rechenzeit, hilft aber um ein Programm sicher zu machen.

-Michael

ErnstVolker
Beiträge: 327
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Mit Array rechnen

Beitrag von ErnstVolker »

Hallo zusammen,
hallo creed,

danke für Dein Kurzprojekt. Mir ist mein Denkfehler klar geworden. Ich hab' andauernd an length(x) gedacht, bzw. war es gewohnt bei Arrays die for-Schleifen bis length(x)-1
laufen zu lassen. Durch high(x) hatte ich mich gefreut daß das ja prima ist und ich mir "-1 sparen" könnte. Blöd nur daß halt bis high(x) incl. Null also doch 11mal
durchgelaufen, und durch x[i+1] auf Element 12 zugegriffen wird welches nicht existiert. Durch einfache Ausgabe des Schleifenzählers hätt' ich selbst drauf kommen können.

Hab' wohl doch nicht alle Latten am Zaun... :-)

Danke nochmal

Gruß

Volker

Antworten