Tutorial
Runden in FreeBASIC
Also ist die Lösung nicht ganz sauber? Doch, aber dazu wird VBScript benötigt..
Iiih, VBScript hat doch mit FreeBASIC nichts zu tun, das ist doch m$! Irrtum, im Verzeichnis [FreeBASIC-Verzeichnis]\examples\disphelper\ gibt es eine Datei vbs.bas und die benutzt nicht nur VBScript, sondern auch JScript. Also ist der Gebrauch dieser beiden "Sprachen" von den FB-Entwicklern vorgesehen..
Die VBScript-Funktion zum Runden von Zahlen heißt Round(Zahl[, Nachkommastellen]) und liefert, wie nicht anders zu erwarten, den gewünschten(gerundeten) Wert als String, den wir nun nach Belieben noch weiterbehandeln können, ja müssen, denn auch hier werden die nationalen Einstellungen berücksichtigt:
Const False=0, True=Not False
#include once "windows.bi"
#define UNICODE
#include "disphelper/disphelper.bi"
' RunScript:
' Ein Skript mit dem MSScriptControl ausführen; ggfs. ein Ergebnis liefern
' Original von v1ctor, geändert für RoundVBS 2007 von ytwinky, MD
' kompiliert und getestet mit fbc 0.181b und FBEdit 1.0.5.6d in 2007
Sub RunScript(byVal ReturnID As LPWSTR, _
byVal ErgebnisPtr As LPVOID, _
byVal ScriptText As LPWSTR, _
byVal ScriptSprache As LPWSTR _
)
Dispatch_Obj(ScriptControl)
If Succeeded(dhCreateObject("MSScriptControl.ScriptControl", Null, @ScriptControl)) Then
If Succeeded(dhPutValue(ScriptControl, ".Language = %T", ScriptSprache)) Then
dhPutValue(ScriptControl, ".AllowUI = %b", True)
dhPutValue(ScriptControl, ".UseSafeSubset = %b", False)
If ErgebnisPtr Then
dhGetValue(ReturnID, ErgebnisPtr, ScriptControl, ".Eval(%T)", ScriptText)
Else
dhCallMethod(ScriptControl, ".Eval(%T)", ScriptText)
End If
End If
End If
Safe_Release(ScriptControl)
End Sub
Function RoundVbs(Zahl As Double, Nachkomma As Integer) As Double
Dim i As Integer, s As String
Dim tResult As ZString Ptr
dhInitialize(True)
dhToggleExceptions(True)
RunScript("%s", @tResult, "Round(" &Zahl &", " &Nachkomma &")", "VBScript")
dhUninitialize(True)
s=*tResult
i=InStr(s, ",") 'Sollte wirklich ein Komma im String sein?
If i Then s[i-1]+=2 '..dann aber ändern xD
Return Val(s)
End Function
Print "Pi=" &RoundVbs(4*Atn(1), 4) 'na, das sieht bekannt aus..
Print "Pi=";:Print Using"#.######"; RoundVbs(4.0*Atn(1.0), 4) '"endliches" Pi^^
Sleep
Das sieht ja auf den ersten Blick noch viel komplizierter aus, als es in Wirklichkeit ist. Hier wird aber auch nur EINE Funktion von VBS benutzt, per disphelper.bi gibt es noch weit mehr..
Wer also Spaß an disphelper.bi hat(oder die sowieso in seinem Programm geladen hat), könnte erwägen, dies zu benutzen.
Ja, ich höre sie schon murren, diejenigen, die nicht die weltgrößte Nachhausetelefonierzentrale installiert haben^^
Aber die erste der genannten Möglichkeiten sollte auch unter pinguinix funktionieren xD
Achso, wo wir gerade bei der ersten Lösung sind: Wenn ein Schlaumeier jetzt sagt, VBScript benutze ich nicht, viieel zu unsicher und 'gefährlich', ich nehm lieber JScript, das ist sicherer..
Nur zu, JScript ist so sicher, da gibt es noch nicht mal Dezimalbrüche^^
Wir müßten also aus unserem Double erst einen Integer machen, den mit JScript bearbeiten und so weiter..
Da ist die erste Lösung sicherlich einfacher.
Und zum Thema 'gefährlich': In den Händen eines Waldarbeiters ist eine Kettensäge ein sinnvolles Werkzeug zum Bäume fällen..
..benutzt er sie jedoch, um sich Einlaß in gewisses Etablissement zu verschaffen, um seine langweiligen Waldarbeiterstunden zu verkürzen, dann wird's gefährlich(Das ist wirklich schonmal passiert!) xD
Mit anderen Worten: Richtig angewendet ist jedes Hilfsmittel ein Werkzeug, in den falschen Händen wird aber schnell eine Waffe daraus!
Noch eine Bemerkung zu den Unterprogrammen:
Aufmerksame Tutorial-Leser werden sicher bemerkt haben, daß in den drei Beispielprogrammen eine Anweisung fehlt..
[Denk- und Suchpause]
In diesen Beispielprogrammen fehlt jeweils die Declare..-Anweisung! Dann laufen die Programme erst, wenn die Declare-Anweisung eingefügt wird und das ist nur ein methodischer Gag, um den Leser zum Mitdenken zu zwingen?
Nein, die Beispiele(als Quelltext) sind getestet und laufen so, wie sie dort stehen.
Stehen die Unterprogramme(UP) zu Beginn des Hauptprogrammes, ist eine Declare-Anweisung nur nötig, wenn die Unterprogramme sich gegenseitig aufrufen und nicht in der richtigen Reihenfolge stehen.
Ein UP, das dem Compiler bereits bekannt ist, kann von den nachfolgenden UP bereits benutzt werden, jedoch UP, die noch folgen, NICHT!
Wer auf Declare-Anweisungen verzichtet, erschwert sich selbst(und denjenigen, die er um Hilfe bittet) die Fehlersuche.
Außerdem muß er immer darauf achten, die UP in der richtigen Reihenfolge im Quellcode anzuordnen, sonst wird aus dem Quellcode schnell mal ein Quälcode..
Achso, wer sich jetzt fragt, wie das obige Beispiel mit Runden aussieht:
Gehe zu Seite
1 2 3 4
Zusätzliche Informationen und Funktionen |
- Das Tutorial wurde am 09.10.2007 von ytwinky angelegt.
- Die aktuellste Version wurde am 04.09.2010 von ytwinky gespeichert.
|
|