![]() |
Zeigerarithmetik, "Operator ist auf diesen Operandentyp nicht anwendbar" ?
1). col:=pbyte(scandata+x+(y*pic.width))^;
2). r:=pbyte(scandata+(y*pic.width+x)*3+0)^; type MyImage = record data: pointer; width,height: dword; end; wie kann ich diese aus freepascal stammenden Konstrukte für Delphi passend umstellen? Hier die Routine in der ich das brauche:
Delphi-Quellcode:
Procedure imLoad(var pic:MyImage;name:string);
var f:file; xx,yy:word; y,x,i:dword; col,r,g,b,a:byte; NumColors:byte; pal:array[0..256] of packed record r,g,b:byte; end; scandata:pointer; l:dword; begin a:=128; assign(f,name); {$I-}Reset(f,1);{$I+} if IOresult<>0 then MyError('IM file '+name+' does''nt exist'); BlockRead(f,NumColors,1); BlockRead(f,xx,2); BlockRead(f,yy,2); AllocImage(pic,xx,yy); if NumColors>0 then begin {***** 256 Color Image *****} pal[0].r:=0;pal[0].g:=0;pal[0].b:=0; for i:=1 to NumColors do begin BlockRead(f,pal[i],3); end; getmem(scandata,pic.width*pic.height); if scandata=nil then gfxError('Unable to GetMEM'); BlockRead(f,scandata^,pic.width*pic.height,l); if l <> (pic.width*pic.height) then MyError('Corrupt IM file'); for y:=0 to pic.height-1 do for x:=0 to pic.width-1 do begin col:=pbyte(scandata+x+(y*pic.width))^; PutPixelRGBA(pic,x,y,pal[col].r*4,pal[col].g*4,pal[col].b*4,a); end; freemem(scandata); end |
AW: Zeigerarithmetik, "Operator ist auf diesen Operandentyp nicht anwendbar" ?
Zeigerarithmetik benötigt vermutlich einen Basis-Typ.
Probiere mal mit Deklaration "scandata: pbyte;" |
AW: Zeigerarithmetik, "Operator ist auf diesen Operandentyp nicht anwendbar" ?
Jupp, erstmal braucht man einen Pointer-Typen, welcher auch eine Größe besitzt und mit dem man dann echnen könnte. (Pointer ist 0 groß)
z.B. PByte Und die Pointer-Arithmetik sollte nicht deaktiviert sein. (Projektoptionen bzw. Compilerschalter) Alternativ in einen "Integer" konvertieren, damit rechnen und dann wieder zurück zu Pointer PS: Bei PWord ist es 2, also
Delphi-Quellcode:
bzw.
P + 1
Delphi-Quellcode:
entspricht einem
PWord(P) + 1
Delphi-Quellcode:
.
Pointer(NativeUInt(P) + 2)
|
AW: Zeigerarithmetik, "Operator ist auf diesen Operandentyp nicht anwendbar" ?
Ich würde es so machen
Code:
var pbLatch: pByte;
.... pbLatch:= scandata; Inc(pbLatch, x + (y * pic.width)); col:= pbLatch^; |
AW: Zeigerarithmetik, "Operator ist auf diesen Operandentyp nicht anwendbar" ?
Man kann übrigens auch auf der linken Seite casten, nicht nur rechts. (so lange es nur ein harter Speichercast ohne automatische Konvertierung ist)
Delphi-Quellcode:
EinInteger := Integer(EinPointer);
Pointer(EinInteger) := EinPointer; Inc(Integer(EinPointer), 123); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz