Paules-PC-Forum.de Anzeige:

Microsoft Windows Intune: PC-Verwaltung und -Sicherheit in der Cloud: Updateverwaltung, Anti-Virus und vieles mehr!


Zurück   Paules-PC-Forum.de > Programmierung > XProfan

XProfan Alles rund um die Programmiersprache XProfan.

EM-Tippspiel

Paule bei Facebook


Paule bei Twitter


Letzte Forenthemen
Gehe zum ersten neuen Beitrag Algorithmen Teil IV...
Aufrufe: 3361, Antworten: 129
Gehe zum ersten neuen Beitrag Hamachi deinstallieren
Aufrufe: 58, Antworten: 5
Gehe zum ersten neuen Beitrag Bundesliga-Tippspiel Saision...
Aufrufe: 7670, Antworten: 187
Gehe zum ersten neuen Beitrag PPF - Spiel "Wörter weiter...
Aufrufe: 26970, Antworten: 4223
Gehe zum ersten neuen Beitrag PPF - Shoppingwahn
Aufrufe: 50963, Antworten: 1397
Gehe zum ersten neuen Beitrag Pc lahmt plötzlich
Aufrufe: 186, Antworten: 6
Gehe zum ersten neuen Beitrag PC fährt nicht mehr hoch.
Aufrufe: 0, Antworten: 0
Gehe zum ersten neuen Beitrag Von Live CD Windowspfad...
Aufrufe: 329, Antworten: 19
Gehe zum ersten neuen Beitrag Captur 2.2 (Snow Leo)
Aufrufe: 28, Antworten: 0
Gehe zum ersten neuen Beitrag Captur 2.3 (Lion)
Aufrufe: 34, Antworten: 0
Zeige:





Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 07.11.2011, 11:16   #1 (Direktlink)
Weiß worum´s geht
 
Benutzerbild von JörgG
 
Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
Standard Proc-Name in StringVariable & aufrufen

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
Die proc's behandeln dabei unterschiedlichste Aufgaben (Es gibt da also keine Ähnlichkeiten, die man evtl. zusammenfassen könnte)
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
Nun kann ich aber ja nicht einfach so zusammenhanglos eine Variable hinschreiben.. Ich bräuchte also etwas, damit der Interpreter weiß, das er eine proc anspringen soll, die so heißt wie der Inhalt der Stringvariablen.
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$
Wär doch geil
__________________
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)
JörgG ist offline   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Alt 07.11.2011, 13:04   #2 (Direktlink)
Weiß worum´s geht
 
Benutzerbild von _Joerg_
 
Registriert seit: 15.02.2011
Beiträge: 106
Standard

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
Aber unbedingt beachten:
Zitat:
Zitat von Profan Hilfe
Es ist jedoch zwingend darauf zu achten, dass während des Aufrufs einer Prozedur von außerhalb über @ProcAddr das XProfan-Programm nicht weiterläuft, da XProfan derzeit nicht in der Lage ist, zwei Codeteile in einem Prozess parallel auftzurufen.
__________________
Anhören lohnt sich wuestensand.info

Geändert von _Joerg_ (07.11.2011 um 13:10 Uhr)
_Joerg_ ist offline   Mit Zitat antworten
Alt 07.11.2011, 15:04   #3 (Direktlink)
Weiß worum´s geht
 
Benutzerbild von JörgG
 
Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
Standard

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
JörgG ist offline   Mit Zitat antworten
Alt 07.11.2011, 16:45   #4 (Direktlink)
Dauergast
 
Benutzerbild von p. specht
 
Registriert seit: 06.02.2009
Ort: Wien, Österreich
Beiträge: 1.083
Standard

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
... aber wenn man halt unbedingt Proc verwenden will... ähm...
__________________
Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,XPSE,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB2:USB3
p. specht ist gerade online   Mit Zitat antworten
Alt 07.11.2011, 17:07   #5 (Direktlink)
Weiß worum´s geht
 
Benutzerbild von _Joerg_
 
Registriert seit: 15.02.2011
Beiträge: 106
Standard

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
Wenn's wirklich viele Prozeduren sind, würde ich mir ein kleines Programm schreiben, daß den benötigten Code zur Befüllung des Arrays schreibt.
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)
_Joerg_ ist offline   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Alt 07.11.2011, 17:30   #6 (Direktlink)
RGH
Forenmaskottchen
 
Benutzerbild von RGH
 
Registriert seit: 08.02.2009
Ort: Nußloch (bei Heidelberg)
Beiträge: 550
Standard

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
RGH ist offline   Mit Zitat antworten
Alt 07.11.2011, 20:45   #7 (Direktlink)
Weiß worum´s geht
 
Benutzerbild von JörgG
 
Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
Standard

Hi Jörg, da haben wir wohl beide parallel getüftelt . Ich habe noch mal deinen Anzatz mit ProcAddr & call überdacht. Das ist rausgekommen:
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
Die Ereignisschleife bleibt sehr kompakt
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
JörgG ist offline   Mit Zitat antworten
Alt 07.11.2011, 20:56   #8 (Direktlink)
Weiß worum´s geht
 
Benutzerbild von JörgG
 
Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
Standard

@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
JörgG ist offline   Mit Zitat antworten
Alt 07.11.2011, 20:58   #9 (Direktlink)
Weiß worum´s geht
 
Benutzerbild von _Joerg_
 
Registriert seit: 15.02.2011
Beiträge: 106
Standard

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
_Joerg_ ist offline   Mit Zitat antworten
Alt 07.11.2011, 21:13   #10 (Direktlink)
Weiß worum´s geht
 
Benutzerbild von _Joerg_
 
Registriert seit: 15.02.2011
Beiträge: 106
Standard

Zitat:
sm$ = Str$(%key)
So geht's nur seeehr begrenzt. Nach jedem Ereignis, das WaitInput durchbricht,, wird ja sofort per Call was aufgerufen. Wer weiß, was Du da mal erwischst. Das ist, wie mit 'ner Schrotflinte im dunklen Kino rumschießen...
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
_Joerg_ ist offline   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Alt 07.11.2011, 21:32   #11 (Direktlink)
Weiß worum´s geht
 
Benutzerbild von JörgG
 
Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
Standard

Ja, das weiß ich, dies sollte doch nur als Demo die Funktionsweise zeigen. Später kommen die Ereignisse nicht von der Tastatur sondern aus einer Auswahlbox, aus der der User was auswählt.
__________________
Gruß Jörg

Ideen gibt es viele - man muß sie nur haben...
XProfan 11.2, XP-Pro SP2/3
JörgG ist offline   Mit Zitat antworten
Alt 11.11.2011, 19:41   #12 (Direktlink)
Super-Moderator
 
Benutzerbild von Frabbing
 
Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
Standard

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.
Frabbing ist gerade online   Mit Zitat antworten
Alt 13.11.2011, 02:16   #13 (Direktlink)
Weiß worum´s geht
 
Benutzerbild von JörgG
 
Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
Standard

Zitat:
...Wenn die If-Schleifen dir zu aufwendig erscheinen, könntest du mal probieren.
Najaa, mir geht es nicht NUR um den Aufwand von If/Else. Die EreignisSchleife ist dadurch sehr übersichtlich - und bleibt es auch - egal, wie viel verschiedene Ereignisse & Procs hinzukommen (sie ist praktisch wartungsfrei).
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 . Aber vllt. löppt das so ein Tick schneller, weil ja nicht mehr zig-mal abgefragt werden muß, sondern sofort die passende proc angesprungen wird.
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
JörgG ist offline   Mit Zitat antworten
Alt 13.11.2011, 12:28   #14 (Direktlink)
Super-Moderator
 
Benutzerbild von Frabbing
 
Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
Standard

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.
Frabbing ist gerade online   Mit Zitat antworten
Alt 13.11.2011, 13:30   #15 (Direktlink)
Weiß worum´s geht
 
Benutzerbild von JörgG
 
Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
Standard

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
JörgG ist offline   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Antwort

  Paules-PC-Forum.de > Programmierung > XProfan

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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 an


Ä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



Alle Zeitangaben in WEZ +2. Es ist jetzt 12:51 Uhr.


Powered by vBulletin® Version 3.8.7 (Deutsch)
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Powered by vBCMS® 2.7.0 ©2002 - 2012 vbdesigns.de
(c) Paules-PC-Forum.de

::: Impressum :::

Search Engine Optimization by vBSEO 3.3.2