![]() |
Globale Variable wird geändert einfach so
Delphi-Quellcode:
Hallo,
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. 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: |
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:... |
Re: Globale Variable wird geändert einfach so
Zitat:
Möglicherweise funktionierts mit jeweils einer Hilfsvariable für die beiden Schleifen.
Delphi-Quellcode:
Habs aber nicht ausprobiert. Ist jetzt nur mal ne Vermutung.
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; grüße, daniel |
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.
|
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 :-) |
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! |
Re: Globale Variable wird geändert einfach so
Zitat:
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.) |
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. |
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
|
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