wie kann ich eine Variable aufsplitten / aufteilen , zB. aus 43,5 drei einzelne Werte /Variablen machen (4 , 3 und 5)?
zum Beispiel durch rechnen....... Du möchtest doch den Inhalt der Zehner-, der Einer- und der Nachkommastelle haben. Otto
@Otto Genial! -Da wäre er nie drauf gekommen..... ;-) @Peter Guck mal in den Anhang, das kannst Du auf Dich anpassen. MfG Paul
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. ...
>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
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.
@Weinbauer Ja nicht! Das ist eine Methode, die Hannes überhaupt nicht leiden kann. Das weiß ich aus Erfahrung. Paul
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.