Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
oldcoolman
Anmeldungsdatum: 05.06.2007 Beiträge: 11
|
Verfasst am: 09.12.2007, 11:42 Titel: ubyte variable führt zu sub-wiederholungen |
|
|
Hallo,
folgendes mit fb 0.18.3 -lang fb -exx compiliert führt zu endlosen Ausführungen:
Code: |
declare sub subtest()
subtest
end
sub subtest
dim x as ubyte
for x= 0 to 255
print x;" ";
next
end sub
|
mit integer dimensioniert geht es tadellos.
Gruß
Andi |
|
Nach oben |
|
 |
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 09.12.2007, 12:06 Titel: |
|
|
lol?
wenn man for i=0 to 256+x macht, zähllt er von null bis x und hörtr dann auf
komisch
liegt jedenfalls weder an -exx noch an 0.18, bei 0.17 ists auch so _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4700 Wohnort: ~/
|
Verfasst am: 09.12.2007, 12:31 Titel: |
|
|
Das mit der Endlosausführung könnte ich mir so erklären, dass er erst x von 255 auf 256 erhöht und dann schaut, ob er über dem TO-Wert 255 liegt - tut er aber nicht, weil 256 ja als 0 gespeichert wird.
Zitat: | wenn man for i=0 to 256+x macht, zähllt er von null bis x und hörtr dann auf |
Ist eigentlich genau das, was ich von ihm erwarte. Die Zahlen werden ja als UBYTE behandelt. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 09.12.2007, 12:42 Titel: |
|
|
Hallo
Ich kenne mich mit FB zwar nicht aus, aber in QB ist der Wert der Zählvariablen nach einer FOR...NEXT Schleife ja auch nicht der Endwert, sondern der nächstgrösste Zählschritt danach. Die Schleife läuft offenbar nicht so lange, bis dieser Endwert erreicht ist, sondern wird verlassen, wenn die Zählvariable grösser ist als der Endwert. Macht ja auch Sinn, die Zählvariable könnte schließlich in der Schleife verändert werden. Bei QB führt z.B.
Code: | DIM x AS INTEGER
FOR x = 0 TO 32767
NEXT |
zu einem Überlauf. Beim ubyte gibt es wohl keinen Überlauf, vielleicht werden einfach nur acht Bit eines an sich grösseren Speicherbereichs benutzt oder so. Nach 255 springt x also vielleicht direkt wieder auf 0 zurück und die Schleife wird nicht verlassen, weil nie ein Wert grösser als 255 erreicht werden kann. Ist aber nur Spekulation.
Gruß
McCoy
EDIT: Mein 1000. Beitrag! _________________ Elektronik und QB? www.skilltronics.de !
Zuletzt bearbeitet von Skilltronic am 09.12.2007, 12:44, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
oldcoolman
Anmeldungsdatum: 05.06.2007 Beiträge: 11
|
Verfasst am: 09.12.2007, 12:42 Titel: ubyte in schleife |
|
|
stimmt. und 256+x wird intern als integer behandelt,denk ich wärend x als ubyte behandelt wird.
Danke für die Antwort |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 09.12.2007, 12:44 Titel: |
|
|
Hi, das ist eine verrückte Sache
Ich habe mir das mal als Assemblerquelltext angesehen:
Code: | movzx ebx, byte ptr [ebp-4] 'lade x als Byte, fülle mit 0 auf
cmp ebx, 255 'vergleiche
jbe .Lt_0008 'Sprung, wenn vorzeichenlos kleiner oder gleich |
d.h. x ist immer ein Wert von 0 - 255 also immer kleiner oder gleich, also wird immer gesprungen.
EDIT/
genau wie nemored und Skilltronic es beschreiben _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Bimi
Anmeldungsdatum: 03.12.2007 Beiträge: 66
|
Verfasst am: 10.12.2007, 13:44 Titel: |
|
|
volta hat Folgendes geschrieben: | Hi, das ist eine verrückte Sache
Ich habe mir das mal als Assemblerquelltext angesehen:
Code: | movzx ebx, byte ptr [ebp-4] 'lade x als Byte, fülle mit 0 auf
cmp ebx, 255 'vergleiche
jbe .Lt_0008 'Sprung, wenn vorzeichenlos kleiner oder gleich |
d.h. x ist immer ein Wert von 0 - 255 also immer kleiner oder gleich, also wird immer gesprungen.
EDIT/
genau wie nemored und Skilltronic es beschreiben |
Ist keine verrückte Sache, ist ganz normal.
Wenn ich eine unsigned habe und MINVAL und MAXVAL als Bedingungen setze, dann ist JEDER durch diesen Datentyp darstellbare Wert kleiner oder gleich MAXVAL, da die Schleife den gesamten Wertebereich umfaßt. _________________ Rechtbehelf:
Rechschreibverfehlungen, Vergehen an der Deutschen Sprache sowie Stabwechselverbuchselungen unterliegen dem Urheberrecht, sind voll beabsichtigt und fördern das aufmerksame Lesen. |
|
Nach oben |
|
 |
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 10.12.2007, 17:23 Titel: |
|
|
mhm, was könnte man nu damit anfangen hrhr?
wenn die variable ganz am ende vom zugeteilten speicher liegt
also
Code: |
XXXXXXXX|YYYYY
^hier ist der speicher unseres proggis zuende
|
und fb das nicht abfängt... könnte man dann in fremden speicher rumpfuschen xD? _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 10.12.2007, 20:38 Titel: |
|
|
Gar nix, da du hier nicht mit Pointern arbeitest.
Ein Buffer-Overflow ist was anderes, als ein Overflow bei Werten.
Bei einem Buffer-Overflow wird über den eigtl. Speicher hinausgeschrieben, bei einem normalen Werte-Overflow geht der Wert einer Zahl "nur" über den gültigen/darstellbaren Bereich des Datentyps hinaus, wird deshalb auf den gegenteiligen Wert (von 255 auf 0 z.B.) gesetzt. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 10.12.2007, 21:47 Titel: |
|
|
So zählt er auch endlos
Code: | SUB subtest
DIM x AS BYTE
FOR x= 127 TO 127
print " ";x;
sleep 1
if multikey(&h01) then exit for
NEXT
END SUB
subtest
END
|
Vermutlich darf einfach MAXVAL nicht der selbe sein als der des Datentyps. _________________ Bis irgendwann...  |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 10.12.2007, 22:03 Titel: |
|
|
Es ist kein Fehler von FreeBASIC, wenn der Programmierer Brain.Exe nicht installiert hat..
..und seine Berechtigungen nicht ausreichen, um Think.Exe zu aktivieren. _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
|