| |
|
|
| XPSE kann im 1. Proc global angelegte Variablen erkennen. Ruft die Proc aber eine andere Proc auf, folgt die Warnung "Varibale undeklariert". Ein anderes Produkt mit X vorne motzt hier nicht. Mach ich was falsch? |
|
|
| |
|
|
|
| Ach so ja: Hier das Ding das mit XPSE nicht will. Ich würde es ja später aber gern mit nProcs beschleunigen, aber wenn's so schon nicht klappt? KompilierenMarkierenSeparierenWindowTitle "Lexikographisch aufsteigende Permutationen eingegebener Wortstrings"
Font 2:randomize:cls rnd(8^8)
print " Trenner = Leerzeichen oder |, Durch negative Zahlen"
print " (zB. -9) werden Indexfolgen 0|1|2|3|4|5|6|7|8 permutiert."
print
' Interpreter: 9 Elemente 362880 mal permutiert in 148.81 Sek (ohne Ausgeben)
' XPIA: - '' - in 28.55 Sek
' ProfComp in 27.33 Sek
' $MAKE CLE
{$cleq}
Declare t$,z&,tt$[],n&,tm&,ts$
var ausgeben%=0
Restart:
print " Zu permutieren (Leer oder | als Trenner):\n\n ";
input t$
t$=trim$(t$)
t$=translate$(t$," "," ")
case instr("|",t$):q$="|"
t$=translate$(t$," ","|")
if val(t$)<0
setSize tt$[],-1*val(t$)
tt$[]=str$(&Index)
else
tt$[]=explode(t$,"|")
Endif
n&=SizeOf(tt$[])
if n&<2
z&=0
Goto "Skip"
endif
cls rnd(8^8)
print " Permutation läuft..."
tm&=&gettickcount
z&=PERM()' PERM ruft DOSOMETHINGWITHRESULTS auf!
' und verwendet dann NEXTPERM
tm&=&gettickcount-tm&
cls
print
ts$=" In "+str$(tm&)+" ms"
Skip:
ts$=ts$+" "+str$(z&)+" Permutationen erzeugt."
ClearClip
PutClip ts$
Print ts$
Print " Benchwerte in Zwischenablage verfügbar."
beep
WaitInput
CLS rnd(8^8)
Goto "Restart"
End
Proc DOSOMETHINGWITHRESULTS
' Hier: Ausgeben
casenot ausgeben%:return
case %csrlin>21: locate 1,1
WhileLoop n&
print tt$[&Loop-1];
case &Loop=n&:continue
print q$;
EndWhile
print
EndProc
PROC PERM
Declare k&,j&,u&,v&,e%,z&,q$
e%=1
z&=0
q$="|"
While e%
inc z&
DOSOMETHINGWITHRESULTS
NEXTPERM
EndWhile
return z&
ENDPROC
proc NEXTPERM
'erzeugt die jeweils nächste lexikalische Permutation
k&=n&-2
While tt$[k&]>=tt$[k&+1]
Dec k&
case k&<0:break
EndWhile
if k&<0
e%=0
else
j&=n&-1
While tt$[j&]<=tt$[k&]
dec j&
EndWhile
t$=tt$[k&]
tt$[k&]=tt$[j&]
tt$[j&]=t$
u&=k&+1
v&=n&-1
While u&<v&
t$=tt$[u&]
tt$[u&]=tt$[v&]
tt$[v&]=t$
inc u&
dec v&
EndWhile
endif
endProc
|
|
|
| |
|
|
|
| XPSE kann etwas das XProfan selbst nicht macht: Lexikalische Variablen Sichtbarkeit ( [...] )
So ist danach folgendes potentiell falsch: KompilierenMarkierenSeparieren jedoch richtig: KompilierenMarkierenSeparieren Sowieso, nProcs sind da sogar noch ein Stückchen strenger da dort überhaupt keine Variablensichtbarkeitsvererbung existiert auch damit nProcs immer Thread-Sicher sind. So gibts in nProcs absichtlich nur die darin deklarierten und als Parameter und per Global deklarierten Variablen aber keine aus anderen nProcs oder Procs.
PS: Codes bitte in Code-Tags setzen. |
|
|
| |
|
|
|
Nico Madysa | Ich war so frei, es der Leserlichkeit zu liebe zu bearbeiten. |
|
|
| |
|
|