AGB  ·  Datenschutz  ·  Impressum  







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

Zeiger auf array

Ein Thema von Martin K · begonnen am 12. Mai 2006 · letzter Beitrag vom 15. Mai 2006
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: Zeiger auf array

  Alt 13. Mai 2006, 16:51
Zitat von Dax:
Zitat von Martin K:
Ja und wie kann ich das realisieren:
Ein Zeiger auf ein statisches Array ?
Hast du in deinem ersten Post doch schon vorgemacht^^
Ja natürlich, aber da hatte ich doch das Problem, dass die Länge des Arrays nicht richtig war.
Der Höchstwert bei meinem Pointer auf das Array war immer 32767, obwohl das Original-Array (auf das mein Pointer zeigt) viel kürzer war (der Höchstwert war 15).

Wie kann ich also einen "richtigen Pointer" auf ein statisches Array machen, bei dem auch die Länge mit der des Original-Arrays übereinstimmt?

Mit PByteArray (erster Post) ging es ja nicht...
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#12

Re: Zeiger auf array

  Alt 13. Mai 2006, 17:52
Das mit der Länge liegt doch daran, daß in einem statischen Array keine Länge gespeichert wird, also es ist da unmöglich die Länge rauszubekommen.

Schau doch einfach mal in den generierten ASM-Code rein ... bei den Statischen Arrays wird LENGTH und HIGH nicht über eine Funktion ermittelt, sondern der Wert ist hardgecodet.


Entweder du nimmst 'nen Record, wo die Länge mit eingetragen wird, oder halt dynamische Arrays, welche ja eine Längenangebe mit integriert haben.

Beispiel für die Recordvariante:
Delphi-Quellcode:
Palette4 = packed Record
  Len: Integer;
  Data: Array[0..15] of Irgendwas;
End;
Palette4 = packed Record
  Len: Integer;
  Data: Array[0..255] of Irgendwas;
End;
dann mußt du halt einfach Len ganz am Anfang auf 16/256 setzen.

Dann kannst du damit über einen Pointer auf alles zugreifen
Delphi-Quellcode:
PaletteX = packed Record
  Len: Integer;
  Data: Array[0..255] of Irgendwas; // für 255 mindestendens den größtmöglichen Wert
End;
PPaletteX = ^PaletteX;
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#13

Re: Zeiger auf array

  Alt 13. Mai 2006, 18:03
Ja, ok das hätte ich mir so auch selber basteln können.

Nö, ich nehm dann einfach zwei dynamische Arrays.
Dann brauch ich ja am Anfang einfach nur:
Delphi-Quellcode:
SetLength(Palette4, 16);
SetLength(Palette8, 256);
zu setzen.


Zitat von himitsu:
Das mit der Länge liegt doch daran, daß in einem statischen Array keine Länge gespeichert wird, also es ist da unmöglich die Länge rauszubekommen.
Komisch:
Delphi-Quellcode:
var test: array[0..15] of Irgendwas;
{...}
ShowMessage( IntToStr(Length(test)) ); <-- hier bekomme ich '16' angezeigt!!!
Das funzt!!!

Nur bei einem Pointer auf das Array klappts nicht mehr...
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#14

Re: Zeiger auf array

  Alt 13. Mai 2006, 18:10
Zitat:
Zitat von himitsu:
Das mit der Länge liegt doch daran, daß in einem statischen Array keine Länge gespeichert wird, also es ist da unmöglich die Länge rauszubekommen.
Komisch:
[...]
Öhm... Lies dir bitte mal himitsus zweiten Abschnitt und nicht nur den ersten durch.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#15

Re: Zeiger auf array

  Alt 13. Mai 2006, 18:20
Den hier?
Zitat von himitsu:
Schau doch einfach mal in den generierten ASM-Code rein ... bei den Statischen Arrays wird LENGTH und HIGH nicht über eine Funktion ermittelt, sondern der Wert ist hardgecodet.
Was heißt denn 'hardgecodet' ?
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#16

Re: Zeiger auf array

  Alt 13. Mai 2006, 18:31
Stimmt, wenn dann muss es schon "hartgecodet" heißen .
"Hartgecodet" bedeutet, dass der Compiler deinen Length-Aufruf einfach statisch durch die obere Grenze des Arrays ersetzt. Bei Pointern kann er das schlecht machen, da dort ja diese Grenze dynamisch ist.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Zeiger auf array

  Alt 13. Mai 2006, 18:43
Egal ob obere Grenze (High) oder Länge (Length) einens Array.
Das geht also beides nicht bei Pointern auf ein statisches Array sondern nur beim Aufruf des Arrays selbst???
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#18

Re: Zeiger auf array

  Alt 15. Mai 2006, 13:03
genau, denn woher sollte er denn wissen wie lang das Array ist, auf das der Pointer zeigt ... im statischen Array jedenfalls wird nirgends die Länge gespeichert.

Das geht höchstens, wenn du den Pointer auf ein bestimmtes Array setzt:
Delphi-Quellcode:
Type A = Array[0..15] of Irgendwas;
  P = ^A;
Aber dann zeigt Length(P^) immer das an, auf was das Array A eingestellt ist und nicht das, auf was P wirklich zeigt.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 23: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