SpriteOutput(hSprite_bg)

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

SpriteOutput(hSprite_bg)

Beitrag von Toshy »

Ich bin totaler Anfänger bei Grafiken und bin auf folgendes gestoßen:

Code: Alles auswählen

Debug SpriteOutput(hSprite_bg) 
Debug SpriteOutput(hSprite_bg) 
Debug SpriteOutput(hSprite_bg) 
Anzeige:
4359612
0
0
Noch hab ich keinen Code den ich hier funktionsfähig Posten kann, aber der Fehler geschieht ständig.
Mich hat immer gewundert warum der Debugger meckert das der "output" NULL ist obwohl die Debuganzeige vorher einen Wert anzeigt.
Warum setzt "spriteoutput()" dort irgend etwas auf NULL?

Toshy

[edit]

Code: Alles auswählen

InitSprite()
hwindow_map.l = OpenWindow(#PB_Any,0,0,410,310,"",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
hwindowScreen_map.l = OpenWindowedScreen(WindowID(hwindow_map),5,5,320,300,0,0,0)
hSprite_bg.l = CreateSprite(#PB_Any,320 ,300)
Debug "hSprite_bg = " + Str( hSprite_bg )
Debug SpriteOutput(hSprite_bg) 
Debug SpriteOutput(hSprite_bg) 
Debug SpriteOutput(hSprite_bg) 
Debug "hSprite_bg = " + Str( hSprite_bg )
Ausgabe:
hSprite_bg = 3944384
4345368
0
0
hSprite_bg = 3944384
1. Win10
PB6.1
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Du kannst nur einmal ...Output() verwenden bis zum nächsten StopDrawing().
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Das hab ich bemerkt, aber WARUM?
Das ist doch unlogisch und sieht eher nach einem Fehler aus. Außerdem steht davon NICHTS in der Hilfe.

Überall sonst wenn man eine "PBid" hat oder auch andere Funktionen oder apis mit denen man ein "Handle" erhält oder andere Dinge kann man selbstverständlich mit jeder Anfrage rausbekommen was "da drinn steht" bzw. das Ergebniss ist.

SpriteOutput gib hier nur die ID zu einem Sprite raus. Das Sprite besteht nach der Abrage noch und dann müßte normal auch Spriteoutput unbegrenzt funktionieren.
Das wäre ja als ob SpritID oder eines der anderen ....ID() Funktionen immer nur einmal Funktionieren würde.

Für mich sieht das bisher nach einem ungewollten Fehler aus /Bug aus.
Das Verhalten ist absolut unlogisch.

Und falls es doch gewollt wäre, so müßte so eine krasse Ausnahme UNBEDINGT in der Hilfe stehe.
1. Win10
PB6.1
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Das ist gewollt, weil in dem Befehl SpriteOutput/ImageOutput bereits ein Speicherbereich bzw ein DeviceContext reserviert wird, den man mit StopDrawing wieder löscht. Das verhindert unnötige Speicherlecks.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Davon abgesehen ist das kein PB-"Bug", sondern ein Windows-"Bug"... :wink:

//EDIT: Hier unter Linux krieg ich übrigens keine Nullen raus, da krieg ich jedes Mal dasselbe Handle zurück von SpriteOutput(). Das liegt aber wie gesagt am Betriebssystem, nicht an PureBasic.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Kann ich kaum glauben.
Es hat ja nix mit Speicherleckt oder reservierten Speichern zu tun, wenn man nach einem Handle "fragt" so wie bei X anderen Funktionen. Wenn Windows einen Fehler macht, dann könnte man es testen wenn man die entsprechende WIndowsApi aufruft. Welche wäre das?

Aber gerade da es unter Linux KEINE NULLEN ausgibt, vermute ich das es doch ein BUG ist. Falls nicht, dann hätte Fred das wie an anderen Stellen in die Hilfe aufgenommen. Oder die Hilfe ist hier halt noch "fehlerhaft".

Also, gibt es dazu eine WindowsApi?

Gruß
Toshy
1. Win10
PB6.1
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Das Problem hier ist PureBasic gibt mit "[...]Output()" einen Pointer auf diese Struktur zurück:

Code: Alles auswählen

  Structure DrawingInfoStruct
    Type.l    ; Type of the DC
    Window.l  ; Window associated to the DC (if any)
    DC.l      ; DC (Display Device Context)
    ReleaseProcedure.l ; Address to a procedure to release the DC when StopDrawing() is called
    PixelBuffer.l      ; Address of the memory pixel buffer (DirectX)
    Pitch.l            ; Bytes per line (DirectX)
    Width.l
    Height.l
    Depth.l
  EndStructure 
Dabei geht es unter Windows immer über DC und nicht über PixelBuffer (Unter Linux gibts kein DC, nur PixelBuffer). Nun will man Speicherlecks vermeiden, weil ReleaseDC() nur in StopDrawing aufgerufen wird.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten