ALGORITHMEN - Teil XX: Zwischen Fersuch und Irrdumm
-
-
-
Lösung zu EaR 3
=============Code
Alles anzeigenWindowTitle "Newton-Raphson für EaR 3" 'Iterationsformel: x_neu = x - F(x)/F´(x) mit F(x_Lösung)=0 'mit F(x) = (x!^x!)^x!/x!^3 - 3*x!-720 'und F´(x) = ((x^x)^x*(x*(log(x)+1)+x*log(x)))/x^3-(3*(x^x)^x)/x^4-3 CLS set("decimals",17) declare xstart!,maxerr!,n& maxerr!=val("1e-14") Print "\n Lösung 1: ", 'Sinnvolle Startwerte: '[1/1e38 - 0.175]=Lösung 1 ; Newton(val("1e-38"),maxerr!,0) Print "\n Lösung 2: ", '[2.38 - 13]=Lösung 2 (ganzzahlig) Newton(val("13"),maxerr!,0) beep:waitinput 10000 END Proc Newton parameters x!,maxerr!,testflg& declare xn!,err! Repeat inc n& case testflg&:print " ";n&;". Lauf: ";xn!, xn! = x! - ((x!^x!)^x!/x!^3-3*x!-720) / \ (((x!^x!)^x!*(x!*(ln(x!)+1)+x!*ln(x!)))/x!^3-(3*(x!^x!)^x!)/x!^4-3) err!=abs((xn!-x!)/x!) case testflg&:print "Rel.Fehler: ";format$("%g",err!) x! = xn! Until abs(err!) < maxerr! print "\n Ergebnis: ";format$("%g",round(x!,11)) print " Probe: ";format$("%g",((x!^x!)^x!/x!^3-3*x!)) :if testflg&:waitinput 3000:endif EndProc
-
PROSIT 11111100011 !
-
Abt. Windows API-Variablentyp ´Variant Union´
==============================
Die Windows-API verlangt manchmal, im gemeinsamen (union) Aufrufparameter-Übergabebereich unterschiedliche (variante) Datentypen unterbringen zu können. Den Datentyp ´Variant Union´ in XProfan-11 nachzubilden klappt lt. Hilfe-Beispiel folgendermaßen:Code
Alles anzeigen'-Struktur fuer Variant#.Union# festlegen: Declare BRecord#, BRecord& Struct BRECORD = pvRecord&, IRecordInfo& Dim BRecord#, BRECORD 'Speicher der Länge BRECORD irgendwo reservieren BRecord& = BRecord# 'merken wo dieser begann, für späteres Dispose, 'weil er nämlich im Beispiel umgeleitet wird, um die Detailstruktur auch 'in anderen Speicherbereichen als Ansprechadresse nutzen zu können. '-Beispielstruktur mit Variablentyp Union ="Gemeinsam genutzter Speicherbereich" ' Typische Win32-API-Aufrufstruktur, wird nun festgelegt: Struct VARIANT = vt%, \ wReserved1%, \ wReserved3%, \ Union#(8) 'Ortsplatzhalter, nicht selbst ein Bereich! 'Diese Struktur nun im Speicher tatsächlich reservieren: Declare Variant#:Dim Variant#, VARIANT Declare Union# : Union# = Variant# + 8 'Union# darf nicht dimensioniert werden. Dann ist es nur eine gewöhnliche Variable, 'die auf die Speicheradresse + 8 des reservierten Speicherbereichs Variant# verweist. 'Das soll den in XPr11 nicht erlaubten Ausdruck ´Variant#.Union#´ ersetzen. Cls set("decimals",17) Byte Union#, 0 = 255 :Print @Str$(@Byte(Union#, 0)) Word Union#, 0 = 65535 :Print @Str$(@Word(Union#, 0)) '-Long zuweisen -2147483648...2147483647 Long Union#, 0 = 1234567890:Print @Str$(@Long(Union#, 0)) '-Single API-Float zuweisen Long Union#, 0 = @Single(pi()/10^38) Print format$("0.0000000E-00",@Double(@Long(Union#, 0))) '-XProfan Double Float zuweisen (Normalerweise nicht für API!) float Union#, 0 = pi():Print float(Union#, 0) '-API-Struktur mit Daten versorgen an der Position Union# BRecord# = Union# With BRecord# .pvRecord& = 65535 .IRecordInfo& = 1111111111 EndWith Print @Str$(BRecord#.pvRecord&) Print @Str$(BRecord#.IRecordInfo&) 'Nur mit DIM reservierter Speicher ist wieder freizugeben BRecord# = BRecord&:Dispose BRecord# Dispose Variant# Waitinput END
-
Abt. Dynamisch erweiterbares strukturiertes Bereichsarray
=========================================
Aus der XProfan-11-Hilfe, teilweise auf objektorientierte Zugriffsart umgestellt und mit noch verwirrenderen Erläuterungen versehen.
GrussCode
Alles anzeigenWindowTitle "Dynamische Arrays mit Strukturen" ' Die Abbildung dynamischer Arrays mit Strukturvariablen sind mit XProfan kein Problem. ' Die Größe des Arrays ist nur von der Größe des verfügbaren Arbeitsspeichers abhängig. ' Auch nachträgliche Änderungen der Struktur stellen kein Problem dar. ' In Strukturvariablen werden verschiedene Elemente zu einem Record zusammengefasst. ' Dazu wird eine Klasse Mem definiert (Nur ReDim und Fill sind dabei neu). ' Die Klasse wird an sich mittels Include eingebunden, hier als Snippet am Ende. GOTO "Memory.Inc" '$I Memory.Inc '(hier in der Demo am Ende angehängt!) Weiter: '(1) Strukturen definieren Struct Strct = Name$(25), Vorname$(10), Alter%, Groesse&, Sonstiges#(50) ' Allfällige andere Struct als Vorlagen für die Aktive Strukturmaske würden hier folgen... ' Der Record wäre dann variant, die richtige Maske wäre zB durch ein Maskengemeinsames ' Flag zu steuern... '(2) Positionen der Variablen in der Struktur ermitteln (für alte Zugriffsart, ' ab XPr.11 nur mehr für Bereichsangaben# in Strukturen nötig!) Declare PosName&, PosVorname&, PosAlter&, PosGehalt&, PosGroesse&, PosSonstiges& PosName& = 0 PosVorname& = 26 '0 + 26 (!) PosAlter& = 37 '0 + 26 (!) + 11 (!) PosGroesse& = 39 '0 + 26 (!) + 11 (!) + 2 PosSonstiges& = 43 '0 + 26 (!) + 11 (!) + 2 + 4 '<<< Ist nach wie vor erforderlich! ' Gesamtgroesse der Struktur: 93 Bytes (sollten alle Strukturmasken eigentlich aufweisen!) ' Hinweis: Bei einem String wird immer ein Null-Byte als Ende- ' kennzeichen angehaengt - darum String-Groesse plus eins! '(3) Array der Struktur festlegen (Kopiervorlage, um die Länge der Struktur festzuhalten) Declare Strct# : Dim Strct#, Strct '-Eigentliche Struktur, die aktiv gesetzt wird (WorkStructure = Aktive Strukturmaske) Declare WrkStrct#, BufferWrkStrct& : Dim WrkStrct#, Strct 'Hier auf 1. Struktur gesetzt '(4) Verwaltungsdaten: Größe der Struktur, Startadresse, Größe des Arrays. Declare ArrayOfStrct&, CountOfArray& CountOfArray& = 20 ' vorläufige Anzahl der Saetze der Struktur der länge Sizeof(Strct#) ArrayOfStrct& = Mem.Dim( @SizeOf(Strct#) * CountOfArray& ) 'bestimmt die erforderl. mem-Größe ' HAUPTTEIL: Window 200,0 - 480,728: Cls Print "Größe der Struktur: ";@SizeOf(Strct#) 'eigentl.: Aktive Struktur, aber alle gleich! Print "Adresse des Arrays der Struktur: ";ArrayOfStrct& 'Rückgabewert nach mem-Anforderung Print "Größe des Arrays der Struktur: ";Mem.SizeOf(ArrayOfStrct&) 'dztg. Gesamtgröße Print "*** Taste für weiter ***\n":waitinput '(5) Array mit Testdaten befüllen BufferWrkStrct& = WrkStrct# 'Originaladresse merken, später für Dispose wichtig! WhileLoop 0, 19, 1 WrkStrct# = ArrayOfStrct& + @SizeOf(Strct#) * &Loop 'Strukturmaske String WrkStrct#, PosName& = "Muster"+str$(int(1+&Loop)) ' String WrkStrct#, PosVorname& = "Gabriele" 'Alte Ansprechart WrkStrct#.Vorname$="Gabriela" 'Neue Ansprechart, nicht für Strukturbereiche# Word WrkStrct#, PosAlter& = &Loop + 60 ' Long WrkStrct#, PosGroesse& = 190 - &Loop WrkStrct#.Groesse& = 966092 - &Loop Byte WrkStrct#, PosSonstiges& + 0 = 65 + &Loop Byte WrkStrct#, PosSonstiges& + 1 = 66 + &Loop Byte WrkStrct#, PosSonstiges& + 2 = 67 + &Loop EndWhile '(6) Satz 13 bis 15 auslesen und anzeigen, 'Hinweis: Jeweils minus eins, da die Zaehlung des Arrays bei 0 beginnt. WhileLoop 13 - 1, 15 - 1, 1 WrkStrct# = ArrayOfStrct& + @SizeOf(Strct#) * &Loop Print "Datensatz ", @Str$(@Int(&Loop + 1)) Print "Name: ",WrkStrct#.Name$ '@String$(WrkStrct#, PosName&) Print "Vorname: ",WrkStrct#.Vorname$ '@String$(WrkStrct#, PosVorname&) Print "Alter: ",WrkStrct#.Alter% '@Word(WrkStrct#, PosAlter&) Print "Größe: ",WrkStrct#.Groesse& '@Long(WrkStrct#, PosGroesse&) Print "Sonstiges:", @Chr$(@Byte(WrkStrct#, PosSonstiges&)); \ @Chr$(@Byte(WrkStrct#, PosSonstiges& + 1)); \ @Chr$(@Byte(WrkStrct#, PosSonstiges& + 2)) Print "" EndWhile Print "*** Taste für weiter ***\n":waitinput '(7) ArrayOfStructure in seiner Größe verändern CountOfArray& = 40 ' Anzahl der Saetze der Struktur erhoehen- ArrayOfStrct& = Mem.ReDim(ArrayOfStrct&, @SizeOf(Strct#) * CountOfArray&) Print "\n Adresse des Arrays der Struktur: ";ArrayOfStrct& Print " Größe des Arrays der Struktur: ";Mem.SizeOf(ArrayOfStrct&) Print '(8) Erweiterte Struktur mit Daten füllen WhileLoop 20, 39, 1 WrkStrct# = ArrayOfStrct& + @SizeOf(Strct#) * &Loop String WrkStrct#, PosName& = "Schnell"+str$(int(1+&Loop)) String WrkStrct#, PosVorname& = "Stefan" Word WrkStrct#, PosAlter& = &Loop + 60 Long WrkStrct#, PosGroesse& = 190 - &Loop Byte WrkStrct#, PosSonstiges& = 65 + &Loop Byte WrkStrct#, PosSonstiges& + 1 = 66 + &Loop Byte WrkStrct#, PosSonstiges& + 2 = 67 + &Loop EndWhile '(9) ArrayOfStructure vom 13. bis 15. Satz auslesen--------------- WhileLoop 13 - 1, 15 - 1, 1 WrkStrct# = ArrayOfStrct& + @SizeOf(Strct#) * &Loop Print "Datensatz ", @Str$(@Int(&Loop + 1)) Print "Name: ", @String$(WrkStrct#, PosName&) Print "Vorname: ", @String$(WrkStrct#, PosVorname&) Print "Alter: ", @Word(WrkStrct#, PosAlter&) Print "Größe: ", @Long(WrkStrct#, PosGroesse&) Print "Sonstiges:", @Chr$(@Byte(WrkStrct#, PosSonstiges&)); \ @Chr$(@Byte(WrkStrct#, PosSonstiges& + 1)); \ @Chr$(@Byte(WrkStrct#, PosSonstiges& + 2)) Print EndWhile 'Print "*** Taste für weiter ***\n":waitinput '(10) Erweitertes ArrayOfStructure vom 33. bis 35. Satz auslesen WhileLoop 33 - 1, 35 - 1, 1 'Aktive Strukturmaske über aktuellen Datensatz legen: WrkStrct# = ArrayOfStrct& + @SizeOf(Strct#) * &Loop Print "Datensatz ", @Str$(@Int(&Loop + 1)) Print "Name: ", @String$(WrkStrct#, PosName&) Print "Vorname: ", @String$(WrkStrct#, PosVorname&) Print "Alter: ", @Word(WrkStrct#, PosAlter&) Print "Größe: ", @Long(WrkStrct#, PosGroesse&) Print "Sonstiges:", @Chr$(@Byte(WrkStrct#, PosSonstiges&)); \ @Chr$(@Byte(WrkStrct#, PosSonstiges& + 1)); \ @Chr$(@Byte(WrkStrct#, PosSonstiges& + 2)) Print EndWhile Print "*** Tastendruck räumt auf und beendet ***\n":waitinput ' (11) Speicherbereiche freigeben Mem.Dispose(ArrayOfStrct&) Dispose Strct# WrkStrct# = BufferWrkStrct& Dispose WrkStrct# Print "*** Erfolgreich aufgeräumt - BYE! ***":waitinput 2000 END '---------------------------------------------------------- Memory.Inc: $H Windows.ph Def @ZeroMemory(2) !"KERNEL32.DLL", "RtlZeroMemory" Def @FillMemory(3) !"KERNEL32.DLL", "RtlFillMemory" '-MemoryClass Class Mem = +Clear@,+Dim@,+Dispose@,+Fill@,+ReDim@,+SizeOf@ '-Belegten Speicher leeren Proc Mem.Clear Parameters ptrMem& @ZeroMemory(ptrMem&, Mem.SizeOf(ptrMem&)) EndProc ' Speicher belegen Proc Mem.Dim Parameters Size& Declare hMem& hMem& = ~GlobalAlloc(~GMEM_MOVEABLE | ~GMEM_ZEROINIT, Size&) Return ~GlobalLock(hMem&) EndProc ' Speicher freigeben Proc Mem.Dispose Parameters ptrMem& Declare hMem& hMem& = ~GlobalHandle(ptrMem&) ~GlobalUnlock(hMem&) Return ~GlobalFree(hMem&) EndProc ' Belegten Speicher fuellen Proc Mem.Fill Parameters ptrMem&, StringExp$ @FillMemory(ptrMem&, Mem.SizeOf(ptrMem&), @Ord(StringExp$)) EndProc ' Speicher redimensionieren Proc Mem.ReDim Parameters ptrMem&, Size& Declare hMem& hMem& = ~GlobalHandle(ptrMem&) ~GlobalUnlock(hMem&) ~GlobalReAlloc(hMem&, Size&, ~GMEM_MOVEABLE) Return ~GlobalLock(hMem&) EndProc ' Größe des belegten Speichers ermitteln Proc Mem.SizeOf Parameters ptrMem& Declare hMem& hMem& = ~GlobalHandle(ptrMem&) Return ~GlobalSize(hMem&) EndProc '---------------------------------------------------------- GOTO "weiter"
-
Abt. Stange-ums-Eck Problem - Beitrag 2
===========================
Es gibt einen Winkel, wo die im vorigen Beitrag zum Thema berechnete "Stange kritischer Länge" die Aussenwände des Ganges UND den inneren Kantenpunkt gerade sanft berührt. Dies erfolgt unter einem "kritischen Winkel" gegenüber der Aussenwand, der wiederum abhängt vom Winkel der Aussenwand-Ecke zur hinderlichen Kante, die die Innenwände bilden. Diese Abhängigkeit graphisch darzustellen führt zu eiiner charakteristischen Kurve, die m.E. keiner der üblichen, allgemein bekannten Funktionen folgt.
GrussCode
Alles anzeigenWindowtitle "Kantenwinkel zu Kritischer Winkel bei Stange-ums-Eck Problem" Window %maxx*4/10,%maxy*9/10 var xh&=width(%hwnd)/10:var yh&=height(%hwnd)*4/5:var f!=5 Rectangle xh&,yh& - xh&+f!*90,yh&-f!*90 font 2:declare x!,y!,L!,a!,w! whileloop 1,8999:w!=&Loop/100 x!=100' print "\n x = ";:input x!:case x!<=0:x!=val("1e-199") y!=x!*tan(w!*pi()/180) 'print " y = ";:input y!:case y!<=0:y!=val("1e-199") L!=(x!^(2/3)+y!^(2/3))^(3/2) ' print "\n Krit. Länge = ";L! a!= -1*sqrt(L!^(2/3)-x!^(2/3))/x!^(1/3) locate 1,1 print " Kantwinkel = ";w!+0*arctan(y!/x!)*180/pi();" Grad" ' print " Anstieg a = ";a! print " Krit. Winkel w = ";-arctan(a!)*180/Pi();" Grad\n" Line xh&+f!*w!,(yh&+f!*arctan(a!)*180/Pi()) - xh&-1+f!*w!,yh&+f!*arctan(a!)*180/Pi() 'waitinput endwhile beep waitkey
-
Abt. Ein allllerletztes Rätsel - EAR 4: Notepad
============================
Der Windows-eigene On-Board-Editor Notepad kann zur Logdate-Erstellung benutzt werden. Er setzt dann vor jede neue Zeile Datum und Zeit automatisch ein. Was ist zu tun, damit das klappt? -
Datei auf Desktop anlegen mit Inhalt :
.LOGAuch mit F5 bekommt man date/time.
Geht auch mit normalem Editor Editor.exe.
-
Dieser Punkt geht klar an @H.Brill !
Und damit könnte man das Log dann führen:
(Programm von Thomas A. aus 2007, von mir verschlimmbessert)Code
Alles anzeigen'Run-Befehl per API und Strings mit SendString an NotePad CLS '<<< CLS Kann bei erwiesenem Funktionieren weggelassen werden. DECLARE __cf1&,__cf2&,__cf3&,__cf4& STRUCT STARTUPINFO=CB&,LPRESERVED#(4),LPDESKTOP#(4),LPTITLE#(4),\ DWX&,DWY&,DWXSIZE&,DWYSIZE&,DWXCOUNTCHARS&,DWYCOUNTCHARS&,\ DWFILLATTRIBUTE&,DWFLAGS&,WSHOWWINDOW%,\ CBRESERVED2%,LPRESERVED2&,HSTDINPUT&,HSTDOUTPUT&,HSTDERROR& STRUCT PROCESS_INFORMATION=HPROCESS&,HTHREAD&,DWPROCESSID&,DWTHREADID& Def __cf1(2) !"KERNEL32","GetProcAddress" Def __cf2(1) !"KERNEL32","GetModuleHandleA" __cf1&=__cf1(__cf2("kernel32.dll"),"GetTickCount") __cf2&=__cf1(__cf2("kernel32.dll"),"CreateProcessA") __cf3&=__cf1(__cf2("user32.dll"),"GetWindowThreadProcessId") __cf4&=__cf1(__cf2("user32.dll"),"GetWindow") proc RUNEX PARAMETERS CMDLINE$ DECLARE SI#, PI#, PID&, WIN& DIM SI#, STARTUPINFO DIM PI#, PROCESS_INFORMATION VAR TIMEOUT&=call(__cf1&)+5000 VAR WINHANDLE&=-1 IF call(__cf2&,0,ADDR(CMDLINE$),0,0,0,0,0,0,SI#,PI#) REPEAT WIN&=FINDWINDOW("Unbenannt - Editor") '<< Leeres Notepad in Win7, ev. anpassen! WHILE ((WIN&) AND (WINHANDLE&=-1)) call(__cf3&,WIN&,ADDR(PID&)) IF PID&=PI#.DWPROCESSID& WINHANDLE&=WIN& ENDIF IF call(__cf1&) > TIMEOUT& WINHANDLE&=0 ENDIF WIN&=call(__cf4&,WIN&, 2) ENDWHILE UNTIL WINHANDLE&>-1 ENDIF DISPOSE SI# DISPOSE PI# RETURN WINHANDLE& endproc VAR NOTEPAD&=RUNEX("NOTEPAD.EXE") IF NOTEPAD& SENDSTRING(NOTEPAD&, ".LOG") SENDSTRING(NOTEPAD&, "\r XProfan ist einfach Spitze!") SENDSTRING(NOTEPAD&, "\r Aber das Wissen ja ohnehin alle!") SENDSTRING(NOTEPAD&, "\n Gruß, Thomas Arldt 2007, P.Specht 2019)") ENDIF END
-
Hallo,
Dieser Punkt geht klar an @H.Brill !
Ich glaube der Punkt geht an Win 3.1, solange wird der Tipp als geheim gehandelt.
Tschau
-
Abt. Ein alllllerletztes Rätsel - EaR 5
=======================
Was passiert, wenn man in der "Über openoffice.com"-Box der allgemeinen Openoffice-Hilfe die Tastenkombination STRG+SDT eingibt? -
Abt. Ein allllllerletztes Rätsel - EaR 5
=======================
Woran erkennt der Editor (bzw. Notepad) einen Unicode-Text? -
Abt. Ein allllllerletztes Rätsel - EaR 5
=======================
Woran erkennt der Editor (bzw. Notepad) einen Unicode-Text?Das frage ich mich auch. Könnte mir bei der Erkennung von UTF8 und ANSI in meiner WinINet.inc helfen.
-
Am BOM, würde ich sagen.
Gruß Volkmar
-
Am BOM, würde ich sagen.
Wenn einer vorhanden ist , weil der wird auch oft weggelassen, weil:
- es ist klar in welcher Codierung die Datei vorliegt/vorliegen müsste.
- der BOM führt zu falschen Ergebnissen in der Ausgabe(PHP, Java usw.).
- ist nicht Vorgeschrieben.
- Autor ist nicht in der Lage oder hat noch nichts vom BOM gehört
-
Bei Notepad ist nicht klar, welche Codierung der Text hat, *.txt kann auch 8bittig auf der Platte rumliegen
Kann man aber mal schnell nachsehen, wie der Text aussieht, wenn man die txt-Datei mal durch einen Hex-Editor schickt.Gruß Volkmar
-
*.txt kann auch 8bittig auf der Platte rumliegen
7bittig wird er ja kaum auf der Platte rumliegen
Es handelt sich also um eine Erweiterung auf 8-Bit, wobei das überschüssige Bit aus ASCII dann ANSI macht. Da ANSI nie also Norm verabschiedet wurde, wird es aber eher als ISO 8859 bezeichnet. Ist aber auch nicht eindeutig, da hier 14 verschiedene Ländercodes mit gemeint sein können.Aus diesem Grunde verwende ich fast ausschließlich nur noch UTF-8.
-
7bittig wird er ja kaum auf der Platte rumliegen
Nicht wirklich. Ich meinte mit 8bittig einfach nur den Unterschied zu Mehrbytecodierung
Gruß Volkmar
-
Lösung zu EaR 5
-------------------Spoiler anzeigen
Die Liste der Programmierer scrollt von unten durch.Lösung zu EaR 5 Teil 2
-------------------------
Punkt geht an Volkmar.Spoiler anzeigen
Die Byte Order Mask (BOM) beginnt für Unicode mit $FF, $FE \\ Unicode reverse order mit $FE, $FF
und für UTF-8 $EF,$BB,$BF \\ UTF-16 Big Endian $FE,$FF \\ UTF-32 (selten) wie UTF-16 -
Abt. EaR 7 ´God Mode´
===============
Seit Vista gibt es den God Mode: Create a new folder and use the following string of characters as its name: GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}
Frage: Was bewirkt er? -
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!