DBC Rechner

  • Hallo Autoit Forum!

    Ich arbeite derzeit an einem Rechner für DBC files, der in einem bestimmten Intervall einen Wert zu einer Variable rechnen soll, und das ganze dann durch eine andere Variable Teilen soll. Ich schäme mich beinahe es zu sagen, aber ich hänge an diesem Simplen Problem. Wie sage ich Autoit, dass es Input 2 minus Input 1 geteilt durch Input 3 rechnen soll?

    Aktuell sieht es bei mir so aus:

    [autoit]

    $AW = GUICtrlRead($Input1)
    $EW = GUICtrlRead($Input2)
    $Lv = GUICtrlRead($Input3)

    [/autoit][autoit][/autoit][autoit]

    Case $calc
    $sol = Execute("$EW-$AW/$Lv")
    GUICtrlSetData($Label1, $sol)

    [/autoit][autoit][/autoit][autoit][/autoit]


    Funktionsweise ist denke ich klar, das Ergebnis wird in Label 1 eingetragen. Bei mir trägt er da aber nur "-1.#IND" ein... Hat da jemand ne Idee zu?

    LG

    was2 :thumbup:

    Einmal editiert, zuletzt von was2 (18. Januar 2014 um 21:05)

  • [autoit]

    Execute($EW - $AW / $LV

    [/autoit]

    Steve

    [Blockierte Grafik: http://stefan.blagojevic.at/loading.gif]

    Design, Modellbau, CAD <3
    AutoCAD, ArchiCAD, REVIT (ist ein Scheiss, habe aber das Zertifikat)

    Cinema 4D, RuckZuck Statik Programm

    Michael Bay als Architekt


    Da eine Glasfassade! Booom Sichtbeton! Laminiertes Bild auf Mosaiksteinchen! Granit! Granit! Granit! Sichtbetonwand mit 50° Neigung!
    Holzverkleidung erscheint da! Boooooom!

  • Erstmal wie gesagt ist execute völlig sinnfrei in diesem Fall. Zum anderen schadet es nicht mit Klammern zu arbeiten um sicherzustellen, dass Punkt-Vor-Strich Regeln korrekt umgesetzt werden. Außerdem muss bei Divisionen auch immer sichergestellt sein, dass nicht durch 0 geteilt wird. Das sollte am besten vorab beim Auslesen des Controls passieren. Sofern du die Controls nicht abgesichert hast und dort auch anderes als Zahlen eingetragen werden kann sollte grundsätzlich auch ein Casting in den "Typ" number vorgenommen werden.


    [autoit]


    $AW = number(GUICtrlRead($Input1))
    $EW = number(GUICtrlRead($Input2))
    $Lv = number(GUICtrlRead($Input3))

    [/autoit][autoit][/autoit][autoit]

    Case $calc
    if $Lv <> 0 then
    $sol = ($EW-$AW) / $Lv
    else
    $sol = "Division durch Null !"
    endif
    GUICtrlSetData($Label1, $sol)

    [/autoit]

    Einmal editiert, zuletzt von misterspeed (18. Januar 2014 um 17:33)

  • Probiers mal so:

    [autoit]

    $AW = Number(GUICtrlRead($Input1))
    $EW = Number(GUICtrlRead($Input2))
    $Lv = Number(GUICtrlRead($Input3))

    [/autoit][autoit][/autoit][autoit]

    Case $calc
    $sol = $EW - $AW / $Lv
    GUICtrlSetData($Label1, $sol)

    [/autoit]

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Ahja und da du nur einen Bruchteil des Quellcodes gepostet hast wäre noch folgender Fehler denkbar:

    Du liest den Inhalt der Controls nur zum Programmstart aus. Zu diesem Zeitpunkt sind alle Controls noch auf "" bzw. 0 gesetzt, dadurch ändert sich natürlich auch nichts am Ergebnis wenn du später Werte einträgst. Du musst die Controls also immer unmittelbar bevor gerechnet werden soll auslesen.

  • misterspeed

    Ich habe meinen Code nun deinem angepasst, jedoch schmeißt der Rechner mir als Ergebnis nun "Division durch Null!" vor die Füße. Da es mühselig ist Euch nur Teile des Codes zu posten, hoffe ich es ist nicht schlimm wenn ich den ganzen Code hier rein poste.

    [autoit]


    #cs ----------------------------------------------------------------------------

    [/autoit][autoit][/autoit][autoit]

    AutoIt Version: 3.3.8.1

    [/autoit][autoit][/autoit][autoit]

    Script Function:
    Calculating DBCs + simple Values

    [/autoit][autoit][/autoit][autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit][autoit][/autoit][autoit]

    ; Script Start - Add your code below here

    [/autoit][autoit][/autoit][autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("DBC Calculator", 410, 298, 720, 352)
    $Input1 = GUICtrlCreateInput("Anfangswert", 24, 24, 73, 21)
    $Input2 = GUICtrlCreateInput("Endwert", 112, 24, 73, 21)
    $Input3 = GUICtrlCreateInput("Level", 56, 56, 105, 21)
    $Group1 = GUICtrlCreateGroup("Rechner", 16, 8, 177, 105)
    $Label1 = GUICtrlCreateLabel("Anstieg pro Level", 64, 88, 86, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group2 = GUICtrlCreateGroup("Excel DBC Creator", 216, 8, 177, 105)
    $Input4 = GUICtrlCreateInput("Anfangswert", 256, 24, 105, 21)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Input5 = GUICtrlCreateInput("Anstieg pro Level", 256, 56, 105, 21)
    $Input6 = GUICtrlCreateInput("DBC Reichweite", 256, 80, 105, 21)
    $asdf = GUICtrlCreateLabel("Free Space :D", 168, 192, 73, 17)
    $Progress1 = GUICtrlCreateProgress(16, 120, 382, 17)
    $start = GUICtrlCreateButton("Start", 272, 144, 75, 25)
    $calc = GUICtrlCreateButton("calc", 72, 144, 75, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit][autoit][/autoit][autoit]

    Local $Index = 0

    [/autoit][autoit][/autoit][autoit]

    $AW = Number(GUICtrlRead($Input1))
    $EW = Number(GUICtrlRead($Input2))
    $Lv = Number(GUICtrlRead($Input3))

    [/autoit][autoit][/autoit][autoit]

    $startwert=GUICtrlRead($Input4)
    $APL = GUICtrlRead($Input5)
    $range=GUICtrlRead($Input6)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $Base = $startwert + $APL

    [/autoit][autoit][/autoit][autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;Rechner
    Case $calc
    If $Lv <> 0 Then
    $sol = ($EW-$AW) /$Lv
    Else
    $sol = "Division durch Null!"
    EndIf

    [/autoit][autoit][/autoit][autoit]

    GUICtrlSetData($Label1, $sol)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    EndSwitch
    WEnd

    [/autoit]
  • Siehe mein zweites Posting. Wie vermutet liest du die Controls nur einmal aus und nicht jedesmal wenn der Case "calc" zutrifft. Pack die 3 Zeilen an den Anfang des Cases und es sollte laufen.

  • Siehe mein zweites Posting. Wie vermutet liest du die Controls nur einmal aus und nicht jedesmal wenn der Case "calc" zutrifft. Pack die 3 Zeilen an den Anfang des Cases und es sollte laufen.


    Ich danke Dir!

    Wäre es schlimm den Post noch eine Weile offen zu lassen? Eventuell bildet sich später noch ein Problem, denn die errechneten werte sollen anschließend alle in Excel eingetragen werden. So weit bin ich aber noch nicht :)

  • Da Excel prinzipiell nichts mit GUI Programmierung oder der Autoit Syntax bezüglich mathematischen Formeln zu tun hat halte ich es für sinnvoller einfach einen neuen Thread mit aussagekräftigem Titel zu eröffnen wenn du nochmals Hilfe benötigst. Im Gegensatz zum aktuellen Threadtitel wären z.B folgende Titel sinnvoll "Excel udf kann keine PDF speichern" oder "Probleme mit excel udf beim Einfügen von Tabellenwerten". Eine saubere thematische Abgrenzung und Beschreibung der Probleme macht es wesentlich einfacher für andere die Suchfunktion des Forums zu nutzen. Das sollte auch immer dein erster Schritt sein bevor du ein Thema eröffnest.

    Threads werden hier im übrigen nicht geschlossen, sondern vom Autor selbst durch editieren des ersten Postings und ändern des Threadpräfix auf "[gelöst]" als erledigt markiert. Da dein Problem wohl erstmal erledigt ist solltest du das nun auch entsprechend ändern.

    PS:
    Bei sehr langem Quellcode (mehr als 20 Zeilen) solltest du die Spoilerfunktion nutzen:

    Spoiler anzeigen
    [autoit]

    ;langer Quellcode

    [/autoit]