Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Grauton Kalkulation

  Alt 27. Mär 2012, 16:14
Danke!

Zitat:
UINT* ist nichts anderes als ein PCardinal .
Mein problem ist hier aber das ich einen pointer(ptPixels) so wie hier in C++
nicht einfach auf ein Array in Delphi auslegen kann.
Wenn es ein packed Array ist, kannst du den Pointer auf das erste Element des Arrays nehmen. Oder du schreibst den Code um und verwendest statt des Pointers einen Index, den du jedes mal inkrementierst, wenn im Originalcode der Pointer inkrementiert wird. Dann musst du immer über den Index auf das Element zugreifen.

Z.B.:
Code:
UINT* pixel;
...

++pixel; // rückt zum nächsten Pixel vor
(*pixel) = 0x00ff0000; // färbt das Pixel rot
=>
Delphi-Quellcode:
var
  Pixels: array of cardinal;
  PixelIdx: integer;

PixelIdx := 0;

...

inc(PixelIdx);
Pixel[PixelIdx] := $00ff0000;
oder:
Delphi-Quellcode:
var
  Pixels: packed array of cardinal;
  Pixel: PCardinal;

Pixel := @Pixels[0];

...

inc(Pixel);
Pixel^ := $00ff0000;
Was bedeutet inline ? Noch nie gehört bzw. verwendet.
Bedeutet nur, dass der Compiler den Code an der Stelle des Funktions-Aufrufs direkt einfügt, statt wie üblich einen Funktionsaufruf zu generieren, der etwas Overhead generiert, weil Daten auf den Stack kopiert werden müssen etc.. Ist nicht nötig, aber kann manchmal bemerkbaren Einfluss auf die Performance haben, wenn kurze Funktionen sehr häufig aufgerufen werden.

Ich habe inline hier aber in erster Linie verwendet, weil Inline-Funktionen in Delphi am ehesten das Equivalent zu Macros in C darstellen – Macros werden nämlich ebenfalls vom C-Compiler vor dem eigentlichen Kompiliervorgang „expandiert“, also direkt an die Stelle im Code eingefügt. Macros sind eben keine Funktionen, sondern halt „Macros“. Wenn du in C ein Macro „aufrufst“, ist das für den Compiler quasi so, als hättest du den Code direkt an der Stelle mit Copy&Paste eingefügt. Und dem kommen Inline-Funktionen halt am nächsten.

Hoffe es ist klar

[edit]
Soweit ich mich erinnere, habe ich den Grauwert immer durch

Delphi-Quellcode:
Function GetGray(color : TColor) : TColor;
begin
  v := (GetRValue(color) + GetGValue(color) + GetBValue(color)) div 3;
  Result := RGB(v,v,v);
end;
Das ist die „primitive“ Variante, aber dabei wird nicht berücksichtigt, dass z.B. Grün bei gleichem Wert heller wirkt als Blau.
[/edit]

Geändert von Namenloser (27. Mär 2012 um 16:16 Uhr)
  Mit Zitat antworten Zitat