Grösse Dynamischer Arrays verändern

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

C64-Flo

Betreff: Grösse Dynamischer Arrays verändern

BeitragDo, Dez 21, 2006 11:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo nochmal...

Also da mir diese TYPES nicht so ganz geheuer sind (irgendwie kommt es mir spanisch vor, dass sie nicht anhand eines eindeutigen indizees identifiziert werden können (wie dim-arrays), daher hab ich mit folgendem Code das Problem umgangen (oder zumindest so dargestellt, dass es mir logischer erscheint Wink)

Code: [AUSKLAPPEN]

Graphics 800,600,32,2
SetBuffer BackBuffer()

SEEDRND MILLISECS()

type wpn
    field s
    field name$
end type



global waffenanzahl=6
dim waffe.wpn(waffenanzahl)

waffeninit()


;------------------------------------MAINLOOP------------------------------
while not keyhit(1)
cls
;----durchzählen
aktivewaffen=0
a=0
for a=1 to waffenanzahl
        if waffe(a)<>null then
                         aktivewaffen=aktivewaffen+1
                          text 10,(20*a), a+" - "+waffe(a)\name$+" Schaden: "+waffe(a)\s
                       end if
       next

text 300,100,"Anzahl der Waffen: "+aktivewaffen
if keyhit(78) then waffegenerieren()

if keyhit(2)then waffe(1)=null
if keyhit(3)then waffe(2)=null
if keyhit(4)then waffe(3)=null   

flip
wend ;----------------------------ENDE MAINLOOP-----------------------------



;___________________________________________________________
function waffeninit();*************************************
for a=1 to waffenanzahl
         waffe(a)=new wpn
         select a
         case 1 ;         NAME  ||   SCHADEN
         waffe(a)\name$=("Dolch") waffe(a)\s=4
         case 2 ;         NAME  ||   SCHADEN
         waffe(a)\name$=("Knüppel") waffe(a)\s=6
         case 3 ;         NAME  ||   SCHADEN
         waffe(a)\name$=("Kurzschwert") waffe(a)\s=7
         case 4 ;         NAME  ||   SCHADEN
         waffe(a)\name$=("Schwert") waffe(a)\s=8
         case 5 ;         NAME  ||   SCHADEN
         waffe(a)\name$=("Langschwert") waffe(a)\s=9
         case 6 ;         NAME  ||   SCHADEN
         waffe(a)\name$=("Bastardschwert") waffe(a)\s=10
      end select
   next
end function;***********************************************
;------------------------------------------------------------
;__________________________________________________   
function waffegenerieren();************************
nr=0
for neu=1 to waffenanzahl
          if waffe(neu)=null then nr=neu;Lücke schliessen
          
next
if nr=0 then
        waffenaznahl=waffenanzahl+1
      nr=waffenanzahl
   end if
      
waffe(nr)=new wpn
waffe(nr)\name$="Neuesding"+a
waffe(nr)\s=rnd(1,10)   
end function;**************************************


Jetzt fehlt nur noch eine Kleinigkeit - die ich in sämtlichen tutorials nicht finden konte - Wie ändere ich die Grösse des Arrays "waffe(a)" ?

Bitte sagt mir nicht dass das in BB nicht geht - könnte ich mir kaum vorstellen Surprised
"Die Situation ist aussichtslos - aber nicht kritisch!"
(S.Effenberg.)

C64-Flo

BeitragDo, Dez 21, 2006 11:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm...

Also wenn ich mein Array während der Laufzeit erneut dimensioniere -

wird der gesamte Inhalt gelöscht! Shocked

Jetzt mal abgesehen vpn der Möglichkeit immer alles zwischenzuspeichern bevor ich das array vergrössere und dann wieder alles hineinzukopieren (was umständlich ist) -
gibt es nicht noch eine elegentere Möglichkeit meine Arrays mal eben zu vergrössern/verkleinern ?
"Die Situation ist aussichtslos - aber nicht kritisch!"
(S.Effenberg.)

garret

BeitragDo, Dez 21, 2006 11:31
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Wenn du im Hauptteil ein Array mit feld(0) deklarierst, kannst du es später in einer Funktion neu dimensionieren. Ich habe davon allerdings bisher nur gehört - selber gemacht habe ich es noch nie.

2. Du könntest statt Arrays Banks nehmen. Allerdings entfällt bei einer Verkleinerung der Bank auch hier ein Teil (der am Ende). Eine Möglichkeit wäre es dann, die Daten innerhalb des Feldes zu verschieben. Das Vergrößern einer Bank ist jedoch kein Problem, das geht mit ResizeBank.

MfG garret

Edit: Bei dynamischen Strukturen sind Types aber immer noch die beste Wahl! Wink
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

BladeRunner

Moderator

BeitragDo, Dez 21, 2006 15:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Jop, verschließ dich nicht vor den Types - sie sind sehr sehr mächtig. Eine recht simple Methode sie gezielt anzusprechen ist dir ein Index-Field einzubauen, anhand dessen Du erkennen kannst ob Du den richtigen Type ansprichst.

Code: [AUSKLAPPEN]
type bla
   field text$
   field ID
end type
....

for count.bla = each bla
    if count\ID = gesuchte id then
       machwasduwillst()
    endif
next
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Dez 21, 2006 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Das geht auch direkt mit ql:Object . Dazu muß nach jedem neuem Typeeintrag einmal ql:Handle 'aufrufen'. Danach verändert dieser Eintrag sein Handle nicht mehr und kann immer durch diese ID direkt angesprochen werden.

In bestimmten Fällen ist denoch deine Methode besser. Muß man halt abwiegen.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group