Seite 2 von 2

Re: Manueller Zähler

Verfasst: 10.08.2011 01:19
von ullmann
Super, vielen Dank.

Ich habe überlegt, wo du den Aufbau der Character-Struktur her hast - und bin dann darauf gekommen, dass man im Strukturverzeichnis auf die Struktur auch doppelklicken kann. Das wusste ich bisher noch nicht. Ein Test bei Word und Byte ergibt tatsächlich, dass diese auch Strukturen sind. Ich dachte bisher, dass der Basistyp ausgeschrieben (z.B. .Byte statt .b) auch ein Basistyp ist, aber in Wirklichkeit handelt es sich hier um Strukuren. Damit wäre NicTheQuick's *char.Character Definition soweit klar.

Re: Manueller Zähler

Verfasst: 10.08.2011 11:02
von Vermilion
Danke für die Hilfe. :) Der code von NicTheQuick hat mir sehr geholfen. Das ist um einiges kompakter als das Gepfusche was ich verbrochen habe. :lol:

Re: Manueller Zähler

Verfasst: 11.08.2011 18:48
von KatSeiko
Ich hätte an der Stelle eigentlich das beliebig erweiterbare System genommen, dass es mit Link-Listen gibt. Kommt sogar ohne Struktur aus.

Code: Alles auswählen

Global NewList zahl.s{1}()
AddElement(zahl())
zahl() = "1"

Procedure Increment()
FirstElement(zahl())
If zahl() = "9"
 zahl() = "0"
 If NextElement(zahl())
  zahl() = Str(Val(zahl())+1)
 Else
  AddElement(zahl())
  zahl() = "1"
 EndIf
Else
 zahl() = Str(Val(zahl())+1)
EndIf
EndProcedure

Procedure Ausgeben()
LastElement(zahl()) ;Nötig weil wir arabische Zahlen haben
text.s = zahl()
While PreviousElement(zahl()) ;Wir gehen also von hinten nach vorne..
 text = text + zahl()
Wend
Debug text
EndProcedure

For i = 1 To 12
Increment()
Next
Ausgeben() ;Sollte "13" ergeben

End 42
Da muss man noch etwas schrauben, damit rekursiv jedes Element auf "Wenn 9" überprüft wird. Aber im Großen und Ganzen ist dieses System eigentlich sicher für Zahlen bis der Speicher voll ist.

Re: Manueller Zähler

Verfasst: 12.08.2011 03:06
von NicTheQuick
KatSeiko hat geschrieben:Ich hätte an der Stelle eigentlich das beliebig erweiterbare System genommen, dass es mit Link-Listen gibt. Kommt sogar ohne Struktur aus.
Ich verstehe das Argument nicht. Was ist an Strings denn nicht beliebig erweiterbar?

Re: Manueller Zähler

Verfasst: 13.08.2011 07:29
von 7x7
Ich glaube mich erinnern zu können, dass es von Rings(?) sogar mal hier eine komplettes Stringarithmetikpaket gab. Habe jetzt aber leider keinen Link dazu.

Re: Manueller Zähler

Verfasst: 13.08.2011 11:04
von BSP
Hallo.
Ich habe auch mal ein wenig "gespielt". Smile.

Variante 1 : Dezimal

Code: Alles auswählen


Global a$=Chr(Asc("0")-1)
; Damit die Anzeige auch schön bei NULL beginnt.

stelle=Len(a$)-1
anz_stellen=3

Procedure Hochzaehlen(stelle)
  If stelle>=0
    a=PeekA(@a$+stelle)+1
    If a>Asc("9")
      a=Asc("0")
      ueberlauf=1
    EndIf
    PokeA(@a$+stelle,a)
  EndIf
  ProcedureReturn ueberlauf
EndProcedure

If OpenWindow(1,0,0,400,70,"Zählen",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  txtgadg=TextGadget(1,0,10,WindowWidth(1),40,"0")
  SetGadgetFont(1,LoadFont(1,"",30))
  
  ;For z=1 To anz_stellen
  Repeat
  
    Repeat
      
      If WindowEvent()=#WM_CLOSE
        Break 2
      EndIf
      
      If  Not (WindowMouseX(1)=-1 Or WindowMouseY(1)=-1)
      ; Maus muss im Window sein
      
        If Hochzaehlen(stelle)
          stelle-1
        Else
          stelle=Len(a$)-1
          SetGadgetText(1,a$)
          Delay(1) ; Damit das Gadget nicht so blinkt
        EndIf
        
      EndIf
      
    Until stelle<0
    a$="1"+a$
    
  ForEver
  ;Next
  
EndIf
;Repeat:Until WaitWindowEvent()=#WM_CLOSE
End
Variante 2 : Binär

Code: Alles auswählen


Global a$="0"
;Global a$=Space(63);64*64*64)
;a$=ReplaceString(a$,Space(1),"1")

stelle=Len(a$)-1
;anz_stellen=3

Procedure Hochzaehlen(stelle)
  If stelle>=0
    a=PeekA(@a$+stelle)+1
    If a>Asc("1")
      a=Asc("0")
      ueberlauf=1
    EndIf
    PokeA(@a$+stelle,a)
  endif
  ProcedureReturn ueberlauf
EndProcedure

If OpenWindow(1,0,0,800,170,"Zählen",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  txtgadg=TextGadget(1,0,10,WindowWidth(1),40,"0")
  SetGadgetFont(1,LoadFont(1,"",30))
  edigadg=EditorGadget(2,0,60,WindowWidth(1),WindowHeight(1)-60)
  SetGadgetFont(2,LoadFont(2,"",16))
  
  ;For z=1 To anz_stellen
  Repeat
  
    Repeat
      
      If WindowEvent()=#WM_CLOSE
        Break 2
      EndIf
      
      If  Not (WindowMouseX(1)=-1 Or WindowMouseY(1)=-1)
        
        If Hochzaehlen(stelle)
          stelle-1
        Else
          stelle=Len(a$)-1
          SetGadgetText(2,a$)
          Delay(1) ; Damit das Gadget nicht so blinkt
          SetGadgetText(1,StrU(Val("%"+a$)))
          Delay(1) ; Damit das Gadget nicht so blinkt
        EndIf
      
      EndIf
      
    Until stelle<0
    a$="1"+a$
    
  ForEver
  ;next
  
EndIf
End
MfG: BSP

Re: Manueller Zähler

Verfasst: 13.08.2011 18:45
von BSP
Nochmals Hallo.
Das es bei meinen "Spielereien" keine Proteste gab,
wundert mich sehr.
Hatte ich die "Stelle" doch glatt zu weit herunter gezählt.
Habs aber nun verbessert.
Habe in der Procedure nun:
If stelle>=0
eingebaut.

MfG: BSP

Re: Manueller Zähler

Verfasst: 13.08.2011 19:13
von DarkDragon
7x7 hat geschrieben:Ich glaube mich erinnern zu können, dass es von Rings(?) sogar mal hier eine komplettes Stringarithmetikpaket gab. Habe jetzt aber leider keinen Link dazu.
Bignum in einem der älteren PBOSL Pakete.

[bobobo dazu:
http://pbosl.purearea.net/index.php?site=Libs

dort in den 3.94er Sources