![]() |
Zeiger auf array
Hi, hab mal wieder ein Problem:
Ich habe mir zwei statische Arrays gebastelt und einen Pointer, der auf eines der beiden Arrays zeigen soll.
Delphi-Quellcode:
Wahrscheinlich habe ich meinen Pointer falsch deklariert oder so, aber auf jeden Fall kommt das bei raus:
var
Palette4: array[0..15] of TColor; Palette8: array[0..255] of TColor; Palette: PByteArray; Ich lasse also meinen Pointer auf eines der beiden Arrays zeigen:
Delphi-Quellcode:
Bei High(Palette) müsste dann (zumindest nach meiner Logik) 15 raus kommen, ich erhalte aber 32768.
Palette := @Palette4;
Woran kann das liegen? Wie muss ich meine Deklaration ggf. ändern? :gruebel: |
Re: Zeiger auf array
Hallo Martin,
so sieht die Deklaration von PByteArray in der Unit SysUtils aus:
Delphi-Quellcode:
High(Palette^) muß somit den Wert 32767 liefern.
PByteArray = ^TByteArray;
TByteArray = array[0..32767] of Byte; Die Obergrenzen der Arrays kannst du ja über High(Palette4) bzw. High(Palette8) abfragen, mit einer gemeinsamen Typvereinbarung wirst du wohl scheitern. Vielleicht hilft dir eine Prozedur mit einem "open array"-Parameter:
Delphi-Quellcode:
Gruß Hawkeye
procedure MachWas (const aColors: array of TColor);
begin ShowMessage (IntToStr(High(aColors))); end; MachWas (Palette4); // zeigt "15" an MachWas (Palette8); // zeigt "255" an |
Re: Zeiger auf array
Hm...
Gibt es keinen allgemeinen Pointer, mit dem man auf ein Array zeigen kann? Also ich würde gerne überall im Code einfach nur Palette:= usw. schreiben. Und je nachdem, auf welches der beiden arrays dann der Pointer zeigt (lege ich ganz am Anfang fest, z.B. bei FormCreate), dieses array soll halt auch verwendet werden... Zitat:
Hatte den Code nur nicht mehr ganz genau im Kopf... |
Re: Zeiger auf array
was spricht gegen dynamische arrays? damit würde es gehen!
Delphi-Quellcode:
type
TColorArray = array of TColor; PColorArray = ^TColorArray; var Palette4: TColorArray; Palette8: TColorArray; Palette: PColorArray; procedure TForm1.FormCreate(Sender: TObject); begin setlength(Palette4, 16); setlength(Palette8, 256); Palette := @Palette4; end; |
Re: Zeiger auf array
Ach, damit geht das?
Hm... Aber warum geht das mit dem Zeiger auf ein Array nur bei dynamischen und nicht bei statischen? ...das ist doch unlogisch! Naja gut, dann nehm ich eben zwei dynamische Arrays. Danke, übrigens!!! Hier geht es halt um Farbpaletten (4 Bit und 8 Bit) und da die Anzahl der Farben in der Palette konstant ist (16 bzw. 256 Farben), wären hier statische Arrays irgendwie logischer... Aber egal... |
Re: Zeiger auf array
Zitat:
Du mußt nur beachten, das in dynamisches Array auch eigentlich nur ein Zeiger auf seine Daten ist. |
Re: Zeiger auf array
Zitat:
|
Re: Zeiger auf array
Zitat:
Ein Array[0..3] of Byte ist zozusagen ein Record mit 4 Bytes drin, wärend ein Array of Byte ein Pointer auf eine Array-Struktur ist, welche in sich wiederum ein Record mit Integern für ElementCount (Length) und Referenzzähler, mit einem dahinterliegendem Record der nötigen Bytes.
Delphi-Quellcode:
Var D: Array of Word
S: Array[0..9] of Word; SizeOf(D) = 4 (der Pointer ist ja ein Integer, also 4 Byte) SizeOf(S) = 20 (10 * Word, also 20 Byte) |
Re: Zeiger auf array
Zitat:
Ein Zeiger auf ein statisches Array ? :gruebel: //Edit: für etwas Quellcode wäre ich dankbar... |
Re: Zeiger auf array
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 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