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:

GFX Bug oder Programmfehler?

 
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
Muttonhead



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

BeitragVerfasst am: 27.11.2011, 00:48    Titel: GFX Bug oder Programmfehler? Antworten mit Zitat

Ob es wirklich ein Bug ist weiß ich nicht!
Aber nachdem ich die Situation hier nochmal vereinfacht
ausprobiert habe und sich der Fehler doch reproduzieren läßt...

Ich erzeuge einen Screen und ein kleines Objekt.
Eine der Methoden des Objektes soll, neben anderen Sachen
ein Image erzeugen bzw. vergrößern.

Der Screen selbst ist noch nicht benutzt(beschrieben oder bemalt) worden

Jedenfalls erzeugt die Methode durch mehrmaligen Aufruf hintereinander(was so sein soll,Imagevergrößerung
ist ja nur eine Aufgabe) Fehler im vergrößerten Image!!!

Ein einfaches "PRINT" innerhalb der Methode scheint das Problem zu lösen.

Ist das ein Bug oder liegt der Fehler in den paar Zeilen hier?


Code:
screen 19,32

type test
  imgsize as integer
  img as integer ptr
  declare destructor
  declare sub MakeItBigger
end type

destructor test
  if img then imagedestroy img
end destructor

sub test.MakeItBigger
  'print'<------------------------------!!!!????
  imgsize +=50
  if img then imagedestroy img
  img=imagecreate(imgsize,imgsize,&HFFFFFF)'Weiß gefüllt
  line img,(0,0)-(imgsize-1,imgsize-1),&HFF0000,bf'Zur Kontrolle Rot auffüllen
end sub

dim as test x
print

x.MakeItBigger
x.MakeItBigger
x.MakeItBigger
x.MakeItBigger
x.MakeItBigger

put (0,0),x.img,pset
sleep





Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



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

BeitragVerfasst am: 27.11.2011, 00:57    Titel: Antworten mit Zitat

Wie wirkt sich der Fehler denn aus? Ich sehe hier unter Linux nichts ungewöhnliches, was einen gfx-Fehler unter Windows nahe legt.
Möglicherweise sorgt das PRINT für eine kleine Atempause für die Routinen; wie sieht es aus, wenn du stattdessen zwischen den Vergrößerungen ein SLEEP 1 einfügst? Meine Vermutung ist, dass hier die eine Grafikbearbeitung intern noch nicht "fertig" ist, wenn die nächste startet.


edit: 3000 happy
_________________
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: 27.11.2011, 01:02    Titel: Antworten mit Zitat

Die rote Füllfarbe durch den LINE Befehl ist nur im oberen Bereich, anstatt vollständig

Vielleicht betrifft es ja nicht TUX
happy

edit:
ein SLEEP 3000 ??? grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 27.11.2011, 01:15    Titel: Antworten mit Zitat

Das ImageDestroy zu entfernen "behebt" den Fehler auch, was wie in fast allen Fällen von "seltsamen" Gfx-Bugs ganz verdächtig nach irgendeinem Speicherzugriffsfehler riecht, nicht nach einem Fehler in der Print-Routine.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
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: 27.11.2011, 01:20    Titel: Antworten mit Zitat

Dann muß dieses Problem aber schon länger mit dabei sein... hab das Problem beim Arbeiten an meinem Achsenmodell bemerkt und auch mal mit dem 0.21 compiliert,gleiches Ergebnis
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ThePuppetMaster



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

BeitragVerfasst am: 27.11.2011, 01:46    Titel: Antworten mit Zitat

unter linux funzt es.


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



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

BeitragVerfasst am: 27.11.2011, 10:57    Titel: Antworten mit Zitat

In deinem Beispiel find ich das ergebnis unter Windows zwar verwunderlich, aber dennoch dürfte es eher daran liegen das du hier immer wieder ein Imagecreate aufrufst ohne das dieser wieder freigegeben wird...

Das mit dem destructor is zwar nett gedacht, nutzt in diesem Beispiel aber nichts... du rufst deine funktion 5 mal auf 5x imagecreate und am programende kommt erst der destructor mit 1x imagedestroy zustande (die anderen 4 werden dabei nicht mehr freigegeben)

Wird imagedestroy nach dem 'putten' bzw nach dem aufruf der sub direkt ausgeführt bleibt auch der fehler aus
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
ThePuppetMaster



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

BeitragVerfasst am: 27.11.2011, 12:45    Titel: Antworten mit Zitat

eigetnlich passt das schon, was er da macht.

das destroy hat er auch mit makeitbigger drin, und zwar in der zeile for dem imagecrate, und nicht nur im destructor.


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



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

BeitragVerfasst am: 27.11.2011, 14:59    Titel: Antworten mit Zitat

Ok, das hatte ich übersehen, hatte allerdings bei meinem Versuch so anschliessend funktioniert...

Sieht dann aber deutlich nach einem fehler in line aus...

die Variablenwerte stimmen ja und sollten auch korrekt arbeiten, interessant find ich die kleine änderung des Beispiels, das im letzten kästchen das ergebnis genauso aussieht obwohl ich eine geringere Breite angegeben habe


Code:

Sub msg(message as string)
    dim ff as integer
    ff = FreeFIle
   
    open cons for output as #ff
        print #ff, message
    close #ff
end sub


screen 19,32

type test
  imgsize as integer
  img as integer ptr
  declare destructor
  declare sub MakeItBigger
end type

destructor test
  if img then imagedestroy img
end destructor

sub test.MakeItBigger
  Dim lsize as integer
  imgsize += 50
  msg "imgsize: "+str(imgsize)
 
  if img then
      imagedestroy(img)
      img = 0
      msg "Imagedestroy"
  end if
 
  img = imagecreate(imgsize,imgsize,&HFFFFFF) 'Weiß gefüllt
  lsize = imgsize-1
  msg "lsize: "+str(lsize)

  line img,(0,0)-(lsize-10,lsize),&HFF0000,bf'Zur Kontrolle Rot auffüllen
end sub

dim as test x
print

x.MakeItBigger
x.MakeItBigger
x.MakeItBigger
x.MakeItBigger
x.MakeItBigger

put (0,0),x.img,pset
sleep



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



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

BeitragVerfasst am: 27.11.2011, 15:26    Titel: Antworten mit Zitat

EDIT:

Ein kleines Workaround scheint das Problem zu beheben:

Code:

sub ImageReSize(byval img as integer ptr, sizex as integer,sizey as integer)
  dim as integer ptr imgtmp
  imgtmp=imagecreate(sizex,sizey)
  if img then imagedestroy img
  img=imgtmp
end sub


....scheint leider auch nur verwundert

byval.... Hust... byref natürlich...


Zuletzt bearbeitet von Muttonhead am 27.11.2011, 21:20, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 27.11.2011, 20:50    Titel: Antworten mit Zitat

kurioser Fehler!
Ich vermute den Fehler auch in LINE.

Auch ein Workaround, oder?
Code:
Screen 19,32

Type test
  imgsize As Integer
  img As any Ptr
  Declare Sub MakeItBigger
  Declare Destructor
End Type

Destructor test
If img Then ImageDestroy img
End Destructor

Sub test.MakeItBigger
  Dim tmp As Any Ptr
  imgsize +=50
  tmp=ImageCreate(imgsize,imgsize,&HFFFFFF)'Weiß gefüllt
  If img Then ImageDestroy img
  img=tmp
  Line img,(0,0)-(imgsize-1,imgsize-1),&HFF0000,bf'Zur Kontrolle Rot auffüllen
End Sub

Dim As test x
x.MakeItBigger
x.MakeItBigger
x.MakeItBigger
x.MakeItBigger
x.MakeItBigger
Put(200,0),x.img,PSet

Sleep

_________________
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: 27.11.2011, 21:04    Titel: Antworten mit Zitat

@Volta:

Deine Variante scheint zu funktionieren, direkt im Code...
Hmmm... ein Lichtblick?.... mal testen lächeln

edit:

Japp das scheint ordnungsgemäß zu funktionieren... meine Sub nun auch

Ich betrachte das mal also gelöst und bedanke mich mal bei allen lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Eternal_pain



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

BeitragVerfasst am: 28.11.2011, 18:07    Titel: Antworten mit Zitat

hm.. hätte man eigentlich gleich drauf kommen können :S

ähnliche fehler entstehen auch wenn man ein bereich mit (c)allocate immer wieder neu (re)initiiert, auch da hilft dieser einfache weg über eine temp variable...
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 28.11.2011, 18:27    Titel: Antworten mit Zitat

Eternal_pain hat Folgendes geschrieben:
hm.. hätte man eigentlich gleich drauf kommen können :S

Nein, hätte man nicht, denn eigentlich sollte auch der Original-Code funktionieren. Von daher ist das keine Lösung, sondern ein Workaround für einen potentiellen Bug.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 28.11.2011, 18:48    Titel: Antworten mit Zitat

Den Bug haben wir mittlerweile an die Entwickler weitergegeben.

Eternal_pain: kannst du einen Beispielcode für den von dir genannten Fehler erstellen, dann geben wir das auch gleich weiter.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



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

BeitragVerfasst am: 28.11.2011, 21:38    Titel: Antworten mit Zitat

vom prinzip in etwa sowas...
hier kam es aber bisher zu keinem fehler, evtl. wurde es aber auch schon behoben.
Der fehler war mal vor einigen Versionen aufgetreten wenn man wie hier im beispiel
häufiger den neuen speicherbereich per reallocate der alten variable so übergab
und konnte auch durch das 'temp-workaround ' 'umgangen' werden...

Code:

dim mymem as integer ptr
mymem = callocate( sizeof(integer) )


Dim as integer i, l

do
    l = int(rnd*1000)
   
    mymem[i] = l
   
    ?mymem[i]
   
    i += 1
    mymem = reallocate( mymem, (i+1) * sizeof(integer) )
loop until asc(inkey) or (i = 100000)

deallocate (mymem)

_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
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