AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Globale Variable wird geändert einfach so
Thema durchsuchen
Ansicht
Themen-Optionen

Globale Variable wird geändert einfach so

Ein Thema von Kn1bbl · begonnen am 12. Dez 2004 · letzter Beitrag vom 13. Dez 2004
Antwort Antwort
Kn1bbl

Registriert seit: 23. Nov 2003
9 Beiträge
 
Delphi 7 Enterprise
 
#1

Globale Variable wird geändert einfach so

  Alt 12. Dez 2004, 17:01
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.

Bitte helft mir!
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#2

Re: Globale Variable wird geändert einfach so

  Alt 12. Dez 2004, 18:29
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 ...
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#3

Re: Globale Variable wird geändert einfach so

  Alt 12. Dez 2004, 19:24
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 ...
Ich habs versucht. Da muss irgendwo schwarze (Compiler-)Magie dahinter sein
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
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Globale Variable wird geändert einfach so

  Alt 12. Dez 2004, 19:31
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.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#5

Re: Globale Variable wird geändert einfach so

  Alt 12. Dez 2004, 19:58
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
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat
Kn1bbl

Registriert seit: 23. Nov 2003
9 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Globale Variable wird geändert einfach so

  Alt 12. Dez 2004, 22:10
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.

Naja, auf jeden Fall geht es im Moment komischerweise. Delphi und ich passen einfach nicht zusammen!
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Globale Variable wird geändert einfach so

  Alt 12. Dez 2004, 22:18
Zitat von fiasko:
Genau das wird es sein
Ja schau! Hat sich das Putzen meiner Glaskugel doch rentiert . 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.)
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Kn1bbl

Registriert seit: 23. Nov 2003
9 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Globale Variable wird geändert einfach so

  Alt 12. Dez 2004, 22:49
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.
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Globale Variable wird geändert einfach so

  Alt 13. Dez 2004, 00:19
Verschluckt wurde sie nicht. Sie stand wohl nachher in "anzahl". Dafür war der Wert von "anzahl" brav im Array einsortiert schätze ich
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Kn1bbl

Registriert seit: 23. Nov 2003
9 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Globale Variable wird geändert einfach so

  Alt 13. Dez 2004, 17:38
Hmm, dass würde durchaus einiges erklären. Danke
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz