Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zeigerarithmetik, "Operator ist auf diesen Operandentyp nicht anwendbar" ? (https://www.delphipraxis.net/216021-zeigerarithmetik-operator-ist-auf-diesen-operandentyp-nicht-anwendbar.html)

delphifan2004 15. Okt 2024 08:45

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

DenkDirNix 15. Okt 2024 09:53

AW: Zeigerarithmetik, "Operator ist auf diesen Operandentyp nicht anwendbar" ?
 
Zeigerarithmetik benötigt vermutlich einen Basis-Typ.
Probiere mal mit Deklaration "scandata: pbyte;"

himitsu 15. Okt 2024 10:22

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:
P + 1
bzw.
Delphi-Quellcode:
PWord(P) + 1
entspricht einem
Delphi-Quellcode:
Pointer(NativeUInt(P) + 2)
.

TomyN 16. Okt 2024 17:18

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^;

himitsu 16. Okt 2024 17:21

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