Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

Runden in FreeBASIC

von RedakteurytwinkySeite 3 von 4

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 Gehe zu Seite  1  2  3  4  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 09.10.2007 von Redakteurytwinky angelegt.
  • Die aktuellste Version wurde am 04.09.2010 von Redakteurytwinky gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen