![]() |
Pointer : Eine Speicherstelle weiterrücken
Moin Leute !
Hab ein Problem mit den allseits beliebten Pointern : Wie kann ich einen die in einem Pointer P gespeicherte adresse um eine Speicherstelle weiterbewegen? In der OH steht dazu :
Code:
Nun hab ich folgenden Code :
If I is an integer and P is a character pointer, then P + I adds I to the address given by P; that is, it returns a pointer to the address I characters after P. (The expression I + P is equivalent to P + I.) P ? I subtracts I from the address given by P; that is, it returns a pointer to the address I characters before P.
Delphi-Quellcode:
Geht aber nicht : [Error] INN.pas(73): Operator not applicable to this operand type
var Pinput : Pointer;
begin pinput := Pinput + 1; ich habs auch noch so probiert :
Delphi-Quellcode:
was aber auch nicht zum gewünschten Ergebniss führt : [Error] INN.pas(73): Incompatible types: 'Integer' and 'Pointer'
pinput := byte(Pinput) + 1;
Weiß jemand wie ich das Lösen könnte ? |
Re: Pointer : Eine Speicherstelle weiterrücken
Versuch es mal mit Inc. Als zweiten Parameter kannst die Schrittweite angeben, also sizeof(Integer).
|
Re: Pointer : Eine Speicherstelle weiterrücken
hmmm ...
funtioniert leider auch nicht :
Delphi-Quellcode:
inc(pinput,sizeof(byte)); //[Error] INN.pas(74): Ordinal type required
inc(pinput); //[Error] INN.pas(74): Ordinal type required |
Re: Pointer : Eine Speicherstelle weiterrücken
Problem gelöst !! :cheers:
Delphi-Quellcode:
Dankescheeen !
var pinput : pointer;
P : Pbyte; begin P := pinput; inc(P); end; |
Re: Pointer : Eine Speicherstelle weiterrücken
Also das was Du brauchst ist eine Liste
Code:
Im OnCreate musst Du nun noch die Zeiger initialisieren
type
PListe : ^TListe; TListe = record wert : integer // beliebige Variablen; next : PListe; // zeigt auf das nächste Element var Anker,help:PListe; // Anker speichert das ERSTE Element und wird NIE verändert; help durchläuft die Liste
Code:
An irgendeiner Stelle musst Du die Werte einlesen; Das geht so:new(Anker);// Reserviert Speicher für die Variable
Code:
und mit der Struktur kannst Du dann ganz locker eins hoch rutschen indem du
help:=anker; // Setzt die Hilfsvariable auf die Erste Stelle
repeat new(help.next); // Erzeugt eine neue Variable und speichert den Zeiger dieser Variable in help.next ab help:=help.next; // Jetzt rutscht man mit help in der Liste eins hoch help.wert:=2 // Hier kannst Du Daten ändern Help.next:=nil; // und setzt den neuen Nachfolger, der ja noch nicht erzeugt wurde auf 0 until fertig...
Code:
benutzt...
help:=help.next
Am Ende des Programms musst Du den Speicher noch freigeben indem Du diese Procedure mit clearanker(Anker) aufrufst
Code:
Ich hoffe das löst dein Problem...
procedure clearanker(help: PListe);
begin if help.next<>nil then clearanker(help.next); dispose(help); end; |
Re: Pointer : Eine Speicherstelle weiterrücken
oder so... :wall:
|
Re: Pointer : Eine Speicherstelle weiterrücken
Nee , Listen mag ich net so , aber troztdem danke für die Mühe !
|
Re: Pointer : Eine Speicherstelle weiterrücken
Liegt, wenn ich mich nicht irre, daran, dass der Pointer typisiert sein muss. Es wird immer um soviel byte weitergerückt, wie eine Speichereinheit des referenzierten Typs belegt. Inc(p) bewirkt also zB das "vorrücken" um vier byte falls p ein PInteger ist.
Gruß, Sebastian |
Re: Pointer : Eine Speicherstelle weiterrücken
Moin Braingrenade,
es ginge auch
Delphi-Quellcode:
inc(PByte(pinput));
|
Re: Pointer : Eine Speicherstelle weiterrücken
Ahh , das ja noch praktischer !
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 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