Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Diese UBYTEs bringen mich noch ins Grab ...

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 06.12.2008, 14:03    Titel: Diese UBYTEs bringen mich noch ins Grab ... Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 06.12.2008, 14:30    Titel: Antworten mit Zitat

probier's mal mit

Code:
mitte = (start + (ende-start))*teilung/100


dann gehts

gruss
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 06.12.2008, 14:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 06.12.2008, 18:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 06.12.2008, 19:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 06.12.2008, 19:41    Titel: Antworten mit Zitat

Zitat:
mitte = start + (ende-start)*teilung/100 (teilung/100=0)

Dann sollte doch eher start+0 = 200 herauskommen, und nicht -32768 herauskommen. neutral
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.
weinen

@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. traurig

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
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 06.12.2008, 20:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
AndT



Anmeldungsdatum: 02.04.2007
Beiträge: 481

BeitragVerfasst am: 10.12.2008, 23:10    Titel: Antworten mit Zitat

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... grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 11.12.2008, 08:57    Titel: Antworten mit Zitat

Code:
mitte = start + (ende - start) * CInt(teilung) / 100



MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 11.12.2008, 17:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz