Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Globale Variable wird geändert einfach so (https://www.delphipraxis.net/35853-globale-variable-wird-geaendert-einfach-so.html)

Kn1bbl 12. Dez 2004 17:01


Globale Variable wird geändert einfach so
 
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Edit1: TEdit;
    ListBox1: TListBox;
    Button1: TButton;
    ListBox2: TListBox;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    Label2: TLabel;
    RadioGroup1: TRadioGroup;
    Button4: TButton;
    GroupBox3: TGroupBox;
    Edit2: TEdit;
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure einlesen();
    procedure ausgabe();
    procedure FormCreate(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type feldtype = array[1..100] of integer;



var
  Form1: TForm1;
  anzahl: integer;
  werte: feldtype;

implementation

{$R *.dfm}

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

procedure TForm1.Button2Click(Sender: TObject);
begin
        edit1.clear;
        listbox1.Clear;
        listbox2.Clear;
        radiogroup1.ItemIndex := -1;
end;

procedure TForm1.einlesen();
var i: integer;
begin
        {Leeren der Listboxkomponente vor dem ersten/erneuten Eintragen}
        listbox1.Clear;
        anzahl := 0;

        {Beginn der Eingabeüberprüfung}
        if edit1.Text = '' then
        begin
                anzahl := strtoint(inputbox('Keine Anzahl eingegeben!', 'Anzahl bitte eingeben:', '23'));
                edit1.Text := inttostr(anzahl);
        end
        else if strtoint(edit1.Text) > 100 then
        begin
                anzahl := strtoint(inputbox('Anzahl ist zu klein!', 'Anzahl bitte eingeben:', '23'));
                edit1.Text := inttostr(anzahl);
        end
        else if strtoint(edit1.Text) < 1 then
        begin
                anzahl := strtoint(inputbox('Anzahl ist größer als 100!', 'Anzahl bitte eingeben:', '23'));
                edit1.Text := inttostr(anzahl);
        end
        else
        begin
                anzahl := strtoint(edit1.Text);
                edit1.Text := inttostr(anzahl);
        end;
        {Ende der Eingabeüberprüfung}


        {Beginn Zuweisung}
        for i := 1 to anzahl do
        begin
                {Eintragen der Werte in das Feld}
                werte[i] := random(100) + 1;
                {Eintragen der Werte in die Listboxkomponente}
                listbox1.Items.Add(inttostr(werte[i]));
        end;
        {Ende Zuweisung}
end;

procedure TForm1.ausgabe();
var i: integer;
begin
        for i := 1 to anzahl do
        begin
                ListBox2.Items.Add(inttostr(werte[i]));
        end;
end;

procedure bubblesort();
var i, j, tmp: integer;
begin
        for i := 1 to (anzahl - 1) do
                for j := anzahl downto 1 do
                        if werte[j - 1] < werte[j] then
                        begin
                                tmp := werte[j - 1];
                                werte[j - 1] := werte[j];
                                werte[j] := tmp;
                        end;
end;

procedure shellsort();
var k,i:integer;
begin
        k := werte[1];
        for i := 1 to anzahl do
        begin
                if werte[i] < k then
                        k := werte[i];
        end;

        showmessage(inttostr(k));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
        einlesen();
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
        randomize;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
        ListBox2.Clear;

        case RadioGroup1.ItemIndex of
                -1: showmessage('Bitte wählen sie das Verfahren aus!');
                0: bubblesort();
                1: shellsort();
                2: showmessage('Bitte wählen sie das Verfahren aus!');
        end;

        ausgabe();
end;

end.
Hallo,

das ist der Code der mir Kopfverbrechen bringt. Es geht um ein Schulprojekt, ganz einfach eigenltich, Sortieralgorithmen.

Dort haben wir eine Eingabe welche ein Array voll haut mit n Elementen (n wird eingegeben und heisst im Program anzahl: integer). Und obwohl ich keinen Befehl sehen kann, wo anzahl geändert wird, ändert sich anzahl in der procedure bubblesort.
Die Eingabe Funktion scheint zu funktionierne.
Wenn ich jedoch anzahl gleich am Anfang von bubblesort()ausgeben lasse, hat es noch den richtigen wert, jedoch ist dies nicht mehr der Fall nachdem die Schleifen durchlaufen wurden. Dabei wird es aber nie direkt geändert. :wiejetzt:

Bitte helft mir! :gruebel:

fiasko 12. Dez 2004 18:29

Re: Globale Variable wird geändert einfach so
 
Hallo,

schon mal probiert das ganze im Einzelschritt durchzugehen und immer geschaut (->Überwachte Ausdrücke) wo sich "anzahl" ändert? Im bubblesort kann es ja schlecht sein wenn nicht grad schwarze Magie im Spiel ist :mrgreen:...

Sanchez 12. Dez 2004 19:24

Re: Globale Variable wird geändert einfach so
 
Zitat:

Zitat von fiasko
schon mal probiert das ganze im Einzelschritt durchzugehen und immer geschaut (->Überwachte Ausdrücke) wo sich "anzahl" ändert? Im bubblesort kann es ja schlecht sein wenn nicht grad schwarze Magie im Spiel ist :mrgreen:...

Ich habs versucht. Da muss irgendwo schwarze (Compiler-)Magie dahinter sein :gruebel:
Möglicherweise funktionierts mit jeweils einer Hilfsvariable für die beiden Schleifen.

Delphi-Quellcode:
procedure bubblesort();
var i, j, tmp, AnzAussen, AnzInnen: integer;
begin
  AnzAussen := anzahl;
  AnzInnen := anzahl;

  for i := 1 to (AnzAussen - 1) do begin
    for j := AnzInnen downto 1 do begin
      if werte[j - 1] < werte[j] then begin
        tmp := werte[j - 1];
        werte[j - 1] := werte[j];
        werte[j] := tmp;
      end;
    end;
  end;
end;
Habs aber nicht ausprobiert. Ist jetzt nur mal ne Vermutung.

grüße, daniel

dizzy 12. Dez 2004 19:31

Re: Globale Variable wird geändert einfach so
 
Evtl. ist die Bereichsprüfung aus, und du rauscht irgendwo über die Arraygrenze (hab den Code jetzt nicht soo genau inspiziert). Es kann dann nämlich durchaus passieren dass deine Variable direkt hinter dem Array liegt, und du sie so überschreibst. Damit hab ich auch schon mehr als hirnzermaternde Effekte erlebt. Einfach mal die Breichsprüfung anschalten, und schauen ob sie irgendwo anspringt.

fiasko 12. Dez 2004 19:58

Re: Globale Variable wird geändert einfach so
 
Genau das wird es sein, da ist ein Fehler im Code von BubbleSort:

werte[j - 1]

j läuft von anzahl bis runter auf 1, werte[0] gehört aber nicht zum Array, und siehe da anzahl ist direkt davor deklariert :-)

Kn1bbl 12. Dez 2004 22:10

Re: Globale Variable wird geändert einfach so
 
Oh man, ich seh einfahc nicht durch.

ich hatte erst eine Varialbe gesetzt, die quasi Anzahl entsprach. Diese dann verwendet, sodass anzahl gleich blieb und dass sich dann die andere geändert hattte, war mir dann egal.
Da dies aber irgnedwie dumm war, hab ich jetzt erst einmal zurück gemacht und wollte den Tipp von fiasko befolgen (den ich nicht richtig verstehe). Und siehe da, bevor ich dazu komme läuft das Programm. :cyclops:

Naja, auf jeden Fall geht es im Moment komischerweise. Delphi und ich passen einfach nicht zusammen!

dizzy 12. Dez 2004 22:18

Re: Globale Variable wird geändert einfach so
 
Zitat:

Zitat von fiasko
Genau das wird es sein

Ja schau! Hat sich das Putzen meiner Glaskugel doch rentiert :mrgreen:. So lassen solltest du das auf keinen Fall! Das kann immer wieder knallen.

Lass die Schleife einfach nur bis 2 anstelle von 1 runter laufen. Dann sollte eigentlich alles gut sein. (Ich hoffe das stört den Algo net zu sehr - sollte aber nicht.)

Kn1bbl 12. Dez 2004 22:49

Re: Globale Variable wird geändert einfach so
 
Argh, ihr hattet vollkommen Recht. Dadurch wurde auch die kleinste Zahl bei der Ausgabe immer verschluckt wie es scheint.

Vielen Dank, jetzt ist anscheinend (erstmal) alles schick!


Danke vielmals.

dizzy 13. Dez 2004 00:19

Re: Globale Variable wird geändert einfach so
 
Verschluckt wurde sie nicht. Sie stand wohl nachher in "anzahl". Dafür war der Wert von "anzahl" brav im Array einsortiert schätze ich :D

Kn1bbl 13. Dez 2004 17:38

Re: Globale Variable wird geändert einfach so
 
Hmm, dass würde durchaus einiges erklären. Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz