Ankündigung

Einklappen
Keine Ankündigung bisher.

brauche Hilfe bei selbst erstellter Funktion

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    brauche Hilfe bei selbst erstellter Funktion

    Hallo,
    wollte mal eine Funktion selbst erstellen und hab mich an das "schöne" Formatieren einer Zahl gemacht. Ergebnis soll sein, dass auf eine vorgegeben Zahl an Nachkommastellen gerundet wird und der ganzzahlige Teil mit Tausenderpunkten getrennt wird. Der aktuelle Stand ist noch mitten in der Entwicklung, sprich ich hab noch jeden kleinen Schritt möglichst als eigene Zeile mit eigener Variable, damit man die Zwischenergebnisse debuggen kann. Und das ganze ist noch weit davon entfernt einen Schönheitspreis zu gewinnen und etliche Konstellationen sind auch noch nicht berücksichtigt.
    Aber ich komm an einer Stelle einfach nicht weiter. Hier erst mal der Code:
    Code:
    :begin round(x,NKS,TP)
    :info rundet den Wert x auf NKS Nachkommastellen und fügt ggf. Tausenderpunkte ein.
    
    //**************************************
    //* negative NKS mit Divison einbauen
    //**************************************
    
    Nachkomma=$a$
    ZahlFormat1 = $x$
    ZahlFormat = $y$
    Vorkomma1 = $z$
    Vorkomma2 = $q$
    Wert1 = convert(x,0.0f32)
    Wert2 = Wert1 * pow( 10.0f32 , convert(max(NKS,1),0.0f32))    + 0.5f32 
    Wert3 = convert(Wert2, 0s32)
    TextZahl =convert(Wert3, $$)
    Laenge = size(TextZahl)
    VKS = Laenge - convert(NKS,0u16)
    Vorkomma = split(TextZahl, 0u16, VKS - 1u16)
    
    if size(Vorkomma) > 3u16 then \\
         Vorkomma1 = split(Vorkomma, 0u16, size(Vorkomma)-4u16) ;\\
         Vorkomma2 = split(Vorkomma, size(Vorkomma)-3u16, size(Vorkomma)-1u16) ;\\
         ZahlFormat1 = Vorkomma1 + $.$ + Vorkomma2   \\
    endif 
    
    if size(Vorkomma) <= 3u16 then ZahlFormat1 = Vorkomma endif
    
    NKS1 = NKS
    
    NKSx = VKS + convert(NKS,0u16) - 1u16
    
    if NKS > 0 then Nachkomma = split(TextZahl, VKS , NKSx ) ; ZahlFormat = ZahlFormat1 + $,$ + Nachkomma endif
    :return ZahlFormat
    :end
    Aufgerufen mit
    Code:
    round("Aussentemperatur-9/1/1",1,EIN)
    Zum Test schreib ich manuell den Wert 1234,56 auf diese GA. Ergebnis im Debugger ist:
    round.JPG

    Zwei Sachen verstehe ich nicht. Erstens ist "Nachkomma" immer 0, warum
    und zweitens: warum ist "ZahlFormat" "0,0", obwohl in ZahlFormat1 ja noch der richtige Wert ("1.234") drin steht?

    PS:
    Ansatz ist beim Wert das Komma um die gewünschte Anzahl an Nachkommastelln nach rechts zu schieben (Multiplikation mit der 10er Potenz), zu runden, in Text zu wandeln und diesen Text dann in den Teil vor und nach dem gewünschten Komma zu schneiden und dann mit "," dazwischen wieder zusammen zu fügen.
    ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

    #2
    ich glaube das hängt mit dem Evaluierungsthema zusammen: wenn sich nichts ändert, dann wird die Zuweisung nicht ausgeführt...
    Du "musst" ohnehin nicht mit zusätzlichen Variablen arbeite, zu kannst es direkt übernehmen - also
    Code:
     statt round(x,NKS,TP) -> round(Zahlformat1, ...
    die Zuweisung beim Thema Nachkomma dürfte das Problem in der Split-Funktion liegen- die eben 0 zurückgibt weil ......*ratlos*
    Der fehler liegt im Verständnis der Funktion- (da bin ich auch lange gesessen):
    DU (und ich auch) bist der Meinung dass die beiden Variablen den Beginn und die Länge des auszuschneidenden Textes angeben -> MACHEN SIE ABER NICHT!!!
    Zuletzt geändert von EPIX; 23.10.2015, 09:03. Grund: falsche Erklärung der Split-syntax entfernt (Vermeidung von zusätzl. Verwirrung ;-) )
    EPIX
    ...und möge der Saft mit euch sein...
    Getippt von meinen Zeigefingern auf einer QWERTZ Tastatur

    Kommentar


      #3
      Hallo Erich,

      schon mal Danke für Deine Denkanstöße!

      Die vielen Zwischenvariablen hab ich ja nur fürs Debugging eingebaut, weil es dann halt schlicht einfacher ist zu sehen WO etwas schief geht. Validierungsschema prüf ich noch mal, aber eigentlich ändern sich alle Variablen, nur nicht in der gewünschten Art....

      Zu split: Ja, mein allererster Ansatz war tatsächlich wie sonst üblich von dem Ansatz "split(Text, Start, Länge)" ausgegangen, hab dann aber auch gesehen, dass es Startposition/Endeposition ist.

      Ich hab ja folgenden Code
      Code:
      Nachkomma = split(TextZahl, VKS , NKSx )
      , was im Beispiel oben konkret das hier wäre:
      Code:
      Nachkomma = split($12346$, 4, 4)
      Laut Handbuch sollte das eigentlich EIN Zeichen, hier eine $6$, zurück liefern. Es liefert ja auch keinen Null-String ($$) so wie von Dir vermutet, sondern die Zahl "0", die in dem Text aus dem ausgeschnitten wird, aber gar nicht vorkommt.

      Und bei den Splits für den Vorkomma Bereich arbeite ich mit der gleichen Logik und da wird der richtige Teil ausgeschnitten.

      Jetzt wo ich das so schreibe: Wenn der Vorkommateil nur ein Zeichen lang ist, wird da auch ne "0" geliefert. Ehrlich gesagt: Ich glaub splitt kann kein einzelnes Zeichen ausschneiden!

      Nachtrag:
      Dein Codebeispiel
      Code:
      statt round(x,NKS,TP) -> round(Zahlformat1, ...
      versteh ich nicht. Das "round(x,NKS,TP)" ist ja die Parameterübergabe an den Makro. Wie soll ich an der Stelle vereinfachen?
      Zuletzt geändert von Uwe!; 23.10.2015, 08:05.
      ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

      Kommentar


        #4
        ich meine damit du kannst dir damit Zuweisungen wie ZahlFormat1 = $x$ sparen....
        probiere einfach einmal
        Nachkomma = split($12346$, 4, 4+1)
        EPIX
        ...und möge der Saft mit euch sein...
        Getippt von meinen Zeigefingern auf einer QWERTZ Tastatur

        Kommentar


          #5
          ich bau grad ein reines Split-Test-Beispiel auf.

          Und das ZahlFormat1 = $x$ hab ich auch nur zum Debuggen eingebaut um zu sehen, ob der Code für ZahlFormat1 ausgeführt wird, was der Fall ist, weil sonst das x drin bleiben würde.
          ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

          Kommentar


            #6
            ich hab mal folgenden Code direkt in der [EibPC] Section hinterlegt:
            Code:
            NK1 = split($123456$, 0u16, 0u16)
            NK2 = split($123456$, 1u16, 1u16)
            NK3 = split($123456$, 0u16, 1u16)
            NK4 = split($123456$, 1u16, 2u16)
            NK5 = split($123456$, 4u16, 4u16)
            NK6 = split($123456$, 4u16, 5u16)
            NK7 = split($123456$, 5u16, 5u16)
            Erwarten würde ich:
            Code:
            NK1 = 1
            NK2 = 2
            NK3 = 12
            NK4 = 23
            NK5 = 5
            NK6 = 56
            NK7 = 6
            Debugger zeigt folgende Werte:
            Code:
            NK1 = 1
            NK2 = 2
            NK3 = 12
            NK4 = 23
            NK5 = 5
            NK6 = 56
            NK7 = 6
            hm, schade. Splitt funktioniert hier wie erwartet. Dann hab ich erst mal keine Idee mehr, was da schief läuft.....
            ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

            Kommentar


              #7
              da bin ich jetzt mit meinem latein am Ende...
              Da hilft wohl nur der große Enertegus
              EPIX
              ...und möge der Saft mit euch sein...
              Getippt von meinen Zeigefingern auf einer QWERTZ Tastatur

              Kommentar


                #8
                der war auf Symposium

                Aber jetzt wär er wieder da...
                ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

                Kommentar


                  #9
                  GELÖST!
                  Also der richtige Hinweis stand schon in Beitrag #2! Es ist mal wieder die Validierung.

                  Die Zeile
                  Code:
                  if NKS > 0 then Nachkomma = split(TextZahl, VKS , NKSx ) ; ZahlFormat = ZahlFormat1 + $,$ + Nachkomma endif
                  wird natürlich nur einmalig ausgeführt, was ansich noch nicht schlimm wäre. Allerdings komischerweise zu einem Zeitpunkt an dem TextZahl noch nichts enthält.
                  Erschwerend kommt hinzu, das splitt wohl eine "0" liefert, wenn der String nichts enthält, hab ich aber noch nicht wirklich getestet, wüsste aber nicht, wo die 0 sonst herkommen soll.
                  ....und versuchen Sie nicht erst anhand der Farbe der Stichflamme zu erkennen, was Sie falsch gemacht haben!

                  Kommentar

                  Lädt...
                  X