Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Seltsame Invalid pointer operation


catweasel - Fr 06.06.14 18:19
Titel: Seltsame Invalid pointer operation
Hi,

Ich bin gerade dabei mir eine Komponente für TGA files zu schreiben.
Irgendwie hakt es aber noch ein wenig. Der Quellcode ist angehängt.

Es passiert nun folgendes:

Ich lade das TGA, verändere es, zeichne es, zerstöre das Objekt und beende die Anwendung. Resultat: EInvalidPointerExcepion.
Wenn ich das TGA nur lade und zeichne, dann klappt alles wunderbar. Aber sowie ich einen "Schreibzugriff" mache geht es schief.
Was mich ein wenig verwirrt: Nach einem schreibzugriff funktioniert erstmal alles super. Wenn man neu zeichnet sieht man die Veränderung und auch beim zerstören des Objekts gibts keine Fehlermeldung. Die kommt erst wenn man die Anwendung schliessen will,
gefolgt von dem "Runtime error 217". :x

Ich bin nun nicht all zu sehr bewandert mit Zeigern, aber der Lesezugriff (GetPixel) klappt ja und das zeigerverschieben beim Schreibzugriff (SetPixel) ist ja identisch.

Vielleicht kann sich das mal jemand anschaun. Ist vermutlich recht trivial (für jemand für den Zeiger Routine sind).

Eine Sache noch: Wie müsste ich das machen wenn ich gleich einen Zeiger des Recordtypes nehme, kann ich kann nicht mit Indices auf die einzelnen Werte zugreifen, anstelle von den ganzen "inc(p)" :?:


Vielen Dank schonmal im Voraus :)

Cheers,
Catweasel


jaenicke - Fr 06.06.14 18:35

Bei mir kommt da kein Fehler (außer ich drücke doppelt auf den Knopf zum Freigeben, wobei das ja klar ist). :nixweiss:

Der Zugriff via Canvas.Pixels ist extrem langsam... besser ist eine TBitmap und ScanLine. Wenn du die dann anzeigen willst, kannst du diese ja in einem Rutsch anzeigen (Canvas.Draw, ...).


catweasel - Fr 06.06.14 19:35

Hi,

Ich weiss das Canvas.Pixels sehr langsam ist. Das ist ja nur zu Testzwecken gedacht. :P
Später werde ich die Grafik selbst nirgendwo hin zeichnen. Der Datenzeiger wird später öffentlich.
Im Endeffekt wird das mal eine Textur für OpenGL werden :D

Ich habe das ganze mal ausserhalb der IDE laufen lassen. Hier bekomme ich nun beim beenden die Windows Meldung vom Typ
"Anwendung Tgatest.exe funktioniert nicht mehr. Online Lösung suchen, Schliessen, Debuggen".
Wenn ich auf Schliessen klicke, kommt wieder der "Runtime error 217". :?

Da das ja nur auftritt wenn ich in die Daten schreibe und ich das als Textur nur "lesend" brauche wäre es eigentlich egal das ich die Textur nicht verändern kann. Andererseits könnte man so schön Texturen aus verschiedenen channels erstellen (So Material editor mäßig). :)


Cheers,
Catweasel


mandras - Sa 07.06.14 00:03

In der UTGAImageClass.pas müssen die Zeilen 66 und 123 wie folgt sein:

Y := FHeight-Y-1;

(das "-1" fehlte)


catweasel - Sa 07.06.14 00:24

Wow Danke :) In der Tat. So ist es immer um eine zeile danebengegangen.
Das funktioniert nun super :D

Anbei eine neue Version: Der Fehler von oben ist behoben. Der Zeigerzugriff läuft jetzt direkt über den record. Meine TGA Klase hat jetzt auch eine ScanLine funktion.

Eigentlich hatte ich das nicht vor, aber jetzt denke ich daran eine SaveToFile() Prozedur zu schreiben.
Das Lesen war ja noch recht einfach :wink: :wink:


Cheers,
Catweasel