AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Warteschlange realisieren

Ein Thema von hotkey · begonnen am 13. Mai 2012 · letzter Beitrag vom 14. Mai 2012
Antwort Antwort
Seite 6 von 8   « Erste     456 78   
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#51

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 16:42
Zunächst einmal sollte das "create" dort verschwinden, denn wenn Du auf Button1 clickst, dann sollte Dein "Warteschlangenarray schon existieren.

Ich würde ein Record übergeben, etwa so

Delphi-Quellcode:
var
  myrec : tperson; //tperson ist etwas besser als das nackte person

begin
  Myrec.ID:= Edit1.Text;
  Myrec.Name:=Edit2.Text;
  MySchlange.Einfuegen(Myrec);
  .....
Du solltest Dir vielleict auch angewöhnen halbwegs sprechende Namen für Deine Variablen und Typen zu benutzen, damit machst Du Dir das Leben etwas einfacher.

z.B. edt_Name oder edt_ID



Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#52

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 16:51
So ähnlich hatte ich mir das auch gedacht. Wozu soll man auch einen Record-Parameter deklarieren, den man dann innerhalb der Funktion gar nicht nutzt, sondern stattdessen auf GUI-Controls zugreift? Macht ja keinen Sinn.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hotkey

Registriert seit: 20. Aug 2011
Ort: Berlin
113 Beiträge
 
Delphi 6 Personal
 
#53

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 17:08
Hallo,

also so sieht es jetzt bei mir aus :

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

  Tperson = record
    Name:string;
    id:integer;
  end;


  Tschlange = class
  private
    next,max:integer;
    schlange : array [1..10] of tperson;
  public
    function einfuegen(x:tperson):boolean;
    constructor create;
  end;


var
  Form1: TForm1;
  myschlange:Tschlange;
  myrec : Tperson;
  i : integer;

implementation

{$R *.dfm}


constructor tschlange.create;
 begin
  next :=10;
  max := 10;
 end;

function tschlange.einfuegen(x: tperson):boolean;
begin
  //hinter dem Array kann man nichts mehr einfügen
  Result := Next >0;
  if Result then
    begin

      //Daten an aktuelle Array-Position schreiben
      schlange[Next].Name := x.Name;
      schlange[Next].Id := x.id;
      //Position abziehen
      dec(Next);

    schlange[next].Name:=x.name;
    schlange[next].id := x.id;

    end
     else // wenn next = 0 ist
        begin
            for i:=9 downto 1 do
            schlange[i+1]:=schlange[i];
            showmessage('Fehler'); // Test , ob was gemacht wird , wenn next =0 ist
            end;



end;

procedure recordirgendwas;
 begin
  myrec.Name := form1.edit1.text;
  myrec.id := strtoint(form1.edit2.text);
  end;



procedure TForm1.Button1Click(Sender: TObject);
begin
recordirgendwas;



end;

end.
Ist das semantisch richtig ?
Felix
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#54

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 17:34
Weshalb trägst Du die Daten denn jetzt 2 mal ein?

[edit]
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  MyRec: TPerson;
begin
  MyRec.Name := Edit1.Text;
  MyRec.id := StrToInt(Edit2.Text);
  MySchlange.einfuegen(MyRec);
end;
Wenn Du die ganzen globalen Variablen (außer dem Formular) mal weglässt, wird das viel übersichtlicher. MySchlange könnte auch ein privates Feld des Fornulars werden, welches Du im OnCreate erzeugst und im OnDestroy wieder freigibst.[/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (14. Mai 2012 um 17:39 Uhr)
  Mit Zitat antworten Zitat
hotkey

Registriert seit: 20. Aug 2011
Ort: Berlin
113 Beiträge
 
Delphi 6 Personal
 
#55

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 17:37
Wo denn , wenn ich fragen darf ?
Felix
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#56

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 17:39
Na, hier:
Zitat:
Delphi-Quellcode:
  if Result then
    begin

      //Daten an aktuelle Array-Position schreiben
      schlange[Next].Name := x.Name; //Nr. 1
      schlange[Next].Id := x.id;
      //Position abziehen
      dec(Next);

    schlange[next].Name:=x.name; //Nr. 2
    schlange[next].id := x.id;

    end
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hotkey

Registriert seit: 20. Aug 2011
Ort: Berlin
113 Beiträge
 
Delphi 6 Personal
 
#57

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 17:45
Naja next ist doch 10 , und wenn ich was eingefügt habe , will ich in ja next 9 was reinmachen , dazu muss ich doch dec benutzen , oder ?
Felix
  Mit Zitat antworten Zitat
schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#58

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 17:46
In ButtonClick ist nichts doppelt.

Doppelt gemoppelt ist eher das hier:

Delphi-Quellcode:
function tschlange.einfuegen(x: person):boolean;
begin
  //hinter dem Array kann man nichts mehr einfügen
  Result := Next >0;
  x.Name:= form1.edit1.text; // ERWITERUNG
  x.id := strtoint(form1.edit2.text); // ERWEITERUNG
  if Result then
    begin

      //Daten an aktuelle Array-Position schreiben
      schlange[Next].Name := x.Name;
      schlange[Next].Id := x.id;
      //Position abziehen
      dec(Next);

    schlange[next].Name:=x.name;
    schlange[next].id := x.id;

    end;
end
nämlich das 2. Mal Schlange[next].name und Schlange[next].id.

Warum?

Weil die Zuweisung bereits bei "Daten an aktuelle Position schreiben" erfolgt. Die 2. Zuweisung darunter erfolgt nicht nur unnötig doppelt, sondern zu allem Überfluss noch nach der Dekrementierung des Index Next. So steht dann der Name mit gleicher ID zwei Mal in der Schlange. Hintereinander. Das geht logisch nicht, ist Fehler, weil eine Person nur einmal in der Schlange stehen kann. Diese kann maximal zu einem späteren Zeitpunkt NACHDEM sie an der Kasse schon bezahlt hat, nochmals kommen.

Denn der Name der Person hat sich zwischenzeitlich im Code vor der 2. Zuweisung noch nicht geändert, ist also mit Sicherheit noch dieselbe Person.
.
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#59

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 17:47
Ja, aber wieso schreibst Du dann in 9 dieselben Daten nochmal?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hotkey

Registriert seit: 20. Aug 2011
Ort: Berlin
113 Beiträge
 
Delphi 6 Personal
 
#60

AW: Warteschlange realisieren

  Alt 14. Mai 2012, 17:51
Achso ich verstehe den Fehler jetzt.

Aber :

Delphi-Quellcode:
function tschlange.einfuegen(x: person):boolean;
begin
  //hinter dem Array kann man nichts mehr einfügen
  Result := Next >0;
  x.Name:= form1.edit1.text; // ERWITERUNG
  x.id := strtoint(form1.edit2.text); // ERWEITERUNG
  if Result then
    begin

      //Daten an aktuelle Array-Position schreiben
      schlange[Next].Name := x.Name;
      schlange[Next].Id := x.id;
      //Position abziehen
      dec(Next);

    schlange[next].Name:=x.name;
    schlange[next].id := x.id;

    end;
end
Wenn ich was eingebe die ID und den Namen , dann bin ich ja im 10.Array Feld , denn next ist 10 , und wie kann ich dann Daten ins 9.Array Feld eingeben ?
Felix
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 21:42 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