Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Fehler bei Bubblesort Programm


Kiwibanana - So 10.04.11 12:20
Titel: Fehler bei Bubblesort Programm
Habe ein Problem beim Kompilieren.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
unit Bubblesort_u;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    bt_eingabe: TButton;
    li_text: TListBox;
    li_sort: TListBox;
    bt_sort: TButton;
    bt_ende: TButton;
    procedure bt_endeClick(Sender: TObject);
    procedure bt_eingabeClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  z : string;
  mal,i : integer;
  feld : array of string;


implementation

{$R *.dfm}

procedure TForm1.bt_endeClick(Sender: TObject);
begin
  close
end;

procedure TForm1.bt_eingabeClick(Sender: TObject);
begin
  z := Inputbox('Sortieren','Wie viele Wörter bzw. Zahlen sollen sortiert werden (Geben Sie bitte die Anzahl der Wiederholungen ein!)','');
  mal := strtoint(z);
  for i := 1 to mal do
    begin
      feld[i] := inputbox('Eingabe','Geben Sie ihr ' + inttostr(i) + '. Wort ein','');
      li_text.Items.Add(feld[i]);
    end;

end;

end.


Das Programm lässt sich zwar kompilieren, aber nach Eingabe des ersten Wortes kommt ein Fehler.
Kann mir wer helfen ?


haentschman - So 10.04.11 12:26

Moin...
Zitat:
Kann mir wer helfen ?

ja. In der Regel der Fehler selbst. Die Fehlermeldung (wirklich) lesen...und debuggen.

Hinweis:

- Du benutzt ein dynamisches Array. Du mußt die Größe selbst festlegen.
- Was passiert wenn in die erste Inputbox ein "A" eingegeben wird ?


jaenicke - So 10.04.11 13:57

Außerdem hast du aus Versehen Variablen global deklariert. Da sollte bei i auch eine entsprechende Compilerwarnung kommen. Ist halt keine gute Idee nicht zu lesen was da steht...

Zumindest i muss lokal deklariert werden, innerhalb der Prozedur. Das Array gehört z.B. unter private deklariert.


gnomecoder - So 10.04.11 14:47

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Zumindest i muss lokal deklariert werden, innerhalb der Prozedur.


warum?


HenryHux - So 10.04.11 15:05

user profile icongnomecoder hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Zumindest i muss lokal deklariert werden, innerhalb der Prozedur.


warum?


Es ist nicht zwingend, das läuft auch so, da du i ja immer den passenden Wert gibst.
Es ist aber trotzdem ein besserer Stil, wenn du die Laufvariablen immer nur innerhalb von den jweiligen Prozeduren deklarierst.
Generell solltest du versuchen so wenig Globale Variablen wie möglich zu verwenden.

Lg


jaenicke - So 10.04.11 15:23

Nicht umsonst gibt es eine entsprechende Compilerwarnung:

Quelltext
1:
[DCC Warnung] Unit1218.pas(28): W1019 FOR-Schleifenvariable muss eine einfache lokale Variable sein                    
Da es früher erlaubt war auch globale Variablen als Schleifenvariable zu benutzen, ist dies aus Gründen der Abwärtskompatibilität weiter möglich. Der erzeugte Code kann dann aber signifikant langsamer sein, da eine Optimierung für den Compiler nicht mehr möglich ist...


gnomecoder - So 10.04.11 15:26

danke. wieder was dazu gelernt :)