Autor
|
Thema: Veralgemeinerung mit Laufvariable (569 mal gelesen)
|
lilo123 Mitglied studentin
Beiträge: 9 Registriert: 16.06.2008
|
erstellt am: 26. Jun. 2008 18:45 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich hoffe hier hat jemand einen Tip für mich... Ich habe eine Kommissionierstr. und in 3 verschiedenen Zonen (puffer, puffer1, puffer2) wird geprüft ob die in den Paletten hinterlegten Positionen mit den Positionen der Puffer übereinstimmen. D.h es wird geprüft ob die Palette an dem Puffer stehen bleiben soll oder nicht. Nun mein Programm funktioniert soweit, aber ich würde gerne die Pos1,Pos2 usw mit einer Laufvariable vereinfachen, z.B. i... aber wenn ich statt pos1 posi schreibe, bekomme ich die Fehlermeldung, dass posi unbekannt ist, obwohl i natürlich als Attribut hinterlegt ist... Hier das Programm: is local i:integer; do if Förderstrecke.inhalt.Pos1 = Puffer.Pos1 or Förderstrecke.inhalt.pos2 = Puffer.Pos1 or Förderstrecke.inhalt.pos3 = Puffer.pos1 then Förderstrecke.inhalt.umlagern(Puffer) elseif Förderstrecke.inahlt.Pos1 = Puffer.pos2 or Förderstrecke.inhalt.pos2 = Puffer.pos2 or Förderstrecke.inhalt.pos3 = puffer.pos2 then Förderstreke.inhalt.umlagern(puffer) elseif Förderstrecke.inhalt.pos1 = puffer.pos3 or Förderstrecke.inhalt.pos2 = puffer.pos3 or Förderstrecke.inhalt.pos3 = puffer.pos3 then Förderstrecke.inhalt.umlagern(puffer) elseif puffer.voll = true then Förderstrecke.inhalt.umlagern(Förderstrecke1) else Förderstrecke.inahlt.umlagern(Förderstrecke1) end; end; Ich hoffe jemand hat eine Idee Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
anweser Mitglied student
Beiträge: 27 Registriert: 13.08.2006
|
erstellt am: 27. Jun. 2008 00:48 <-- editieren / zitieren --> Unities abgeben: Nur für lilo123
hallo Lilo123, wenn du statt Puffer, Puffer1, Puffer2 die Namen als Puffer1, Puffer2, Puffer3 vergibst, dann hilft dir dies weiter: ------*************------------------- is i:integer; i1: integer; kon: boolean; do if @.pos1 = @.pos2 and @.pos2 = @.pos3 then i:= @.pos1; for i1:= 1 to 3 loop kon:= execute(sprint(":boolean is do if ",i,"=Puffer",to_str(i1),".Pos",to_str(1)," then return true; else return false; end; end; ")); if kon= true then execute(sprint("is do if",to_str(@),".umlagern(Puffer",to_str(i1),") = false then",to_str(@),".umlagern(Förderstrecke1); end; end;")); exitloop; end; next; else @.umlagern(Förderstrecke1); end; end; ----------------*************** sonst, da du nur 3 Zustände hast dann kanst du auch so schreiben: ----------------*************** if @.pos1 = @.pos2 and @.pos2 = @.pos3 then i:= @.pos1; inspect i; when 1 then @.umlagern(Puffer); when 2 then @.umlagern(Puffer1); when 3 then @.umlagern(Puffer2); end; if @.buchpos = ? then @.umlagern(Förderstrecke1); end; else @.umlagern(Förderstrecke1); end; -------------------********** Ich würde dagegen eine Tabelle anlegen mit 2 Spalten [obj,integer]. Die Tabelle nach Pos1 suchen und nach obj umlagern also so ------------------********** is do if @.pos1 = @.pos2 and @.pos2= @.pos3 then tabelle.setzeZeiger(0,0); if Tabelle.finden({2,1}..{2,*},@.pos1) = true then if @.umlagern(Tabelle[1,Tabelle.ZeigerY]) = false then @.umlagern(Förderstrecke); end; else @.umlagern(Förderstrecke); end; end; ----------------------*************
ich hoff es hilft weiter Zur Erklärung: Alles was mit .Modelle.Netzwerk.(...) zu tun hat wird einfach runter gelesen. d.h. .Modelle.Netzwerk.Puffer.posi muss auch eine Variable posi enthalten. (.Modelle.Netzwerk.Puffer.to_str("pos"+to_str(i)): hier sucht es nach Vaiable to_str)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
lilo123 Mitglied studentin
Beiträge: 9 Registriert: 16.06.2008
|
erstellt am: 03. Jul. 2008 10:30 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe das Problem jetzt folgendermassen gelöst: (SensorID : integer) is local i:integer; do for i:= 1 to förderstrecke.inhalt.position.yDim loop
...... if förderstrecke.inhalt.position[1,i]= 55001000 or förderstrecke.inhalt.position[1,i]= 55002000 or förderstrecke.inhalt.position[1,i]=55002100 or förderstrecke.inhalt.position[1,i]=55002200 or förderstrecke.inhalt.position[1,i]=55003000 and förderstrecke.inhalt.position[1,i]<1 then förderstrecke.inhalt.umlagern(puffer) else förderstrecke.inhalt.umlagern(förderstrecke1) end; next; if puffer.belegt=true then förderstrecke.inhalt.umlagern(förderstrecke1) end; end; Allerdings bekomme ich manchmal die Fehlermeldung "Ein VOID kann keine Methode Position empfangen", in der Zeile mit den Pünktchen davor.
Hat jemand eine Idee was ich falch gemacht habe? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
anweser Mitglied student
Beiträge: 27 Registriert: 13.08.2006
|
erstellt am: 03. Jul. 2008 19:02 <-- editieren / zitieren --> Unities abgeben: Nur für lilo123
Hallo Deine For-Schleife läuft weiter, obwohl du schon das objekt umgelagert hattest (Also die Warnung, wird wahrscheinlich jedes mal rauskommen, wenn i beim umlagern /= Ydim ist). Um das zu beheben, musst, nach erfolgreichen Umlagern die Methode ganz verlassen, also "Return;" oder die for-schleife verlassen mit "exitloop;" werden. Dann müsste es funktionieren. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
lilo123 Mitglied studentin
Beiträge: 9 Registriert: 16.06.2008
|
erstellt am: 03. Jul. 2008 21:50 <-- editieren / zitieren --> Unities abgeben:
Ja, darüber hab ich auch schon nachgedacht, aber ich verstehe nicht, die anderen beiden Methoden, die haargenauso aufgebaus einwandfrei funktionieren. Wo muss denn das return oder exitloop dann hin in meine Schleife? Vor dem letzten end? Denn sonst wird die Schleife ja nach dem ersten Durchlauf (also i=1) unterbrochen. Besten Dank und Liebe Grüße, Lilo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
anweser Mitglied student
Beiträge: 27 Registriert: 13.08.2006
|
erstellt am: 04. Jul. 2008 11:05 <-- editieren / zitieren --> Unities abgeben: Nur für lilo123
hallo lilo123, Die Bedingung für das Verlassen lautet: "wenn ich umgelagert habe: beenden". also z.B.: "then förderstrecke.inhalt.umlagern(puffer); exitloop;". Zu frage wieso bei einer Methode nicht?: ""Allerdings bekomme ich manchmal die Fehlermeldung "Ein VOID kann keine Methode Position empfangen", in der Zeile mit den Pünktchen davor."" + ""Ja, darüber hab ich auch schon nachgedacht, aber ich verstehe nicht, die anderen beiden Methoden, die haargenauso aufgebaus einwandfrei funktionieren."" := Meine Überlegung ging volgendermaßen, for-variablen Grenze wird nur einmal abgefragt: also das Produkt ist schon mal Drauf. Unter Punktchen verstehe ich die Erste Ziele in For-Schleife. Und da du die Schleife nicht aktiv beendest, aber den Inhalt der Tabelle von Be abfragst, ist nach einer gelungenen Umlagerung kein Be mehr drauf und es gibt, die von dir genannte Fehlermeldung. Am sonsten ist, soweit ich es beurteilen kann, die Methode so richtig. Wieso jetzt die anderen zwei Methoden keine Fehlermeldung produzieren, kann ich so auf anhieb nicht beantworten. Hast du vielleicht schon den i Wert und Ydim bei der Umlagerung mal rausgeschrieben und gekuckt, wann umgelagert wird? Also wie Heufig läuft die for-Schleife unnötig weiter. Viel Spaß Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|