AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Liegt bei array of Werte hintereinander?

Ein Thema von rowkajjh · begonnen am 10. Jan 2006 · letzter Beitrag vom 10. Jan 2006
Antwort Antwort
rowkajjh

Registriert seit: 9. Jan 2006
38 Beiträge
 
#1

Liegt bei array of Werte hintereinander?

  Alt 10. Jan 2006, 15:25
Hallo,

vielleicht erinnert sich noch einer an mein gestriges Problem. Egal, ich habe es jetzt so gelöst:

Delphi-Quellcode:

type TLayer = array of double; //Feld von doubles
type TMap = array of TLayer; //Feld von Zeigern

FMap : TMap;

Function TImgProc.Min(map : Integer) : double;
var
   x,y,line: Integer;
   lsrc : pDouble;
begin
     Result := 99999999.9;

     for y := 0 to FHeight-1 do
     begin
          lsrc := @FMap[map, FWidth*y];
          line := FWidth*y;
          for x := line to line+FWidth-1 do
          begin
            //if(Result > lsrc^) then Result := lsrc^; // <-- schnelle Version
            //Inc(lsrc); // <--°

            if(Result > FMap[map, x]) then Result := FMap[map, x]; // <-- sichere ? Version
          end;
     end;
end;
Der Zugriff über den Pointer (lsrc := @FMap[map, FWidth*y] ist schneller, aber darf man sowas? Es ginge ja nur, wenn sichergestellt ist, daß bei FMap (also array of array of double) der Speicher hintereinander allokiert wurde.

Vielen Dank für Hilfe
Tschau!
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Liegt bei array of Werte hintereinander?

  Alt 10. Jan 2006, 15:34
Natürlich ist es so. Ein Array ist ein simpler Datentyp, die Indizierung der Elemente beruht auf Pointerarithmetik. Von daher machts keinen Sinn, die Werte nicht an einem Stück hintereinander abzulegen
  Mit Zitat antworten Zitat
rowkajjh

Registriert seit: 9. Jan 2006
38 Beiträge
 
#3

Re: Liegt bei array of Werte hintereinander?

  Alt 10. Jan 2006, 15:56
Zitat von Dax:
Natürlich ist es so. Ein Array ist ein simpler Datentyp, die Indizierung der Elemente beruht auf Pointerarithmetik. Von daher machts keinen Sinn, die Werte nicht an einem Stück hintereinander abzulegen
Danke. Ich wollt' ja nur sicher sein.

Was mir noch ein bissel Bauchschmerzen macht ist dieses:

Delphi-Quellcode:
lsrc := @FMap[map, FWidth*y];
for x := 0 to FWidth-1 do
begin
 if(Result < lsrc^) then Result := lsrc^;
 Inc(lsrc);
end;
Nach dem letzten Durchlauf zeigt ja lsrc durch das Inc auf Speicherplatz, der mir garnicht gehört? Macht das was? Kann man die for-Schleife irgendwie "besser" aufbauen, damit das nicht passiert?

Danke und Tschau - Robert
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#4

Re: Liegt bei array of Werte hintereinander?

  Alt 10. Jan 2006, 17:08
Das ist völlig egal, solange du nicht darauf zugreifst.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Liegt bei array of Werte hintereinander?

  Alt 10. Jan 2006, 20:41
Ansonsten könntest du nach Delphi Syntax noch für Sicherheit in der Zukunft sorgen, wenn du einfach die beiden Arrays so definierst:

Delphi-Quellcode:
Type
  TLayer = packed array of double; //Feld von doubles
  TMap = packed array of TLayer; //Feld von Zeigern
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Liegt bei array of Werte hintereinander?

  Alt 10. Jan 2006, 21:19
Nach meinen kurzen Tests ist bei mir folgender Code noch schneller:
Delphi-Quellcode:
Function TImgProc.Min(map : Integer) : double;
var
   x,y,line: Integer;
   lsrc : TLayouer;
begin
     Result := 99999999.9;
     lsrc := fmap[map];
     for y := 0 to FHeight-1 do
     begin
          line := FWidth*y;
          for x := line to line+FWidth-1 do
          begin
            if(Result > lsrc[x]) then Result := lsrcp[x];
          end;
     end;
end;
Also, statt Pointeraddition ein Array. Matrizen sind dann wieder langsamer, da bei der Adressierung eine Multiplikation involviert ist.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz