Forum: Mikrocontroller und Digitale Elektronik Variable aufsplitten unter Bascom


von Peter (Gast)


Lesenswert?

wie kann ich eine Variable aufsplitten / aufteilen , zB. aus 43,5 drei 
einzelne Werte /Variablen machen (4 , 3 und 5)?

von Otto (Gast)


Lesenswert?

zum Beispiel durch rechnen.......

Du möchtest doch den Inhalt der Zehner-, der Einer- und der 
Nachkommastelle haben.

Otto

von Paul B. (paul_baumann)


Angehängte Dateien:

Lesenswert?

@Otto
Genial! -Da wäre er nie drauf gekommen.....
;-)

@Peter
Guck mal in den Anhang, das kannst Du auf Dich anpassen.

MfG Paul

von Hannes L. (hannes)


Lesenswert?

Paul Baumann schrieb:
> @Otto
> Genial! -Da wäre er nie drauf gekommen.....
> ;-)

Ich schon, habe mich aber rausgehalten, weil (vermutlich unbekümmert) 
Fließkomma im Spiel ist.

>
> @Peter
> Guck mal in den Anhang, das kannst Du auf Dich anpassen.

Ich bin zwar nicht Peter, habe aber auch mal in den Anhang geschaut. Ich 
zitiere mal daraus:
1
Zahl = 1204                   'Voreinstellung zum Testen
2
3
For I = 1 To 4
4
 Stelle(i) = Temp Mod 10      'letzte Stelle in Ziffernvariable schreiben
5
 Temp = Temp / 10             'vorletzte Stelle zur letzten machen
6
Next I                        'das Ganze noch 3 x von vorn

Dir ist bewusst, dass Modulo eine Division ist, bei der man das Ergebnis 
wegwirft und nur den Rest verwendet?
Somit hast Du in jedem Schleifendurchlauf 2 Divisionen, die der AVR in 
Hardware nicht kann, also in Software erledigen muss. Da halte ich die 
Subtraktionsmethode zum Isolieren der Ziffern für ressourcenschonender 
(schneller und kleiner).
1
Stundenzehner = Stelle(4) * 10
2
Stundeneiner = Stelle(3) * 1
3
Stunden = Stundenzehner + Stundeneiner
4
Print Stunden
5
Minutenzehner = Stelle(2) * 10
6
Minuteneiner = Stelle(1) * 1
7
Minuten = Minutenzehner + Minuteneiner
8
Print Minuten

Und das funktioniert?

Angenommen, die "Zahl" sei 1204 (Dein obiges Beispiel) und ist durch 
Zählen der Minuten entstanden. Dann ergibt Deine Ausgabe 12 Stunden und 
4 Minuten. 1204 Minuten sind nach meiner Rechnung aber 20 Stunden und 4 
Minuten.

Wäre Deine Zahl 1199 (also 5 weniger), dann würde Deine Ausgabe 11 
Stunden und 99 Minuten ausgeben, es sind tatsächlich aber 19 Stunden und 
59 Minuten.

Auch hier bietet sich die Subtraktionsmethode zum Isolieren der Stunden, 
Minuten und evtl. auch Sekunden aus der "fortlaufenden Zahl" an, weil 
sie einfach effektiver ist und nebenher auch noch korrekte Ergebnisse 
liefert.

>
> MfG Paul

@Peter:

Überdenke bitte erstmal, ob Du unbedingt Dezimalbrüche brauchst.

Oft ist es besser, mit Ganzzahlen (Integer, Long) zu arbeiten, da die 
Rechenalgorithmen einfacher und somit schneller sind. Man skaliert dazu 
einfach auf das 10-fache (100-fache, 1000-fache) der gewünschten Einheit 
und schummelt bei der Ausgabe der Zahl das Dezimalkomma an die richtige 
Stelle. Leider unterstützt das (das Einschummeln des Kommas) weder der 
Bascom-Befehl PRINT noch der Bascom-Befehl LCD. Man muss also die 
Ausgabe (Zerlegung des Ergebnisses in Ziffern) auch selbst machen. Dies 
ist aber (bei Ganzzahlen) mit der Subtraktionsmethode schnell erledigt.

Achja, ich gehe vom AVR aus, beim '8051 sieht das anders aus, der kann 
wohl (wenn ich richtig informiert bin) in Hardware dividieren.

...

von Paul Baumann (Gast)


Lesenswert?

>Und das funktioniert?

Allerdings! Sonst hätte ich es nicht gepostet. Probier es doch einfach 
mal im Simulator. Ich habe die Schnauze voll von dieser verdammten 
Belehrerei.

Paul

von Weingut P. (weinbauer)


Lesenswert?

auch eine Variante wäre Du definierst nen String

dim string_var as string *10

und ne Overlayvariabel

dim char_array (11) as byte at string_var overlay

dann machst Du per fusing nen String aus Deinem wert
und die einzelnen Zeichen kannst Du einfach aus dem
Array lesen.

Kommt halt drauf an was mit den Werten dann noch passieren
soll.

von Paul B. (paul_baumann)


Lesenswert?

@Weinbauer

Ja nicht! Das ist eine Methode, die Hannes überhaupt nicht leiden kann.
Das weiß ich aus Erfahrung.

Paul

von Hannes L. (hannes)


Lesenswert?

Paul Baumann schrieb:
> @Weinbauer
>
> Ja nicht!

Wieso nicht? ist doch clever und vermeidet allerhand Stringfunktionen. 
Wie effizient es gegenüber der Subtraktionsmethode ist, könnte man durch 
Analyse des rückassemblierten Maschinencodes und durch Simulation 
ermitteln. Da ich aber nicht die Absicht habe, tiefer in die 
Bascom-Materie vorzudringen, werde ich das nicht tun.

> Das ist eine Methode, die Hannes überhaupt nicht leiden kann.

Das ist eine Verallgemeinerung, die so nicht stimmt, weil sie Äpfel mit 
Birnen vergleicht.

Was mir damals an Deinem Programm nicht gefallen hat, war etwas völlig 
Anderes:

- Zahl mit STR() zum String wandeln
- Ziffern mit MID() ausschneiden
- Ziffern mit VAL() wieder zu Zahlen machen
- Segment-Bitmuster für 7-Segment-Anzeige mit SELECT CASE zuweisen
- und das alles im Interrupt, in dem keine Zeit für solche Spielchen
  ist...

> Das weiß ich aus Erfahrung.

Aus Erfahrung müsstest Du wissen, dass ich meine Programme in ASM 
schreibe und ganz gut ohne Bascom zurecht komme.

Dass ich mich überhaupt mit Bascom befasst habe, ist einzig und allein 
darin begründet, dass ich Dir bei einigen Programmen geholfen habe, bei 
denen Du alleine nicht so recht weiter gekommen bist. Und dabei bin ich 
nicht tiefer in die Besonderheiten von Bascom eingedrungen, als für die 
damaligen Probleme unbedingt nötig war.

Ich bin also nicht der typische Bascom-Benutzer und kenne daher auch 
nicht alle Einzelheiten von Bascom, auch nicht den gesamten Wortschatz 
(Befehle, Anweisungen, Funktionen), denn ich brauche das einfach nicht.

Daher wusste ich zu der Zeit "Deiner Erfahrung" auch nicht, dass man mit 
"Dim as Overlay" ein Byte-Array auf einen String mappen kann und so den 
String durch einfachen (im Gegensatz zu MID() schnellen) indizierten 
Variablenzugriff zerlegen kann. Auch über FUSING und FORMAT wusste ich 
damals nicht bescheid. Und da ich von Fachleuten gelesen hatte, dass das 
Zerlegen von Zahlen zu Ziffern beim AVR in ASM mit der 
Subtraktionsmethode am schnellsten ist, wählte ich auch in Bascom diese 
Methode. Denn der AVR kann nunmal kein Basic, also muss auch Bascom den 
Code in Maschinencode (in ASM notierbar) umwandeln. Und der Erfolg gab 
uns doch damals recht, oder?

>
> Paul

Achja, inzwischen muss ich auch die Behauptung zurücknehmen, dass Bascom 
bei Festkomma-Arithmetik keinen Dezimalpunkt in die Ausgabe schummeln 
könnte.
Beitrag "Re: Variable aufsplitten unter Bascom" 
(vorletzter Absatz)
Es geht, und zwar mittels FORMAT(). Ob es aber effizienter ist als eine 
eigene Ausgaberoutine nach dem Subtraktionsverfahren, das kann (und 
möchte) ich nicht beurteilen. Es ist mir auch nicht wichtig, da ich 
meine Vorhaben ganz gut ohne Bascom realisieren kann.

...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.