![]() |
Anzeige:
|
|
|||||||
| XProfan Alles rund um die Programmiersprache XProfan. |
|
![]() |
|
|
LinkBack | Themen-Optionen | Ansicht |
|
|
#1 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Hallo zusammen, ich möchte einige proc's aus einer Schleife aufrufen (ca 25). Je nach Ereignis/Resultat soll die entsprechende Proc gestartet werden. Die Proc's heißen genau so, wie die möglichen Ereignisse/Resultate. Diese sind in einer Stringvariablen gespeichert.
So, Standardmäßig machen wir das ja jetzt so: Code:
... If res$ = "eins" eins 'proc 'eins' wird aufgerufen Elseif res$ = "zwei" zwei 'proc 'zwei' wird aufgerufen Elseif ... ... 'und das ganze jetzt 25x Endif Jetzt möchte gerne stattdessen folgendes Model bauen: Code:
... res$ 'die proc aufrufen, deren name den Inhalt der von res$ entspricht :-) ... 'ich spar mir also die ganze If/Elseif/Endif-Abfragerei Also sowas, wie das früher mit Gosub funzte (gosub res$) Kennt ihr da einen Trick, wie man das Hinkriegt? Ich denke da an sowas wie: Code:
call res$ 'oder: jump res$
__________________
Gruß Jörg Ideen gibt es viele - man muß sie nur haben... XProfan 11.2, XP-Pro SP2/3 Geändert von JörgG (07.11.2011 um 11:53 Uhr) |
|
|
|
|
|
|
#2 (Direktlink) | |
|
Weiß worum´s geht
![]() Registriert seit: 15.02.2011
Beiträge: 106
|
Du kannst die Funktionsadressen der Prozeduren mit ProcAddr() ermitteln und in einer Liste oder einem Array speichern und dann aufrufen.
Code:
Cls
Proc Test
Parameters l&
Var txt$ = String$(l&,0)
MessageBox( Txt$,"In der Prozedur",0)
EndProc
Declare function&,Parameter$
function& = ProcAddr("Test",1)
Parameter$ = "Es klappt!"
Call(function&,Addr(Parameter$))
WaitInput
Zitat:
__________________
Anhören lohnt sich wuestensand.info Geändert von _Joerg_ (07.11.2011 um 13:10 Uhr) |
|
|
|
|
|
|
#3 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Hi Jörg, Danke für das Beispiel. In dieser Richtung habe ich auch schon geforscht, aber es dann wieder verworfen. Irgendwie ist es am Ende deutlich mehr Code als If/ElseIf/EndIf und der Aufwand in der Schleife ist der Gleiche, nur das ich jetzt in einemArray/Liste nach dem entsprechenden Ausdruck suche & die dazu gehörige ProcAdresse rausgrabbel.
Und zusätzlich muß ich ja vorher dieses Array/Liste anlegen... Ich denke, da komm ich vom Regen in die Taufe Obwohl der Anzatz der Richtige ist, der Pferdefuß ist, daß zum Ermitteln der ProcAdresse UNBEDINGT ein Stringliteral für den procNamen verwendet werden muß. Wenn das eine Variable sein dürfte, wär alles schick: Code:
'test dynamische ereignisAuswertung
Declare sm$
cls
Proc 27
end
EndProc
Proc 48
Print "Null"
EndProc
Proc 49
Print "Eins"
EndProc
Proc 50
Print "Zwei"
EndProc
Proc 51
Print "Drei"
EndProc
while 1
WaitInput
sm$ = Str$(%key) 'sm$ enthält den ereignisstring (hier einfach den keycode)
'es können aber auch andere ausdrücke sein zu denen dann
'exakt eine gleichnamige proc gibt
Call(ProcAddr(sm$,1),0) 'so wär nicht schlecht
endwhile
end
__________________
Gruß Jörg Ideen gibt es viele - man muß sie nur haben... XProfan 11.2, XP-Pro SP2/3 |
|
|
|
|
|
#4 (Direktlink) |
|
Dauergast
![]() Registriert seit: 06.02.2009
Ort: Wien, Österreich
Beiträge: 1.083
|
Naja, in der guten alten Zeit wäre das kein Problem gewesen:
Code:
Randomize:Cls rnd(8^8):Var c$="1 2 3 4" ' steuert Abfolge Declare s$[]:s$[]=explode(c$," ") WhileLoop 0,sizeof(s$[])-1:gosub s$[&Loop]:Endwhile:WaitInput:End:1: Print "jaja, 1!":return:2: Print "Und 2":return:3: print "sowie 3, oder ":return:4: Print "etwa gar 4 ?":return
__________________
Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,XPSE,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB2:USB3 |
|
|
|
|
|
#5 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 15.02.2011
Beiträge: 106
|
Das geht alles - erfordert etwas mehr Aufwand aber wenn man wirklich viele Procs hat...
Code:
Declare ArrHdl$[4,2],Aufruf$,FunktionsAddr&,Index%
Proc Test1
Print "Proc Test1"
EndProc
Proc Test2
Print "Proc Test2"
EndProc
Proc NochEinTest
Print "Proc NochEinTest"
EndProc
Proc GanzWasAnderes
Print "Proc GanzWasAnderes"
EndProc
Var Procs$ = "Test1,Test2,NochEinTest,GanzWasAnderes"
Cls
'Hier könnte man noch festlegen, ob die Schreibweise berücksichtigt wird
'wenn Du alles klein oder groß schreibst, erfolgt die Übergabe dann mit Upper$/Lower$
ArrHdl$[0,0] = "Test1"
ArrHdl$[0,1] = Str$(ProcAddr(Test1,0))
ArrHdl$[1,0] = "Test2"
ArrHdl$[1,1] = Str$(ProcAddr(Test2,0))
ArrHdl$[2,0] = "NochEinTest"
ArrHdl$[2,1] = Str$(ProcAddr(NochEinTest,0))
ArrHdl$[3,0] = "GanzWasAnderes"
ArrHdl$[3,1] = Str$(ProcAddr(GanzWasAnderes,0))
Print "Befehle sind:",Procs$
Print "Bitte eingeben..."
While 1
'WaitInput
Input Aufruf$
If Instr(Aufruf$,Procs$)
Index% = IndexOf(ArrHdl$[],Aufruf$)
FunktionsAddr& = Val(ArrHdl$[Index%,1])
Call(FunktionsAddr&)
ElseIf Aufruf$ = "q"
Break
EndIf
Wend
Sowas wie das hier: Code:
Declare s$
WhileLoop 22
s$ = s$ + "Dim Bereich" + Format$("00",&Loop) + "#,500\n"
Wend
ClearClip
PutClip s$
__________________
Anhören lohnt sich wuestensand.info Geändert von _Joerg_ (07.11.2011 um 17:12 Uhr) |
|
|
|
|
|
|
#6 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 08.02.2009
Ort: Nußloch (bei Heidelberg)
Beiträge: 550
|
Also ich würde DRINGENDST davon abraten, ProcAddr derart zu missbrauchen. Das wird auf Dauer schiefgehen.
Gruß Roland
__________________
Pentium D 2,8 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon HD5450 1024 MB / Windows 7(32) - XProfan X2.0c AMD Athlon II X2 2,9 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon 3000 / Windows 7(64) - XProfan X2.0c http://www.xprofan.de |
|
|
|
|
|
#7 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Hi Jörg, da haben wir wohl beide parallel getüftelt
Code:
'test dynamische ereignisAuswertung Declare sm$ Declare a#, n# '--------------------------------------------------------- Proc *27* dispose a#, n# end EndProc Proc *48* Print "Null" EndProc Proc *49* Print "Eins" EndProc Proc *50* Print "Zwei" EndProc Proc *51* Print "Drei" EndProc '----------------------------------------------------- Proc regist 'hier hänge ich einfach jeden neuen procNamen (=ereignis) an Dim a#, 20 'bereich für procAdressen Dim n#, 30 'bereich für procNamen 'alle adressen der procs hintereinander in den bereich für die addressen schreiben Long a#, 0 = ProcAddr(*27*,0), ProcAddr(*48*,0), ProcAddr(*49*,0), ProcAddr(*50*,0), ProcAddr(*51*,0) 'alle namen in der gleichen reihenfolge in den bereich für die procnamen schreiben 'direkt vor jeden namen steht die position der adresse im adressbereich Char n#, 0 = "00*27*", "04*48*", "08*49*", "12*50*", "16*51*" EndProc regist 'proc-adressen registrieren '------------------------------------------------------- cls Print "Bitte Testweise die Zifferntasten 0-3 (nicht NumBlock) drücken" Print "ESC = Ende" Print while 1 'dynamische ereignisschleife WaitInput sm$ = Str$(%key) 'sm$ enthält den ereignisstring (hier einfach den keycode) Call(long(a#,val(Char$(n#,MemPos(n#,0,"*" + sm$ + "*")-2,2)))) 'so gehts endwhile end Zu jeder neuen proc muß ich nur in der proc 'regist' in den zwei Zeilen die Parameter anhängen & die Bereiche vergrößern Die Ereignisse kommen aus einer Auswahlbox, die ständig größer wird. Also es werden immer mehr Proc's (aber nicht ewig). Das Beispiel ist sofort Lauffähig - aber keine anderen Tasten Drücken! Was haltet ihr von dieser Technik? Wie gesagt - da die Ereignisse aus eine Auswahllistbox kommen, kann Userseitig später nichts schiefgehen Und Die Ereignisschleife bleibt immer sehr kompakt - sie wird nicht größer
__________________
Gruß Jörg Ideen gibt es viele - man muß sie nur haben... XProfan 11.2, XP-Pro SP2/3 |
|
|
|
|
|
#8 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
@Jörg, ich werde mir jetzt mal deinen letzten Vorschlag reinziehen
__________________
Gruß Jörg Ideen gibt es viele - man muß sie nur haben... XProfan 11.2, XP-Pro SP2/3 |
|
|
|
|
|
#9 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 15.02.2011
Beiträge: 106
|
was Roland davon hält, hat er ja geschrieben. Ich finde die Idee grundsätzlich nicht schlecht, halte mich da aber lieber an Rolands Empfehlung.
__________________
Anhören lohnt sich wuestensand.info |
|
|
|
|
|
#10 (Direktlink) | |
|
Weiß worum´s geht
![]() Registriert seit: 15.02.2011
Beiträge: 106
|
Zitat:
Mein Input ist ja auch nur als Beispiel gedacht. du könntest ein Editfeld erzeugen, das Du dann bei Enter oder Buttonklick ausliest und dann die entsprechende Prozedur aufrufst.
__________________
Anhören lohnt sich wuestensand.info |
|
|
|
|
|
|
|
#11 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Ja, das weiß ich
__________________
Gruß Jörg Ideen gibt es viele - man muß sie nur haben... XProfan 11.2, XP-Pro SP2/3 |
|
|
|
|
|
#12 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
|
Ich würds lieber klassisch machen. Wenn die If-Schleifen dir zu aufwendig erscheinen, könntest du mal Select/Case probieren.
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
#13 (Direktlink) | |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Zitat:
Ich muß so nur eine neue proc schreiben & in der proc 'regist' die neuen Werte anhängen. Im Grunde genommen ist dieser Aufwand auch nicht kleiner als einfach einen neuen ElseIf-Zweig anzuhängen Und ich wollt halt mal 'ne andere Strategie erforschen Select/Case hatte ich in Erwägung gezogen, nur hätte ich in der Schleife eine kaum nennenswerte Zeileneinsparung... und ich glaube, irgendwo im Forum gelesen zu haben, das Case nicht ganz so schnell arbeitet, wie If/ElseIf. Bin mir aber nicht sicher...
__________________
Gruß Jörg Ideen gibt es viele - man muß sie nur haben... XProfan 11.2, XP-Pro SP2/3 |
|
|
|
|
|
|
#14 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
|
Versuch macht ja bekanntlich klug.
Kannst ja hier mal berichten, wenn doch irgendwann Probleme mit der Methode auftauchen sollten.
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
#15 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Jo, mach ich
Diese Methode wird ja auch nur auf dieses Projekt beschränken...
__________________
Gruß Jörg Ideen gibt es viele - man muß sie nur haben... XProfan 11.2, XP-Pro SP2/3 |
|
|
|
|
![]() |
|
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Dateipfad in Stringvariable | Telefisch | C/C++, Visual C++, Visual C++.NET | 0 | 11.04.2008 13:01 |
| ICQ Sessions aufrufen | El:Halcon | Software - Allgemein | 6 | 06.04.2006 23:14 |
| /proc Backup | Matthias S. | Linux | 15 | 25.08.2005 14:15 |
| Windows Exp (generic host proc.) ladet viren/spyw. runter! | Roadricus | Windows XP | 8 | 01.08.2005 18:53 |
| BIOS aufrufen | Michael | Software - Allgemein | 1 | 19.10.2003 18:04 |