Ergänzung zu oben: Erklärende Internetseite dazu gefunden: LINK
ALGORITHMEN TEIL XII: Cogito errare est
-
-
-
Ich erreiche XProfan.com (iF´s community) seit Sa.2017-03-25 20:00 zwar mit PING (=Connectivity vorhanden), aber der Forum-Server scheint down zu sein. Das betrifft auch die xpse-Homepage. Weiss jemand Näheres?
-
Ich erreiche den Server auch nicht...
zu: Abt. Komplexe Funktionen für Komplexe Zahlen
Ich sehe zwar, das die Funktionen mit Parameter aufgerufen werden,
kann aber nirgendwo PARAMETERS entdecken. -
Server ist jetzt wieder online.
-
Gut beobachtet, Michael! Die Parameters hatte ich auch alle drinnen, allerdings hat die Sache dann aus unbekannten Gründen nicht mehr funktioniert (Ich vermute, daß die Nicht-Array-Variablen im zugrundeliegenden Fortran- bzw. Basic-Programm automatisch als ByRef definiert sind, also von den Unterprogrammen auch im Hauptprogramm verändert werden, Profan aber standardmäßig ByVal daraus macht, sh. Anm.1 unten). Mir ging es auch letztlich eher um das Auschecken der Mathematik komplexer Funktionen. Ich würde z.B. nie jedesmal gleich alle Darstellungsformen von Vektoren erzeugen, sondern im Bedarfsfall umrechnen. Interessant, daß Profan nicht anmeckert, wenn mitgegebene Parameter gar nicht abgeholt werden. Zumindest kann man dadurch nachvollziehen, was bei der Bearbeitung eigentlich passiert.
GrussAnm.1: Auch hätte ich dann oft Mehrfach-Returnwerte gebraucht - ein Anliegen, daß ich mir schon lange von RGH wünsche, aber nie zu fragen wagte...
-
Abt. Jubiläum
=========
Lese gerade, daß RGH mal schrieb (Zit.: ) "Ende dieses Jahres <- da war Feb. 2016, Anm.d.Verf.> programmiere ich seit 25 Jahren Profan! (...)". Falls ich also richtig liege, gilt:
Profan ist < 25 > !!!
Feuerwerk! Wasserspiele! GRATULATION! -
Und keiner hat das Jubiläum mitgekriegt. Danke für diese Information
Gruß Volkmar
-
Zitat aus der LIESMICH.TXT:
CodeVersion 1.3 / 1.4 (15.07.1992) ================= Erste als Shareware freigegebene Versionen, komplett mit Compiler, Linker und Entwicklungsumgebung. Version 1.0 (Ende 1991) =========== Allererste einsetzbare Version von PROFAN als reine Batchsprache.
Wenn man denn ein offizielles Datum möchte, bietet sich der 25.07.1992 an, an dem die erste Shareware-Version fertig gestellt und freigegeben wurde. Dann haben wir noch etwas Zeit bis zum Jubiläum.Gruß
Roland -
OK, wir werden den Termin im Auge behalten und dann ordentlich die Korken knallen lassen
Gruß Volkmar
-
Interessant, daß Profan nicht anmeckert, wenn mitgegebene Parameter gar nicht abgeholt werden.
Diese Altlast nutze ich zum Beispiel bei Funktionen mit mehreren gleichen Parametern aus.
Früher wurde ja alles mit den @<Grunddatentyp>()-Funktionen abgeholt.Code: MinMax.inc
Alles anzeigen' eine Prozedur ohne 'Parameters', aber mit Parameterübergabe Proc Min Declare Minimum!, temp!, PC% PC% = %PCount Minimum! = @!(1) WhileLoop 2, PC% temp! = @!(&loop) Minimum! = if( temp! < Minimum!, temp!, Minimum! ) EndWhile Return Minimum! EndProc Proc Max Declare Maximum!, temp!, PC% PC% = %PCount Maximum! = @!(1) WhileLoop 2, PC% temp! = @!(&loop) Maximum! = if( temp! > Maximum!, temp!, Maximum! ) EndWhile Return Maximum! EndProc
-
Toll, Michael! Sozusagen das umgekehrte Phänomen...
-
Abt. Immer wieder lustig
----------------------------
Cls::
print "*";:goto ""Cls:val("")Hier steht ein:Label:
print "*";:goto "Label"Cls:"Label":
print "*";:goto ""Label""Gruss
P.S.: Hat es je jemand geschafft, einen funktionierenden Label: mitten in einer Zeile zu platzieren?
-
Übrigens gibt es noch jede Menge Sonderzeichen für Variablen:
Codecls:declare •$,¤!,§%,¬&,ß#,_!,²$,³$,µ%,´&,`$ •$="ABC":¤!=55.55:§%=66:¬&=123:_!=5678:²$="ch":`$="OK" dim ß#,12:string ß#,0="Hallo Wald!":³$="hu":µ%=8:´&=7 print •$,¤!,§%,¬&,string$(ß#,0),_!,³$+²$,µ%,´&,`$:waitinput
P.S.: cls:val("") Was geht, Alder?:print "weiter":waitinput:end
-
Abt. Albernes
=========CodeWindowStyle 24:Cls UseFont "Arial",20,12,0,0,0 drawtext 40,40,"P.Specht proudly presents:" UseFont "Arial",20,12,0,0,0 drawtext 220,260,"(sinnloserweise)":Lup: Usefont "Arial",100,34,0,rnd(2),0 drawtext 40,120,"FLATTERTEXT" Windowtitle mkstr$(chr$(1),rnd(4))+mkstr$(chr$(13),rnd(3))+"FLATTERTEXT" waitinput 333:goto "Lup"
-
Info: Die richtige Parameter-Einstellung von LemonEd zum sofortigen Starten des gerade in Arbeit befindlichen X4-Programmes mittels "Werkzeug", das die X4alpha-Vorschau startet, ist (D). Das ergänzende .prf bastelt nämlich der neue Interpreter selbst dazu.
GrussP.S.: Mein Namensvorschlag für den neuen Inline-Assembler wäre "RGH-ASM", oder (in Fortsetzung alter Traditionen a la xpia und xpse): "XASM"
-
Info: Die richtige Parameter-Einstellung von LemonEd zum sofortigen Starten des gerade in Arbeit befindlichen X4-Programmes mittels "Werkzeug", das die X4alpha-Vorschau startet, ist (D). Das ergänzende .prf bastelt nämlich der neue Interpreter selbst dazu.
Das ist aber nichts Neues. Das war schon immer so.
Gruß
Roland -
Abt. Links um
=========
... einen guten Auszug der bekannten Windows-32 Application Programming Interface Reference (API) als .CHM-Helpfile (Compiled Help Modules-Datei) jederzeit offline lesen zu können.Abt. Ersatz- und Steuerzeichen
===================
Manchmal gibt es Überraschungen, wie Windows selbst oder andere Programme auf unbekannte Steuerzeichen reagieren. Das kann sich z.B. auf Titelzeilen oder nur bestimmte Controls jeweils anders auswirken. Als Generator für mögliche Zeichen diente das nachstehend Programmschnipsel.
GrussCode
Alles anzeigenWindowtitle "Ersatzfunktionszeichen finden" Windowstyle 24:Cls:font 2:set("numwidth",3) var zl&=2 whileloop 0,255 'case &loop=34:continue cls 0:locate 2,1 clearclip putclip str$(&Loop)+": "+"\"+chr$(&Loop) print getclip$(); windowtitle getclip$()+"TEST" if (%csrlin<>2) or (%Pos<>8) print "\n\nFunktion!" endif waitinput 500 endwhile print "\b\b\b\b\b\b\b**************" waitinput
-
Abt. Komplexe Gamma-Funktion
=====================
Eine der interessanteren mathematischen Spezialfunktionen, Details hier sowie in die Tiefe gehend hier (pdf). Das aus Fortran-77 stammende, nach Quickbasic übersetzte und nun nach XProfan-11 transponierte Programm findet sich nachstehend. Ergebnisse könnte man z.B. über DIESE Seite verifizieren, das Ganze bleibt aber vorläufig eine Demo ohne Gewähr.
GrussP.S.: N ! (N-Faktorielle) = GAMMA( N+1 ); GAMMA(1/2) = Sqrt(Pi()) ... und viele andere Verwandtschaften!
Code
Alles anzeigen'************************************************************** WindowTitle "Calculate Function Gamma & Ln(Gamma) with complex arguments" '(D)2017-04 Demo für Fortran>Basic>XProfan-11 by P.Specht, Vienna/Austria 'Q: http://jean-pierre.moreau.pagesperso-orange.fr/Basic/mcgama_bas.txt WindowStyle 24:Window 0,0-%maxx,%maxy:showmax:set("Decimals",11) '* ---------------------------------------------------------- * '* Purpose: This program computes the gamma function G(z) * '* or Complex Ln[G(z)] for a complex argument using * '* subroutine CGAMA * '* Input : x --- Real part of z * '* y --- Imaginary part of z * '* KF --- Function code: * '* KF=0 for Ln[G(z)] * '* KF=1 for G(z) * '* Output: GR --- Real part of Ln[G(z)] or G(z) * '* GI --- Imaginary part of Ln[G(z)] or G(z) * '* Examples: * '* x y Re[G(z)] Im[G(z)] * '* -------------------------------------------------------- * '* 2.50 5.00 .2267360319E-01 -.1172284404E-01 * '* 5.00 10.00 .1327696517E-01 .3639011746E-02 * '* 2.50 -5.00 .2267360319E-01 .1172284404E-01 * '* 5.00 -10.00 .1327696517E-01 -.3639011746E-02 * '* * '* x y Re[LnG(z)] Im[LnG(z)] * '* -------------------------------------------------------- * '* 2.50 5.00 -.3668103262E+01 .5806009801E+01 * '* 5.00 10.00 -.4285507444E+01 .1911707090E+02 * '* 2.50 -5.00 -.3668103262E+01 -.5806009801E+01 * '* 5.00 -10.00 -.4285507444E+01 -.1911707090E+02 * '* ---------------------------------------------------------- * '* SAMPLE RUNS: * '* Please enter KF, x and y: 1, 2.5,5 * '* x y Re[G(z)] Im[G(z)] * '* -------------------------------------------------------- * '* 2.5 5 2.267360318980015e-02 -1.172284404171513e-02 * '* * '* Please enter KF, x and y: 0, 2.5,5 * '* x y Re[LnG(z)] Im[LnG(z)] * '* -------------------------------------------------------- * '* 2.5 5 -3.66810326235451 5.806009800636287 * '* ---------------------------------------------------------- * '* "Fortran Routines for Computation of Special Functions, * '* jin.ece.uiuc.edu/routines/routines.html". * '* QuickBasic Release By J-P Moreau, Paris. * '* (www.jpmoreau.fr) * '************************************************************** declare x!,y!,KF&,expx!,GR!,GI!, SINH!,COSH! '... und für subroutine GAMMA: declare A![10],G0!,GR1!,GI1!,SR!,SI!,T!,TH!,TH1!,TH2!,x0!,X1!,Y1!,Z1!,Z2!,PI!,J&,K&,NA& CLS MAIN: PRINT "\n Please enter Flag [1=Gamma(),0=Ln(Gamma())], Re(z), Im(z): " locate %csrlin+1,5: INPUT KF& locate %csrlin-1,25:input X! locate %csrlin-1,50:input Y! PRINT IF KF& = 1 PRINT " x y Re[G(z)] Im[G(z)]" ELSE PRINT " x y Re[LnG(z)] Im[LnG(z)]" ENDIF PRINT " ---------------------------------------------------------------------------------" CGAMA '(X!,Y!,KF&,GR!,GI!) '= GOSUB 1000 'call CGAMA(X,Y,KF,GR,GI) PRINT tab(5);format$("%g",x!),tab(25);format$("%g",Y!),tab(40);format$("%g",GR!),tab(65);format$("%g",GI!) PRINT Goto "Main" END 'of Main Program 'Auxiliary functions '500: 'Function SINH(xx) proc sinh :parameters xx! expx! = EXP(xx!) SINH! = 0.5 * (expx! - 1 / expx!) 'RETURN endproc '600: 'Function COSH(xx) proc cosh :parameters xx! expx! = EXP(xx!) COSH! = .5 * (expx! + 1 / expx!) 'RETURN endproc '1000: 'Subroutine CGAMA '(X,Y,KF,GR,GI) PROC CGAMA ' =========================================================== ' Purpose: Compute the gamma function G(z) or Ln[G(z)] ' for a complex argument ' Input : x --- Real part of z ' y --- Imaginary part of z ' KF --- Function code: ' KF=0 for Ln[G(z)] ' KF=1 for G(z) ' Output: GR --- Real part of Ln[G(z)] or G(z) ' GI --- Imaginary part of Ln[G(z)] or G(z) ' =========================================================== ':::DECLARE A![10] 'DIM A(10) ':::DECLARE G0!,GR1!,GI1!,SR!,SI!,T!,TH!,TH1!,TH2!,x0!,X1!,Y1!,Z1!,Z2!,PI! ':::DECLARE J&,K&,NA& '(alle nach Main gehoben für GLOBAL declare) PI! = 4 * ArcTaN(1) 'Initialize table A A![1] = 8.333333333333333*10^-2: A![2] = -2.777777777777778*10^-3 A![3] = 7.936507936507937*10^-4: A![4] = -5.952380952380952*10^-4 A![5] = 8.417508417508418*10^-4: A![6] = -1.917526917526918*10^-3 A![7] = 6.41025641025641*10^-3 : A![8] = -2.955065359477124*10^-2 A![9] = 0.1796443723688307 : A![10]= -1.3924322169059 IF (Y! = 0) AND (X! = INT(X!)) AND (X! <= 0) GR! = 1E30 'arbitrary big number GI! = 0 RETURN ELSEIF X! < 0 X1! = X! Y1! = Y! X! = -X! Y! = -Y! ENDIF X0! = X! IF X! <= 7 NA& = INT(7 - X!) X0! = X! + NA& ENDIF Z1! = SQRt(X0! * X0! + Y! * Y!) TH! = ArcTaN(Y! / X0!) GR! = (X0! - 0.5) * Ln(Z1!) - TH! * Y! - X0! + 0.5 * Ln(2 * PI!) GI! = TH! * (X0! - 0.5) + Y! * Ln(Z1!) - Y! 'FOR K& = 1 TO 10 whileloop 10:k&=&Loop T! = Z1! ^ (1 - 2 * K&) GR! = GR! + A![K&] * T! * COS((2 * K& - 1) * TH!) GI! = GI! - A![K&] * T! * SIN((2 * K& - 1) * TH!) 'NEXT K endwhile IF X! <= 7 'THEN GR1! = 0 GI1! = 0 'FOR J = 0 TO NA - 1 whileloop 0,na&-1:J&=&Loop GR1! = GR1! + 0.5 * Ln((X! + J&) ^ 2 + Y! * Y!) GI1! = GI1! + ArcTaN(Y! / (X! + J&)) 'NEXT J endwhile GR! = GR! - GR1! GI! = GI! - GI1! ENDIF IF X1! < 0 'THEN Z1! = SQRt(X! * X! + Y! * Y!) TH1! = ArcTaN(Y! / X!) xx! = PI! * Y! ::: sinh(xx!) '= GOSUB 500 ::: cosh(xx!) '= GOSUB 600 SR! = -SIN(PI! * X!) * COSH! SI! = -COS(PI! * X!) * SINH! Z2! = SQRt(SR! * SR! + SI! * SI!) TH2! = ArcTaN(SI! / SR!) case SR! < 0: TH2! = PI! + TH2! GR! = Ln(PI! / (Z1! * Z2!)) - GR! GI! = -TH1! - TH2! - GI! X! = X1! Y! = Y1! ENDIF IF KF& = 1 'THEN G0! = EXP(GR!) GR! = G0! * COS(GI!) GI! = G0! * SIN(GI!) ENDIF 'RETURN EndProc 'end of file mcgama.prf
-
Abt. Schleifen und Bedingungen in Assembler
============================
Sehr sattelfest bin ich in Assembler nicht und habe mich deshalb oft auf Makrobefehle wie .IF .ENDIF .WHILE .ENDWHILE .BREAK .CONTINUE .REPEAT .UNTIL verlassen (MASM, JWASM via xpia), oder überhaupt die schnellen, an XProfan-angelehnten Funktionen des xpse benutzt.Seit es gelungen ist, auch FASM in XProfan einzubinden, insbesondere aber seit XProfan X4 mit dem Inline-Assembler (RGH-XASM) angekündigt ist, ist es vorbei mit diesen Schwimmflügeln und Taucherflossen: Jetzt muss man selber ran an die Maschinenlogik!
Dazu habe ich mir ein (sicher noch fehlerbehaftetes) pdf-Merkblatt zu Schleifen und Bedingungen gebastelt, bin aber erst dabei, die aus dem Englischen übersetzten Fakten selbst auszuprobieren. Für Meldungen und Hinweise auf Verbesserungsnotwendigkeiten wäre ich dankbar. Inzwischenn handelt es sich um Work-in-Progress, also ohne selbst groß ausgetestet zu haben.
Gruss -
Ja, so ähnlich habe ich das auch.
Spoiler anzeigen
Code
Alles anzeigen------------------------------------------------------------------------------ aus StackOverflow: http://stackoverflow.com/questions/14267081/difference-between-je-jne-and-jz-jnz Op Code | mnemonic | Description -----------|-----------|----------------------------------------------- 74 cb | JE rel8 | Jump short if equal (ZF=1). 74 cb | JZ rel8 | Jump short if zero (ZF=1). 0F 84 cw | JE rel16 | Jump near if equal (ZF=1). Not supported in 64-bit mode. 0F 84 cw | JZ rel16 | Jump near if 0 (ZF=1). Not supported in 64-bit mode. 0F 84 cd | JE rel32 | Jump near if equal (ZF=1). 0F 84 cd | JZ rel32 | Jump near if 0 (ZF=1). 75 cb | JNE rel8 | Jump short if not equal (ZF=0). 75 cb | JNZ rel8 | Jump short if not zero (ZF=0). 0F 85 cd | JNE rel32 | Jump near if not equal (ZF=0). 0F 85 cd | JNZ rel32 | Jump near if not zero (ZF=0). ------------------------------------------------------------------------------ CMP <reg>, <reg> CMP <reg>, wert JE Label zf=1 JZ Label zf=1 JNE Label zf=0 JNZ Label zf=0 FLAGS - https://en.wikipedia.org/wiki/FLAGS_register ------ CF Carry = Übertrag (z.B. aus Addition) PF Parity = Parität (signalisiert, ob Anzahl der Einsen gerade/ungerade [even/odd]) - https://en.wikipedia.org/wiki/Parity_flag AF Adjust = auch Auxiliary flag, wird bei BCD-Arithmetik verwendet ZF Zero = Wert ist Null oder mit Vergleich identisch SF Sign = Vorzeichen. Gesetzt bei negativen Werten. Hier habe ich in den Tabellen oft S<>0 gefunden, aber da ein Bit ja "nicht so viele" Zustände annehmen kann, stelle ich es als S=1 dar. DF Direction = Richtung bei Stringoperationen. OF Overflow = Überlauf. Soll zeigen, das die Register zu klein für die durchgeführte Operation sind. Abhilfe: Die gleiche Operation mit größeren Registern erneut durchführen. (oder vorher besser debuggen) Das Sprungziel liegt entweder im DB-/DW-/ oder DD-Bereich -128..+127 / -32768..+32767 / oder größer Vergleich hier mit AL 0..255 / -128..127 Befehl (Bedeutung) Flags JC (JMP if c) C=1 Jump if Carry JNO (JMP ifnot o) O=0 Jump on Not Overflow JNS (JMP ifnot s) S=0 Jump on Not Sign JO (JMP if o) O=1 Jump on Overflow JP (JMP if p) P=1 Jump on Parity JS (JMP if s) S=1 Jump on Sign CLC C=0 CLD D=0 Löscht das Direction-Flag. String-Befehle arbeiten dann von kleiner zu großer Adresse. CMC C=Not(c) STC C=1 STD D=1 Setzt das Direction-Flag. Stringbefehle beginnen dann an der hohen Adresse und laufen Richtung kleiner Adresse. POPF Lädt die auf dem Stack befindlichen Flags zurück ins Flag-Register (2 Bytes) PUSHF Lädt den Inhalt des Flag-Registers auf den Stapel (2 Bytes) Konvertierung: CWD (AX -> DX:AX) Stringbefehle: CMPSB Flags = byte [EDI] - [ESI] : ADD EDI,1 : ADD ESI,1 (bei df=1 ist es SUB) bei REP wird ECX als Zähler verwendet CMPSW Flags = word [EDI] - [ESI] : ADD EDI,2 : ADD ESI,2 CMPSD Flags = dword [EDI] - [ESI] : ADD EDI,4 : ADD ESI,4 (src #zu# Dest: < JB,JL; <= JBE,JLE; > JA,JG; >= JAE,JGE; = JE,JE; <> JNE,JNE) LODSB AL = [ESI] : ADD ESI,1 REP unsinnig, da Ziel ja ständig überschrieben wird LODSW AX = [ESI] : ADD ESI,2 LODSD EAX = [ESI] : ADD ESI,4 MOVSB byte [EDI] = [ESI] : ADD ESI,1 : ADD EDI,1 bei REP wird ECX als Zähler verwendet MOVSW word [EDI] = [ESI] : ADD ESI,2 : ADD EDI,2 MOVSD dword [EDI] = [ESI] : ADD ESI,4 : ADD EDI,4 SCASB AL vgl [EDI] : ADD EDI,1 bei REPE/REPNE wird ECX als Zähler verwendet SCASW AX vgl [EDI] : ADD EDI,2 (bis CX=0 oder ZF seinen Zustand ändert) SCASD EAX vgl [EDI] : ADD EDI,4 STOSB [EDI] = AL : ADD EDI,1 bei REP wird ECX als Zähler verwendet (es wird immer der gleiche Wert geschrieben) STOSW [EDI] = AX : ADD EDI,2 STOSD [EDI] = EAX : ADD EDI,4 Befehl (Bedeutung) Flags JMP Unconditional Jump JCXZ (JMP if CX=0) Jump if CX=0 LOOP (DEC CX : JMP if CX<>0) DEC CX : Jump if (CX<>0) LOOPE (DEC CX : JMP if CX<>0, z=1) Z=1 DEC CX : Jump if (CX<>0) and (z=1) LOOPNE (DEC CX : JMP if CX<>0, z=0) Z=0 DEC CX : Jump if (CX<>0) and (z=0) REP (DEC CX : Repeat if CX<>0) Präfix für einen Stringbefehl REPE (DEC CX : Repeat if CX<>0, z=1) Z=1 (REPZ) REPNE (DEC CX : Repeat if CX<>0, z=0) Z=0 (REPNZ) Befehl (Bedeutung) Flags vorzch Äquivalent JA (JMP if >) C=0, Z=0 n JNBE (JMP ifnot <=) Jump on Above JAE (JMP if >=) C=0 n JNB (JMP ifnot <) Jump on Above or Equal JB (JMP if <) C=1 n JNAE (JMP ifnot >=) Jump on Below JBE (JMP if <=) C=1, Z=1 n JNA (JMP ifnot >) Jump on Below or Equal JE (JMP if =) Z=1 JZ (JMP if z) Jump on Equal JG (JMP if >) Z=0, S=0 J JNLE (JMP ifnot <=) Jump on Greater JGE (JMP if >=) S=0 J JNL (JMP ifnot <) Jump on Greater or Equal JL (JMP if <) S=1 J JNGE (JMP ifnot >=) Jump on Less JLE (JMP if <=) Z=1, S=1 J JNG (JMP ifnot >) Jump on Less or Equal JNE (JMP if <>) Z=0 JNZ (JMP ifnot z) Jump on Not Equal
-
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!