 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 28.12.2005, 21:42 Titel: Variable zählt mit |
|
|
Hi...
Ich habe hier einen Codeschnippsel, der in FB0.14 seltsam läuft:
screen 14,8,2,0
(...)
dim ColUsed(0 to 255) as Uinteger
(...)
for Y=0 to Size2Height*2 step 2
for X=0 to Size2Width*2 step 2
P=Point(X,Y)
ColUsed(P)+=1
next X
next Y
früher hatten die variablen folgende werte:
size2width: 320
size2height: 200
danach hatte size2height den wert 721!
Was mache ich falsch?
denn wenn ich entweder die P=... oder ColUsed(P)... Linie entferne, kommt der falsche wert nicht! _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 29.12.2005, 00:13 Titel: |
|
|
Hast du's schon mit der v0.15 versucht? die is inzwischen stable.
Bei mir funzt der Snippet unter v0.16b auf jeden fall, solange ich 32 und 24 verwende, bei den zehnfachen Werten hängt sich das Prog auf...
Interessant: Bau mal nach For x =... das ein:
? Using "### ###"; x; y
man könnte meinen, dass x und y zw. 0 und 720 lägen... anyway, bei mir kommt x auf über 10000....
Strange... _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 29.12.2005, 09:00 Titel: |
|
|
gfxlib.txt hat Folgendes geschrieben: | Mode 14: 320x240
40x30 text format, 8x8 character size.
Assignment of up to 256K colors to any of 256 attributes. |
Code: | size2width= 320
size2height= 200
|
hier eingesetzt:
Code: | for Y=0 to Size2Height*2 step 2
for X=0 to Size2Width*2 step 2 |
gibt
Code: | for Y=0 to 400 step 2
for X=0 to 640 step 2 |
Wieso fragst du die Farbe eines nicht vorhandenen bereiches ab?
So geht es:
Code: | screen 14,8,2,0
dim ColUsed(0 to 255) as Uinteger
size2width= 319
size2height= 239
for Y=0 to Size2Height
for X=0 to Size2Width
? x;y;size2width;size2height
P=Point(X,Y)
ColUsed(P)+=1
next X
next Y
?
? size2width
? size2height
sleep |
Ich Tippe mal auf den klassischen Bufferoverflow, du greifst wegen falsch dimensionierung auf den nächsten, anders benutzen Speicherbereich zu.
Bildlich:
Du hast eine Blattpapier, dort sind zwei Listen drauf etwa so:
Liste1:-Apfel
---------Birne
---------Pflaume
Liste2:-Hund
---------Katze
---------Fisch
Du sagst nun, du willst den Vierten eintrag auf Liste 1, dieser Existiert nicht, aber wenn man vom Begin der Liste 1 auf Vier zählt (was der Computer eben macht) bekommt man "Hund", obwohl er auf der anderen Liste steht die nicht gemeint war.
Kurz zum beweisch:
Code: | dim liste1(1 to 3) as string*8
dim liste2(1 to 3) as string*8
liste1(1)="Apfel "
liste1(2)="Birne "
liste1(3)="Pflaume"
liste2(1)="Hund "
liste2(2)="Katze "
liste2(3)="Fisch "
for i=0 to 6
? liste1(i)
next i
sleep |
nicht Perfekt, aber es zeigt was ich meine. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 29.12.2005, 14:54 Titel: |
|
|
Ich hab den screen nur nachträglich ins forum eingefügt (der stand im original-code nämlcih viel weiter oben), und hab 14 statt 17 oder 18 eingetippt. das kann es also nicht sein  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 29.12.2005, 15:14 Titel: |
|
|
füg mal
ein, damit du bei ColUsed(P)+=1 keine Speicherstellen ungewollt veränderst. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 29.12.2005, 15:36 Titel: |
|
|
das ist ja kein direkter screen-zugriff. der ganze code sollte eigentlich nur zählen, wie oft die farben auf screen benutzt wurden. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 29.12.2005, 15:53 Titel: |
|
|
ich dachte da auch nicht an das Überschreiben der Farbe des Pixels,
sondern an das Überschreiben von Variableninhalten wenn P mal größer als 255 werden sollte!
jojo hat Folgendes geschrieben: | denn wenn ich entweder die P=... oder ColUsed(P)... Linie entferne, kommt der falsche wert nicht! |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 29.12.2005, 17:53 Titel: |
|
|
gfxlib.txt hat Folgendes geschrieben: | Mode 17: 640x400
80x25 or 80x50 text format, 8x16 or 8x8 character size.
Assignment of up to 256K colors to any of 256 attributes.
Mode 18: 640x480
80x30 or 80x60 text format, 8x16 or 8x8 character size.
Assignment of up to 256K colors to any of 256 attributes. |
So geht es:
Code: | screen 18,8,2,0
dim ColUsed(0 to 255) as Uinteger
size2width= 319
size2height= 200
for Y=0 to Size2Height*2 step 2
for X=0 to Size2Width*2 step 2
? x;y;size2width;size2height
P=Point(X,Y)
ColUsed(P)+=1
next X
next Y
sleep |
Code: | screen 18,8,2,0
pset(640,400),6
pset(639,400),4
sleep |
Den Gelben Pixel bei 640,400 wirst du nicht sehen, weil 640 ausserhalb des Bildes ist, der Computer Rechnet von Null aus und nicht wie du von 1 ...
Das Pixel oben Links hat 0,0 bei screen 18, der Pixel unten Links hat 639,479 weil Null eben auch eine Zahl ist ...
Kurz: Ich bin noch immer der Meinung das meine Erste Diagnosse gültig ist, wenn auch nun mit anderem Vorzeichen ... _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 29.12.2005, 21:16 Titel: |
|
|
`dass der fehler davon kommt, glaub ich nicht, ganz abgesehen davon, dass sich ja diese variable nicht anpassen DARF!
denn wenn ich Pset(x,Y) mache, und X oder Y ist außerhalb des screens, darf sich diese variable doch nicht anpassen.. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 30.12.2005, 10:15 Titel: |
|
|
Code: | screen 18,8,2,0
dim ColUsed(0 to 255) as Uinteger
size2width= 320
size2height= 200
for Y=0 to Size2Height*2 step 2
for X=0 to Size2Width*2 step 2
? x;y;size2width;size2height
P=Point(X,Y)
ColUsed(P)+=1
next X
next Y
sleep |
Probier's aus!
Die letzte Ausgabe wird 640 0 320 200 sein, dann ist das Programm abgeschossen.
Ein Bitte: Probier das was die Leute sagen einfach mal aus!
Vielleicht haben sie recht!
Und wenn du schon ein Beispiel bringst, dann achte darauf das es mit dem eigentlichen Problem übereinstimmt (stichwort andere Bildschirm Modus)...
Es ist zwar nicht logisch, wieso ein point(x,y) ausserhalb des Bildes einen Überlauf erzeugt (ich verstehs selber nicht ganz), aber Freebasic ist halt nicht Fehlerfrei! Und solch ein kleiner Workaround, das man nur das abfragt was existiert ist aber beim besten Willen nicht schlim!
Probiers aus, wenn geht ist gut (davon gehe ich aus) und wenn nicht, naja ... _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 30.12.2005, 12:05 Titel: |
|
|
Hi Michael,
das ist kein Bug in FB.
An deinem Programm kann man das gut testen.
füg mal ein, wie ich oben schon geschrieben habe.
Wenn P einen Wert >255 erhält verändert 'ColUsed(P)+=1' irgenwo im Speicher einen Wert, da FB nicht überprüft ob die Grenzen eines Array eingehalten werden. Das muss der Progger machen, durch 'Dim P As UByte' stellst du das sicher. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 30.12.2005, 15:51 Titel: |
|
|
Dein Workaround ist geht auch, gib ich zu.
Andere vorschlag basierend auf diesem Programm:
Code: | screen 18,8,2,0
P=Point(640,20)
? P
sleep |
(die Ausgabe ist -1)
Code: | screen 18,8,2,0
dim ColUsed(-1 to 255) as Uinteger
size2width= 320
size2height= 200
for Y=0 to Size2Height*2 step 2
for X=0 to Size2Width*2 step 2
? x;y;size2width;size2height
P=Point(X,Y)
ColUsed(P)+=1
next X
next Y
sleep |
Offensichtlich ist das Problem, das FB bei einem nicht Vorhanden Punkt, den Rückgabe Wert -1 liefert, das Problem lässt sich wie festgestellt auf 3 Arten lössen:
1. (volta Idee)
Die Variabel die den Rückgabe wert speichert als UByte wählen. Mit dem Nachteil, das nicht vorhandene Pixel als Farbe 255 gezählt werden.
2. (Meine Erste Idee)
Die nicht Vorhandenen Pixel nicht abfragen.
3. (Meine Zweite Idee)
Das Array, das das Resultat speichert von -1 her beginnen lassen. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 30.12.2005, 22:30 Titel: |
|
|
4. (meine idee)
einfach nicht "über den rand" zählen lassen
5. (auch meine idee)
ein neues system für dieses code-abschnitt verwenden.
das system wird im janaur in meinem rle-kompressionsprogramm "Size²" für Freebasic auf www.saga-games.de.ms veröffnetlicht. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
|
|
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.
|
|