AGB  ·  Datenschutz  ·  Impressum  







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

Speicheradresse um eins erhöhen

Ein Thema von napsterxx · begonnen am 25. Feb 2008 · letzter Beitrag vom 26. Feb 2008
Antwort Antwort
napsterxx

Registriert seit: 18. Mär 2007
Ort: Borland
556 Beiträge
 
Delphi 7 Enterprise
 
#1

Speicheradresse um eins erhöhen

  Alt 25. Feb 2008, 17:15
Liebe Leute,
ich suche eine Prozedur mit der ich eine Speicheradresse, z.B. 00400100 um eins erhöhen kann.
Du derefernzierst p2 einmal und weißt die Adresse von i zu. Das heißt p2 (also der Zeiger auf einen Zeiger) zeigt auf den Zeiger p1 welchen du so auf i zeigen lässt.
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Speicheradresse um eins erhöhen

  Alt 25. Feb 2008, 17:22
Wenn du einen Pointer hast, kannst du ihn mit Delphi-Referenz durchsuchenInc auf die nachfolgende und mit Delphi-Referenz durchsuchenDec auf die vorherige Speicherstelle verschieben. Denk aber daran, dass das nur eingeschränkt möglich ist. D.h., du kannst mit dem Pointer nicht auf Speicherbereiche eines anderen Prozesses zugreifen.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: Speicheradresse um eins erhöhen

  Alt 25. Feb 2008, 18:03
Afaik erlaubt Delphi die Anwendung von Delphi-Referenz durchsuchenInc() und Delphi-Referenz durchsuchenDec() nicht auf untypisierte Zeiger sondern nur auf typisierte. Und dort wird die Adresse um jeweils den angegeben Wert (Default 1) multipliziert mit der Grösse des Typs erhöht bzw. verringert. Also eine PDWord wird um 4 Bytes verschoben, bei Dec(PDWord, 2) sogar um 8 Bytes.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

Re: Speicheradresse um eins erhöhen

  Alt 25. Feb 2008, 18:07
Delphi-Quellcode:
procedure IncAt(address: Cardinal);
begin
  PCardinal(address)^ := PCardinal(address)^ + 1;
end;
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Speicheradresse um eins erhöhen

  Alt 25. Feb 2008, 18:15
@Dax: Das ist nen bissl komisches Beispiel. Bei deinem Beispiel müsste man ja address die Adresse des Pointer zuweisen. Dann doch lieber so:
Delphi-Quellcode:
function inc_address(var address: pointer);
begin
  Cardinal(address) := Cardinal(address) + 1;
  result := address;
end;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#6

Re: Speicheradresse um eins erhöhen

  Alt 25. Feb 2008, 18:19
@Jens, da hast Du aber was gehörig vermischt.
Delphi-Quellcode:
procedure inc_address(var address: pointer);
begin
  Cardinal(address) := Cardinal(address) + 1;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

Re: Speicheradresse um eins erhöhen

  Alt 25. Feb 2008, 18:25
Wenns um sowas wie Schleifen und Zugriff auf einzelne Bytes geht:

Delphi-Quellcode:
function DumpMem(P: Pointer; Len: Cardinal): String;
var
  I: Cardinal;
begin
  for I := 0 to Len do
  begin
    Result := Result + IntToHex(PByte(Cardinal(P) + I)^, 2);
  end;
end;
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: Speicheradresse um eins erhöhen

  Alt 26. Feb 2008, 00:07
Zwar mal davon abgesehen, dass Cardinal() der richtige Typ wäre für den Typecast, aber afaik schmeisst Delphi dann eine Warnung bei der Addition von wegen Kombination von vorzeichenlosen und vorzeichenbehafteten Datentypen. Dadurch zwingt Delphi einem (leider) bei solcher Adressarithmetik zu der vorzeichenbehafteten Rechnung.

@Zacherl: Da er bei deiner Lösung immer wieder vom Pointer neu losrechnet (um i drauf zu rechnen), wäre es performanter einfacher eine lokale Variable vom Typ PByte anzulegen und dieser vor der Schleife den übergebenen Pointer zu übergeben. In der Schleife reicht dann einfach ein Delphi-Referenz durchsuchenInc().
  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 12:51 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