GLBasic forum

Other languages => GLBasic - de => Topic started by: WPShadow on 2013-Sep-05

Title: Not sure if SORTARRAY
Post by: WPShadow on 2013-Sep-05
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.
Title: Re: Not sure if SORTARRAY
Post by: WPShadow on 2013-Sep-05
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:
Title: Re: Not sure if SORTARRAY
Post by: WPShadow on 2013-Sep-06
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