Not sure if SORTARRAY

Previous topic - Next topic

WPShadow

Hey,

Problem:

Ich habe 3 Elemente, die dargestellt werden. Die 3 Elemente überlappen quasi. Wenn ich das "unterste" Element (im Array das 0te) aktiviere, dann soll es an die oberste Stelle wandern. Soweit kein Problem (dachte ich), also "reproduziere" ich es (mit DIMPUSH), setze es damit also an die allerletzte Stelle und lösche einfach das Original. Leider ergibt sich dadurch ein Bug in meinem Programmchen.

Also bekam ich den Tip SORTARRAY zu nutzen und damit das erste Objekt an die letzte Position wandern zu lassen. Mein Problem dabei ist, daß ich mir nicht sicher bin, ob "sortieren" einen Sinn macht, da ich immer nur ein unteres Element haben möchte, das ans Ende wandert und nicht die ganze Reihe. Es kann auch nur sein, daß das 3. von 5 Elementen den Platz von Nr. 5 übernehmen müßte und Nr. 5 zu 4 und 4 zu 3 wird.

Gibt es evtl. einen Weg einfach die Zeiger zu tauschen oder macht es da eher Sinn selbst eine Verkettete Liste zu schreiben?

lg

W.
AMD X2 4600, 2 GB Ram, ATI X1950 XTX, XP PRO SP2: GLB Premium 10.beta_dingsi, <(´.´<) Kirby Dance (>`.`)>
http://lostrevenant.blogspot.com
alea iacta est

WPShadow

ok, ich glaube ich weiß, wie du meinst.

Ich mache mal einen Versuch und schaue, wie man sowas sauber baut.  =D

Danke für den Tip!  :good:
AMD X2 4600, 2 GB Ram, ATI X1950 XTX, XP PRO SP2: GLB Premium 10.beta_dingsi, <(´.´<) Kirby Dance (>`.`)>
http://lostrevenant.blogspot.com
alea iacta est

WPShadow

hey,

ich habe mich mal an einen ganz kleinen Versuch gewagt und es mit einem rekursiven "sink" geschrieben.

Meintest du es ca. so in der Art? Übrigens: sorry für den nicht allzu schön geschriebenen Code, ich habe ihn mal "nebenbei" zusammen geschustert...

Code (glbasic) Select

// --------------------------------- //
// Project: Circular Buffer
// Start: Friday, September 06, 2013
// IDE Version: 11.322


// SETCURRENTDIR("Media") // go to media files

TYPE twin
id
ENDTYPE

TYPE tpointer
id
ENDTYPE

GLOBAL win[] AS twin, pointer[] AS tpointer


main()

FUNCTION main:

add(1)
add(2)
add(3)

sink(0)

WHILE TRUE

draw()

SHOWSCREEN
WEND



ENDFUNCTION

FUNCTION add: id
LOCAL m AS tpointer
LOCAL n AS twin

m.id = LEN(win[])

DIMPUSH pointer[], m

n.id = id

DIMPUSH win[], n


ENDFUNCTION

FUNCTION draw:
LOCAL wert

FOREACH m IN pointer[]
INC wert, 1
PRINT win[m.id].id, 0, wert * 20
NEXT


ENDFUNCTION

FUNCTION sink: id
LOCAL tmp_id, max_length

max_length = LEN(pointer[]) - 1

tmp_id = pointer[id].id
pointer[id].id = pointer[id + 1].id
pointer[id + 1].id = tmp_id

IF (id + 1) < max_length THEN sink(id + 1)

ENDFUNCTION
AMD X2 4600, 2 GB Ram, ATI X1950 XTX, XP PRO SP2: GLB Premium 10.beta_dingsi, <(´.´<) Kirby Dance (>`.`)>
http://lostrevenant.blogspot.com
alea iacta est