setlength für array in fremdem Objekt (solved)

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
u-boot
Beiträge: 306
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

setlength für array in fremdem Objekt (solved)

Beitrag von u-boot »

Folgender Aufbau hat sich in meinem quelltext gebildet (mal hier auf das wesentliche beschränkt)

Code: Alles auswählen

Type
 
Tmyobject=class(Tcomponent)
arr :  array of integer;
end;
 
Tmy2=class (TForm)
procedure irgendwas;
end;
....
implementation
var  objarr:Array of Tmyobject;
 
procedure Tmy2.irgendwas;
var i:integer;
begin
  Setlength(Tobjarr):=5;
  For i:=0 to 4 do begin
    Tobjarr[i]:=Tmyobject.Create(self);
    // so und hier soll nun das setlength für Tobjarr[i].arr rein
    //geht nicht:  Setlength(objarr[i].arr , 3);
    //geht auch nicht wird aber vorgeschlagen:  objarr[i].setlength(arr, 3);   (=2. Version)
    // es geht:
    with objarr[i] do
      setlength(arr, 3);
  end;
end;


So nun mit diesem with bin ich mir etwas unsicher. Vor allem weil die 2. Versionen nicht geht.
Mir kommts eher so vor wie wenn das mit with eher zufällig funktioniert, als dass es wirklich die richtige Lösung ist.
Nach dem motto kommt ein Setlength geflogen was nie da war ....

Von welcher Klasse könnte man denn ableiten, dass die 2. Version funktioniert?
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: setlength für array in fremdem Objekt (solved)

Beitrag von Socke »

Der richtige Ansatz wäre, wenn Tmyobject den eigenen array selbst bearbeitet, Tmy2 also nur noch eine entsprechende Methode aufruft.

Der Vorschlag Nr. 2 ist mehr oder weniger ein Bug in den CodeTools, die dir in der Syntaxvervollständigung alle bekannten Funktionen anbieten. Da kann es auch mal passieren, dass eine Funktion als Methode erscheint.

Welcher Fehler kommt denn bei der ersten Version? Das müsste meiner Meinung nach syntaktisch vollkommen richtig sein...
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: setlength für array in fremdem Objekt (solved)

Beitrag von theo »

Was ich nie so wirklich kapiere ist, warum sich alle immer direkt mit Arrays abmühen, wo doch die TList oder TObjectList (unit contnrs) das Leben so angenehm machen ohne auf Performance zu verzichten.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: setlength für array in fremdem Objekt (solved)

Beitrag von Socke »

theo hat geschrieben:Was ich nie so wirklich kapiere ist, warum sich alle immer direkt mit Arrays abmühen, wo doch die TList oder TObjectList (unit contnrs) das Leben so angenehm machen ohne auf Performance zu verzichten.

Weil sie Arrays im Gegensatz zu TList besser kennen (auch, wenn sie damit nicht umgehen können :mrgreen: )
In normalen Anwendungen auf normalen Computern ist es mittlerweile egal, wie viel Overhead TList mitbringt; und in allen anderen Fällen, wo es wirklich auf den Speicherverbrauch/Leistung ankommt, weiß man meistens auch, wie man was machen muss.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

u-boot
Beiträge: 306
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: setlength für array in fremdem Objekt (solved)

Beitrag von u-boot »

Error: identifier idents no member "Setlength" war die Fehlermeldung für Version 2

Socke hat geschrieben:Weil sie Arrays im Gegensatz zu TList besser kennen (auch, wenn sie damit nicht umgehen können :mrgreen: )


stimmt so ungefähr...
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: setlength für array in fremdem Objekt (solved)

Beitrag von theo »

Socke hat geschrieben:In normalen Anwendungen auf normalen Computern ist es mittlerweile egal, wie viel Overhead TList mitbringt;


Welchen Overhead soll es denn mitbringen? TList ist ja nur ein Haufen Methoden rund um ein Array.
Ich sehe da weder Speicher- noch Geschwindigkeitsmässig irgend ein Problem.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: setlength für array in fremdem Objekt (solved)

Beitrag von Scotty »

Bein einfachen Typen finde ich den Zugriff auf arrays einfacher.

Code: Alles auswählen

var pInt:^integer;
New(pInt);
pInt^:=1;
List.Add(pInt);
 
pInt:=List[0];
if pInt^=0 then...;
Dispose(pInt);
List.Clear;
List.Free;
...
var aInt:array of integer;
setlength(aInt,10);
aInt[0]:=1;
 
if aInt[0]=0 then...;
setlength(aInt,0);

Nimmt man Objekte oder möchte bzw. muss die Annehmlichkeiten von Sort(), Remove(), Insert() usw. nutzen, sieht die Sache natürlich ganz anders aus. Andererseits habe ich mich auch lange vor diesem C-artigen Programmierstil gedrückt und lieber eine Art Insert() für das dynamische Array geschrieben.

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: setlength für array in fremdem Objekt (solved)

Beitrag von Hitman »

Ein Integer ist allerdings ein äußerst schlechtes Beispiel, da du den auch über PtrInt direkt als Pointer nutzen kannst. Auf 32bit Systemen sogar einfach mit List.Add(Pointer(MyInteger));

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: setlength für array in fremdem Objekt (solved)

Beitrag von Socke »

theo hat geschrieben:
Socke hat geschrieben:In normalen Anwendungen auf normalen Computern ist es mittlerweile egal, wie viel Overhead TList mitbringt;


Welchen Overhead soll es denn mitbringen? TList ist ja nur ein Haufen Methoden rund um ein Array.
Ich sehe da weder Speicher- noch Geschwindigkeitsmässig irgend ein Problem.

Der Overhead besteht darin, dass du eine Klasse usw. hast. Hast du ein Programm komplett ohne Listen (mit der LCL nicht möglich) kann man damit den geringen Speicher von bspw. embedded Programmen schonen. Der erzielte Effekt dürfte aber eher gering ausfallen, weshalb man das natürlich oft vernachlässigen kann.

Hitman hat geschrieben:Ein Integer ist allerdings ein äußerst schlechtes Beispiel, da du den auch über PtrInt direkt als Pointer nutzen kannst. Auf 32bit Systemen sogar einfach mit List.Add(Pointer(MyInteger));

Int64 ist ein besseres Beispiel; auf 32bit Systemen muss man in Listen einen Zeiger darauf speichern. Auf 64Bit Systemen kann man einfach PtrInt benutzen.

Bezüglich des Zugriffs kann man streiten. Ein TList zu kapseln (ableiten sollte soviel ich weiß nicht/selten gemachte werden) und immer entsprechende Typecasts durchzuführen benötigt i.d.R. mehr Aufwand als ein einfacher Array.
Aber in Zukunft werden die Generics alles revolutionieren und wir werden nie mehr ohne sie arbeiten wollen (und später können) :mrgreen: (ich mag diesen grünen Smilie)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: setlength für array in fremdem Objekt (solved)

Beitrag von mse »

theo hat geschrieben:Welchen Overhead soll es denn mitbringen? TList ist ja nur ein Haufen Methoden rund um ein Array.
Ich sehe da weder Speicher- noch Geschwindigkeitsmässig irgend ein Problem.


Dynamische Arrays haben schon Vorteile, ich benütze sie sehr häufig. Der Zugriff auf ein TList item ist teuer da dabei eine Funktion aufgerufen und die Indexgrenzen überprüft werden. Zudem sind dynamische Arrays Referenzgezählt, das Abräumen erledigt der compiler, Kopien by reference geschehen in nullkommanichts ohne dass man sich um die TList Lebenszeit sorgen machen müsste.

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: setlength für array in fremdem Objekt (solved)

Beitrag von theo »

Socke hat geschrieben:Der Overhead besteht darin, dass du eine Klasse usw. hast. Hast du ein Programm komplett ohne Listen (mit der LCL nicht möglich) kann man damit den geringen Speicher von bspw. embedded Programmen schonen.


mse hat geschrieben:Der Zugriff auf ein TList item ist teuer da dabei eine Funktion aufgerufen und die Indexgrenzen überprüft werden.


Naja gut, aber auf diesem Level macht man lieber gleich Assembler. ;-)

TList hat aber auch eingebaute Performancevorteile, z.B. "Expand"et sie Blockweise, abhängig von der Kapazität.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: setlength für array in fremdem Objekt (solved)

Beitrag von mse »

theo hat geschrieben:TList hat aber auch eingebaute Performancevorteile, z.B. "Expand"et sie Blockweise, abhängig von der Kapazität.

MSEgui hat entsprechende Hilfsfunktionen auch für dynamische Arrays.

Antworten