PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : A<B oder B>A ?



Sauerbruch
11.05.2009, 16:54
Moin!

Wenn ich zwei Byte-variablen vergleichen möchte, ist es vom Effekt her ja egal ob ich

If A < B then... else...
oder
If B > A then... else...
schreibe.

Ich meine aber hier mal gelesen zu haben, dass eine der beiden Varianten erheblich mehr Code produziert - leider habe ich den Thread trotz intensiver Suche nicht mehr gefunden.

Weiß hierzu jemand etwas genaueres?

Netzman
11.05.2009, 17:12
ein > sollte nicht verwendet werden, nur >= oder < (steht hier: https://www.roboternetz.de/wissen/index.php/Bascom#Wie_man_besonders_kompakten_Code_erzeugt , habs gestern selbst wieder nachgeschlagen weil ich das immer wieder verwechsel :) )

mfg

TomEdl
11.05.2009, 17:40
Hallo!

Im vorher genannten Link steht folgendes:

Vermeide a>b, verwende a>=c oder b<a (RISC-Prozessor kennt kein größer als)
Weiß jemand was der RISC-Prozessor statt "größer als" ausführt?



Vermeide Bit-Variable

Warum? Wenn ich zum Beispiel fünf Variablen in meinem Programm benötige, die nur den Wert 0 oder 1 beeinhalten, bin ich mit fünf Bit-Variablen sparsamer unterwegs als mit fünf Byte Variablen, weil dann die fünf BIT-Variablen nur 1 Byte Platz im SRAM verbrauchen.

Oder bin ich da komplett falsch unterwegs...

Grüße
Thomas

Sauerbruch
11.05.2009, 18:00
Danke, Netzman!

Genau diesen Link habe ich gesucht :-)
Werd´s mir gleich mal irgendwo aufschreiben!

Gruß,

Daniel

for_ro
11.05.2009, 18:29
Hallo!
Weiß jemand was der RISC-Prozessor statt "größer als" ausführt?

Die Frage müsste lauten: Weiß jemand, wie Bascom das umsetzt?
Wenn der µC keinen Befehl dafür hat, kannst du ihm auch keinen schicken, den er dann durch etwas anderes ersetzt. Das muss schon dein Compiler machen.



Vermeide Bit-Variable

Warum? Wenn ich zum Beispiel fünf Variablen in meinem Programm benötige, die nur den Wert 0 oder 1 beeinhalten, bin ich mit fünf Bit-Variablen sparsamer unterwegs als mit fünf Byte Variablen, weil dann die fünf BIT-Variablen nur 1 Byte Platz im SRAM verbrauchen.

Oder bin ich da komplett falsch unterwegs...

Grüße
Thomas
Das macht der Compiler aber so nicht.
Legst du z.B. 5 Flags auf die Bits 0-4 einer Byte-Variablen My_flags, dann stimmt deine Vermutung. Für eine Bit-Variable werden tatsächlich 2 Byte im SRAM belegt.
Übrigens wird beim Verarbeiten von Bit-Typen häufig mehr Code erzeugt als mit Byte-Typen.
If A = B Then ...
erfordert z.B. 14 Cycle, wenn A und B Bit-Typen sind. Als Bytes nur 7 Cycle.
Kann man sich im Simulator übrigens sehr schön ansehen.

Gruß

Rolf

Tido
11.05.2009, 21:46
Was nimmt man dann für

If A <> B then

etwa

If not A=B then

???

AlKI
11.05.2009, 21:54
eeeh bin zwar nicht mehr so wirklich im BASCOM-Proggen drin, würd aber auf das tippen:

if a==b then (keine Anweisung)
else
(tu was)
endif

for_ro
11.05.2009, 22:01
Was nimmt man dann für

If A <> B then

etwa

If not A=B then

???

If A <> B then '9 Cycle
If A = B then '7 Cycle
Else '3Cycle
C = Not A '9 Cycle
Lohnt alles nicht, <> ist besser, es sei denn, du hast sowieso einen Else-Zweig.

Gruß

Rolf

TomEdl
11.05.2009, 22:21
A <> B bedeutet jetzt "A nicht B" oder?

Besserwessi
11.05.2009, 22:38
Für die AVRs sollte es egal sein ob man a>b oder b<a schreibt. Der Prozesor ist zwar RISC, hat aber trotzdem die Vergleich für beide Richtugen. Wenn einer der beiden Fälle anders ist, dann ist das höchstens eine Schwäche der Compilers.

A<>B steht für ungleich, sollte also das gleiche geben wie NOT (A=B).

kolisson
12.05.2009, 04:46
möchtest ne klare antwort auf die frage:
WARUM nicht BIT ?

hier ist die antwort:
du hast einen 8bit microcontroller. wie der name schon sagt,
arbeitet der mit 8-bit.
daraus schliessen wir, dass jeder speicherzugriff mit 8 bit erfolgt.

also .. es würde nix bringen, die sachen als BIT zu deklarieren, da ja immer ein byte geladen werden muss um das bit zu finden.

innerhalb des programmes kann man ja trotzdem bitweise arbeiten..

ein
dim flags as byte

stellt ja unter dem namen flags schon ein byte oder 8 bit zur verfügung.

ansprechen kann man die einzelnen bits dann wie bei den ports:

flags.0 =0
flags.1 =1
flags.2 =0
flags.3 =0
flags.4 =0
flags.5 =0
flags.6 =0
flags.7 =1

insofern sollte ein befehl "print flags" 130 erzeugen.

gruss kkaus

TomEdl
12.05.2009, 14:43
@kolission

Danke für die klare und hilfreiche Antwort. Das mit den "flags.0" kannte ich noch nicht.

Gruß
Thomas
:)