AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Pointer auf dynamisches Array

Ein Thema von Flips · begonnen am 17. Dez 2006 · letzter Beitrag vom 14. Jan 2010
Antwort Antwort
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#1

Pointer auf dynamisches Array

  Alt 17. Dez 2006, 14:39
Hi.

Habe folgendes Problem und folgenden Code:
Delphi-Quellcode:
type MyRec = record
  feld1 : integer;
  feld2 : TColor;
end;

type TMyRecArray = array of MyRec;
     PMyRecArray = ^MyRecArray;

var PointerAufDasArray: PMyRecArray;
[...]
SetLength(PointerAufDasArray^,10);
Sobald der Ablauf bei SetLength angelangt ist geht gar nichts mehr.
Mache ich es so, dann gehts(sehr unschön :-/ ):
Delphi-Quellcode:
var
  NormaleVariable : TMyRecArray;
  PointerAufDasArray : PMyRecArray;
[...]
SetLength(NormaleVariable,10);
PointerAufDasArray := @NormaleVariable;
Wieso geht die erste Möglichkeit nicht???

MfG
Flips
Philipp F.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Pointer auf dynamisches Array

  Alt 17. Dez 2006, 14:42
Probiers mal mit nem untypisierten Pointer und einem anschließenden Cast auf deinen Array-Typ.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#3

Re: Pointer auf dynamisches Array

  Alt 17. Dez 2006, 14:51
Gibt es überhaupt einen Grund, warum du n Pointer auf n dyn. Array haben willst? N dyn. Array is nämlich schon n Pointer, du hast also n Pointer auf n Pointer auf n Array...

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

Re: Pointer auf dynamisches Array

  Alt 17. Dez 2006, 14:54
Delphi-Quellcode:
type MyRec = record
  feld1 : integer;
  feld2 : TColor;
end;

type TMyRecArray = array of MyRec;
     PMyRecArray = ^MyRecArray;

var PointerAufDasArray: PMyRecArray;
New(PointerAufDasArray);
SetLength(PointerAufDasArray^,10);
Müsste so gehen. Aber wie gesagt unnötig, da ein dynamisches Array nur ein Pointer auf das erste Element eines "statischen" Arrays ist.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Pointer auf dynamisches Array

  Alt 17. Dez 2006, 14:56
Delphi-Quellcode:
type MyRec = record
  feld1 : integer;
  feld2 : TColor;
end;

type TMyRecArray = array of MyRec;
     PMyRecArray = ^MyRecArray;

var PointerAufDasArray: PMyRecArray;
[...]
SetLength(PointerAufDasArray^,10);
Ich weiß zwar nicht ob dus nicht nur vergessen hast hinzuschreiben... Aber wenn du dir nur ne PMyRecArray Variable machst und dann das Array mit SetLength verändern willst.... ehm welches Array?
Ist der Pointer nicht vielleicht noch nil? Weil dann is das ja kein Wunder.. Wenn der Pointer auf kein Array zeigt kannste da auch nix mit SetLength machen^^
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#6

Re: Pointer auf dynamisches Array

  Alt 17. Dez 2006, 14:59
Danke für die schnelle Antwort, ich hoffe ich habs richtig verstanden.

Wenn ich das ganze so mache:
Delphi-Quellcode:
var
  MyPointer : Pointer;
[...]
New(MyPointer)
SetLength(PMyRecArray(MyPointer)^,10);
MyPointer := nil;
Dispose(MyPointer);
Dann hat es den selben Effekt.

@r2c2:
Mhhh das ein dyn. Array sowieso schon ein Pointer ist wusst ich nicht
Ich dachte mir nur das ich mit Pointern arbeiten soll weil das schon große Arrays werden und ich die Performance brauch und weil ich gehört habe, dass das Arbeiten mit Pointern schneller sein soll.
@Dax: Mom ich teste mal^^

Schreibt doch ma ned so schnell, immer wenn ich meinen post abschicken will werd ich drauf aufmerksam gemacht, dass es wieder neue gibt
Philipp F.
  Mit Zitat antworten Zitat
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#7

Re: Pointer auf dynamisches Array

  Alt 17. Dez 2006, 15:02
Ok, nachdem der Code von Dax geht (dankeschön) und ihr mich netterweise über dynamische Arrays aufgeklärt habt, löse ich nun mein Problem in dem ich ganz normal das dynamische Array benutze.
Wiedermal was gelernt
Philipp F.
  Mit Zitat antworten Zitat
Benutzerbild von MisterNiceGuy
MisterNiceGuy

Registriert seit: 1. Jul 2003
Ort: Mannheim
919 Beiträge
 
Delphi 7 Personal
 
#8

Re: Pointer auf dynamisches Array

  Alt 13. Jan 2010, 23:47
Wie greife ich denn dann hier auf ein Element des Arrays zu?
Jonas
Wenn mich jemand sucht, ich bin im Kühlschrank!

Informationen über das Duale Studium
www.jofre.de
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Pointer auf dynamisches Array

  Alt 14. Jan 2010, 08:40
Wie schon gesagt wurde ... wozu soll sowas gut sein?

Ein dynamisches Array ist schon ein Pointer.

Delphi-Quellcode:
var
  MyPointer : Pointer;

New(MyPointer)
...
SetLength(PMyRecArray(MyPointer)^, 10);
PMyRecArray(MyPointer)^[i]
...
// MyPointer := nil; // hier hatte Flips ein Speicherleck erzeugt
PMyRecArray(MyPointer)^ := nil; // so Richtig
// SetLength(PMyRecArray(MyPointer)^, 0); // oder so
Dispose(MyPointer);
oder
Delphi-Quellcode:
var
  MyPointer : PMyRecArray;

New(MyPointer)
...
SetLength(MyPointer^, 10);
MyPointer^[i]
...
// MyPointer := nil; // hier hatte Flips ein Speicherleck erzeugt
MyPointer^ := nil; // so Richtig
// SetLength(MyPointer^, 0); // oder so
Dispose(MyPointer);
wobei ich es maximal so machen würde
Delphi-Quellcode:
type TMyArray = array of irgendwas;
   PMyArray = ^TMyArray;

var MyArr : TMyArray;

var MyArrPointer : PMyArray;

MyArrPointer := @MyArr;

SetLength(MyArrPointer^, 10);
MyArrPointer^[i]
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von MisterNiceGuy
MisterNiceGuy

Registriert seit: 1. Jul 2003
Ort: Mannheim
919 Beiträge
 
Delphi 7 Personal
 
#10

Re: Pointer auf dynamisches Array

  Alt 14. Jan 2010, 11:57
Okay, das versteh ich, aber warum geht dann folgendes nicht?

length(PDynArray(MyPointer)^); Ich bekomm jedesmal eine Zugriffsverletzung wenn ich mir die Länge ausgeben lassen will.
Jonas
Wenn mich jemand sucht, ich bin im Kühlschrank!

Informationen über das Duale Studium
www.jofre.de
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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