array

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

array

Beitrag von Rolf Ramacher »

Hallo zusammen,

ich möchte aus einem mehrdemensionalen Array, welches aus 3 einzelnen Elementen besteht, eine Reihe mit den 3 Elementen löschen.
aber in der Hilfe ist nur eine Anleitung Adel() für einfaches Array
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: array

Beitrag von Jan »

Rolf,

wenn ich Dich richtig verstehe hast Du ein Array, dessen einzelnen Elemente aus einem Unterarray mit drei Elementen besteht.

Code: Alles auswählen

{{1.1, 1.2, 1.3}, ;
 {2.1, 2.2, 2.3}, ;
 {3.1, 3.2, 3.3}}
Wenn das so richtig ist: Dann lösch doch das Arrayelement (z. B. Nr. 2). Damit sind die drei Unterelemente 2.1, 2.2, und 2.3 ebenfalls gelöscht.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: array

Beitrag von peternmb »

stelle dir das Array wie eine Tabelle vor.
Wenn du die Zeile 2 löschst ist das völlig egal wieviele Spalten die Tabelle hat - die in dieser Zeile sind alle weg :)
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: array

Beitrag von UliTs »

Genau genommen gibt es in xBase++ nur 1-dimensionale Arrays aus Elementen. Ein Element kann aber wiederum ein Array sein :D .
Bei

Code: Alles auswählen

A := {1,{2,2,2},3}
hast Du ein Array mit 3 Elementen. Das erste Element hat den Wert 1, das zweite ist wiederum ein Array mit 3 Elementen, die alle den Wert 2 haben und das dritte Element hat den Wert 3 :) .
Z.B. durch

Code: Alles auswählen

ADel( A,2 )
wird das 2. Element gelöscht. Ergebnis:

Code: Alles auswählen

{ 1,3,NIL }
Wenn Du stattdessen das 2. Element aus dem inneren array löschen möchtest, geht das wie folgt:

Code: Alles auswählen

ADel( A[2],2 )
Ergebnis:

Code: Alles auswählen

{1,{2,2,NIL},3}
Wenn Du die NIL-Elemente nicht haben möchtest, verwende stattdessen ARemove() :) .

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: array

Beitrag von Rolf Ramacher »

wäre denn das so derSyntax - beim durchlaufen des Arrays mit for next ??

Code: Alles auswählen

	Adel(aUProd[i],i)
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: array

Beitrag von AUGE_OHR »

Rolf Ramacher hat geschrieben:wäre denn das so derSyntax - beim durchlaufen des Arrays mit for next ??

Code: Alles auswählen

	Adel(aUProd[i],i)
NEIN denn :
Die Array-Funktion ADel() löscht den Inhalt eins Elements aus einem Array. Der Inhalt bzw. Wert des Elements geht verloren und alle folgenden Elemente rücken um eine Position auf. Der Wert des letzten Elements wird NIL. Die Anzahl der Arrayelemente Len(<aArray>) bleibt durch ADel() unverändert. Um nach ADel() das letzte Element zu entfernen, muß die Funktion ASize() verwendet werden.
für eine FOR / NEXT Schleife solltest du AREMOVE() nehmen und vom Ende (!) anfangen zu löschen.
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: array

Beitrag von Jan »

Rolf,

wie ich und andere gesagt haben - lösche das Hauptelement, und damit sind auch alle Unterelemente automatisch weg. Also ADel(aArray, 2), und 2.1, 2.2, und 2.3 sind ebenfalls weg.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: array

Beitrag von brandelh »

Mehrere haben das richtige Vorgehen ja schon genannt, aber es scheint Verständnisprobleme zu geben. ;-)

Wer Arrays aus anderen Sprachen kennt hat eventuell Probleme damit zu verstehen wieso das in Xbase viel flexibler funktioniert.
In PowerBasic oder Delphi oder C ist ein Array mit Zahlen in 5 Zeilen und 2 Spalten im Prinzip ein Speicherbereich für 5x2 Zahlenwerte (LONG wäre also 4 Byte * 5* 2) also 40 Byte hintereinander (ähnlich wie in einer binärdatei).
In PowerBasic oder Delphi oder C kann man NICHT eine komplette Zeile ansprechen sondern immer nur ein Element. Dort kann man auch nicht einfach eine Zeile löschen (man muss umkopieren).
Jedes Array Element muss vom gleichen Typ sein !

Xbase++ hingegen verwaltet immer nur eindimensionale Arrays :!:
Allerdings können die Elemente selbst auch wieder Arrays sein.


Das obige Beispiel belegt also 5 Speicherblöcke die auf 2 Byte Speicherbereiche verweisen:

Code: Alles auswählen

{ {1,11}, {2,22}, {3,33}, {4,44}, {5,55} }
somit kann man entweder direkt auf ein Element zugreifen, wobei die Syntax sehr flexibel ist.

Code: Alles auswählen

aWert[2,2] => 22
aWert[2][2] => 22
die zweite Syntaxform erleichtert das Verstehen wieso wir mehr können, z.B. eine komplette Zeile als Array lesen:

Code: Alles auswählen

aWert[2] => {2,22}
genauso kann man also eine Zeile daraus löschen OHNE die Anzahl der Zeilen zu ändern: ADEL()
oder meist sinnvoller die Zeile komplett zu löschen UND die Zeile komplett entfernen: AREMOVE()

Code: Alles auswählen

AREMOVE(aWert,2)
löscht die komplette 2. Zeile und zwar ThreadSave !
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: array

Beitrag von Tom »

für eine FOR / NEXT Schleife solltest du AREMOVE() nehmen und vom Ende (!) anfangen zu löschen.
Oder von Anfang bis Ende durchlaufen (Kondition FOR i := 1 to Len(a)) und i dekrementieren, wenn ein Eintrag gelöscht wird:

Code: Alles auswählen

FOR i := 1 TO Len(a)
IF LoeschBedingung()
  ARemove(a,i)
  i --
ENDIF
NEXT
Herzlich,
Tom
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: array

Beitrag von UliTs »

Jan hat geschrieben:...lösche das Hauptelement, und damit sind auch alle Unterelemente automatisch weg. Also ADel(aArray[2]), und 2.1, 2.2, und 2.3 sind ebenfalls weg.
Jan, Du meinst sicher:

Code: Alles auswählen

ADel( aArray,2 )
:wink:
Tom hat geschrieben:...Oder von Anfang bis Ende durchlaufen (Kondition FOR i := 1 to Len(a)) und i dekrementieren, wenn ein Eintrag gelöscht wird:

Code: Alles auswählen

FOR i := 1 TO Len(a)
IF LoeschBedingung()
  ARemove(a,i)
  i --
ENDIF
NEXT
Tom, das ist aber von hinten durch die Brust in's Auge :o
Wenn alles gelöscht werden soll, kannst Du gleich

Code: Alles auswählen

ARemove( a,1/*nStartPos*/,len(a)/*nCount*/ )
schreiben oder, wenn es egal ist, dass der Zeiger auf das array verloren geht, einfach

Code: Alles auswählen

a := {}
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: array

Beitrag von Tom »

Wenn alles gelöscht werden soll, kannst Du gleich
Soll ja nicht. Man achte auf die Feinheiten:

Code: Alles auswählen

IF Loeschbedingung()
"Loeschbedinung" wäre beispielsweise a enthält irgendeinen Wert (oder auch nicht).

:wink:
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: array

Beitrag von Tom »

wenn es egal ist, dass der Zeiger auf das array verloren geht, einfach
Code:
a := {}
Das würde ich nicht empfehlen, weil es in bestimmten Situationen dazu führen kann, dass das Array doch erhalten bleibt. Lieber das hier:

Code: Alles auswählen

aSize(a,0)
Dass man bei Zuweisungen an Arrayvariablen generell vorsichtig sein muss, sollte in diesem Zusammenhang auch noch einmal erwähnt werden.

Code: Alles auswählen

a1 := {1,2,3}
a2 := a1
aRemove(a1,1)
* Achtung: a2 enthält jetzt auch nur noch {2,3}

Code: Alles auswählen

a1 := {1,2,3}
a2 := aClone(a1)
aRemove(a1,1)
* a2 enthält jetzt immer noch {1,2,3}
Herzlich,
Tom
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: array [ERLEDIGT]

Beitrag von Rolf Ramacher »

Hi Leute,

alles erledigt. ja mit adel werden ja nur die Inhalte des arrays gelöscht, aber nicht die arrayposition selbst. alles klar danke hat funkt.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Antworten