Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Sortierprogramm

  Alt 9. Jan 2007, 07:55
Hallo Wieland,

Zitat von tankm26:
... Was meinen Sie mit "selber Ebene"? Die procedure, in welcher auch mausae(0) aufgerufen wird? ...
den Hinweis mit der Aufrufebene hast du genau richtig verstanden und, wie ich an deinem Code sehen kann, auch so umgesetzt.

Zitat von tankm26:
... Die Zeitmessung, für die Ermittlung der Effektivität unerlässlixh, funktioniert nicht merh. Worann kann das liegen? ...
Deine globalen Variablen werden im Hauptspeicher in der von dir angegebenen Ordnung aufeinander folgend angelegt.

Delphi-Quellcode:
var
  // ...
  ergebnisse: array [0..4, 0..3] of Single;
  max, anzahldurch, AnzahlTeillisten, ss, lt, hi, lu, x: Integer;
Dein Array ergebnisse[] besteht aus 20 Elementen, die zweidimensional adressiert werden. Im Ereignis-Code OnCreate() deiner Form initialisierst du die Variable anzahldurch:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  // ...
  anzahldurch := 25;
  maxan(32);
  // ...
end;
Der Aufruf der Methode maxan() führt dann zur kleinen Katastrophe:

Delphi-Quellcode:
procedure TForm1.maxan(w: Integer);
var
  i, s: Integer;
begin
  for i := 0 to 6 do
    for s := 1 to 3 do
      ergebnisse[i, s] := 0;
Bei der Initialisierung gehst du von 28 Elementen aus, sieben in der ersten Dimension und vier in der zweiten. Die Typen Single und Integer belegen jeweils ein Doppelwort (vier Byte), sodass folgendes passiert: Du initialisierst 28 Doppelworte mit 0, außer dem ersten, dem fünften, dem neunten, etc. (weil du in der zweiten Dimension mit eins und nicht mit 0 startest). Da du acht Doppelworte zuviel adressierst, werden auch noch die folgenden Integer-Variablen mit 0 initialisiert, außer max und lt. Führe Konstanten für die statische Dimensionierung ein, oder benutze die eingebauten Funktionen High() und Low() beim Zugriff auf Arrays.

Ich fürchte, dass da noch einige Fehler in deinem Code stecken. Die vielen globalen Variablen machen, nicht zuletzt durch ihre wenig sprechenden Namen, einen Code-Walk-Through nicht gerade leicht. Falsche oder fehlende Initialisierungen globaler Variablen sind auch der Grund für die Division durch 0 beim ersten Aufruf der Methode zeitmessung().

Freundliche Grüße
  Mit Zitat antworten Zitat