Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 06.12.2008, 14:03 Titel: Diese UBYTEs bringen mich noch ins Grab ... |
|
|
Ich bastle gerade an einer fraktalen Schneeflocke *hihi* und stolpere - wieder einmal - über das seltsame Verhalten der UBYTEs.
Code: | dim as short start = 200, ende = 100, mitte
dim as ubyte teilung = 50 ' Teilungsverhaeltnis in Prozent
mitte = start + (ende-start)*teilung/100
print mitte |
liefert mir -32768. Ist das nur bei mir oder beim Linux-Compiler so oder tritt das Problem auch anderswo auf? Ersetze ich UBYTE durch BYTE, dann geht es; mit USHORT klappt es ebenso - nur das UBYTE scheint so seine Probleme zu machen.
(Auch die Frage nach dem
Code: | FOR i AS UBYTE = 10 TO 2 STEP -1 |
ist weiter ungeklärt.)
Ich bin ja sonst bei einem Compiler mit den Wort "Bug" nicht schnell bei der Hand, aber hier stimmt doch was nicht. Weiß da jemand mehr? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 06.12.2008, 14:30 Titel: |
|
|
probier's mal mit
Code: | mitte = (start + (ende-start))*teilung/100 |
dann gehts
gruss _________________
 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 06.12.2008, 14:38 Titel: |
|
|
Stimmt, das klappt - ist nur leider nicht das, was ich habe möchte. Ich will tatsächlich Startwert + 50% des Unterschieds zwischen Startwert und Endwert. Soll also 150 herauskommen.
Habe das Problem aber noch etwas reduziert:
Code: | dim as ubyte test = 10
print -5*test |
Gibt 50 statt -50 aus. Wie gesagt nur bei UBYTE, alle anderen U-irgendwas funktionieren. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 06.12.2008, 18:24 Titel: |
|
|
1. Problem
Code: | mitte = start + (ende-start)/100*teilung |
Hierarchie der Operatoren, es wird / vor * ausgeführt!
mitte = start + (ende-start)*teilung/100 (teilung/100=0)
mitte = start + (ende-start)/100*teilung ((ende-start)/100 = 1)
??? ist auch keine 100% Erklärung dafür, da es mit "teilung As BYTE" auch so klappt!
2. Problem
Code: | FOR i AS UBYTE = 10 TO 2 STEP -1
'mov byte ptr [i], 10
'jmp .Lt_0005 '??????????????
'.Lt_0006:
Print i
'push 1
'push dword ptr [i]
'push 0
'call _fb_PrintUByte@12
Next
'movzx eax, byte ptr [i]
'add eax, 255
'mov bl, al
'mov byte ptr [i], bl
'movzx ebx, byte ptr [i]
'cmp ebx, 2
'jbe .Lt_0006
'.Lt_0005:
FOR j AS BYTE = 10 TO 2 STEP -1
'mov byte ptr [j], 10
'.Lt_000A:
Print j
'push 1
'push dword ptr [j]
'push 0
'call _fb_PrintByte@12
Next
'movsx ebx, byte ptr [j]
'dec ebx
'mov al, bl
'mov byte ptr [j], al
'movsx eax, byte ptr [j]
'cmp eax, 2
'jge .Lt_000A
'.Lt_0009: | Ich habe auch keine vernünftige Erklärung warum bei UBYTE direkt ein Jump zum Ende des FOR..NEXT-Blocks steht?????
Halte ich auch für einen Bug!!!
3. Problem
Code: | DIM AS UBYTE test = 10
PRINT -5*Test | ist in der Win32-Version keins, richtiges Ergebnis -50 wird ausgegeben. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 06.12.2008, 19:26 Titel: |
|
|
ne Lösung hab ich auch nicht...
wie wäre es mit dem guten alten ABS?
Code: | DIM AS SHORT start = 200, ende = 100, mitte
DIM AS UBYTE teilung = 50 ' Teilungsverhaeltnis in Prozent
mitte = start + abs(ende-start)*teilung/100
PRINT mitte
sleep |
Mutton |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 06.12.2008, 19:41 Titel: |
|
|
Zitat: | mitte = start + (ende-start)*teilung/100 (teilung/100=0) |
Dann sollte doch eher start+0 = 200 herauskommen, und nicht -32768 herauskommen.
Schade eigentlich, denn ich setze das UBYTE sehr gerne ein, aber wenn man sich nicht darauf verlassen kann, dass auch das heraus kommt, was heraus kommen sollte, ist das ziemlich doof.
@Muttonhead:
Code: | mitte = start + abs(ende-start)*teilung/100 |
liefert etwas anderes, nämlich 250 (sollte es zumindest; meine Berechnung soll aber 150 liefern). Aber das ist nicht das Problem. Die Rechnung kriege ich schon so hin, dass sie funktioniert, aber man kann sich bei einer UBYTE-Rechnung offenbar nicht auf korrekte Funktionsweise verlassen.
Mag das mal jemand als Bug melden? Mein aktives Englisch ist dazu leider nicht gut genug. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 06.12.2008, 20:00 Titel: |
|
|
Hmm jetzt hab ichs erst deine Aufgabenstellung verstanden, das Vorzeichen ist hierbei ja wichtig
Code: | DIM AS UBYTE percent = 50
print percent/100 * -500
print -500 * percent/100
sleep |
sollte definitiv das gleiche herauskommen
aber mein English ist auch schon nen paar Jährchen her, da muss die Jugend ran
Mutton |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 10.12.2008, 23:10 Titel: |
|
|
Einzelschritte?
Kein plan ob das so stimmt^^
Code: | DIM AS SHORT start = 200, ende = 100, mitte
DIM AS UBYTE teilung = 150 ' Teilungsverhaeltnis in Prozent
mitte = start + (ende-start)
print mitte ' debug
mitte * = teilung/100
PRINT mitte
sleep
|
_________________ Bis irgendwann...  |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 11.12.2008, 08:57 Titel: |
|
|
Code: | mitte = start + (ende - start) * CInt(teilung) / 100 |
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 11.12.2008, 17:38 Titel: |
|
|
Ich glaube nemored hat kein Problem mit einem Workaround.
Das Problem liegt beim FBC, der hat beim Multiplizieren und Dividieren mit Short, UByte und Konstanten ein Vorzeichenproblem.
Code: | Dim x As Short = -300
Dim y As UByte = 30
Print x;" / " & y ;" = ";x / y
Print x;" \ " & y ;" = ";x \ y
Print x;" * " & y ;" = ";x * y
Print
Print y;" / -3 = ";y / -3
Print y;" \ -3 = ";y \ -3
Print y;" * -3 = ";y * -3
Print
Sleep | also ein Bug! _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
|