count($array)

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Flip

Betreff: count($array)

BeitragDo, Aug 19, 2004 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

kann man in BB Arrayinhalte zählen wie z.B. mit PHP und count($array)?

D2006

Administrator

BeitragDo, Aug 19, 2004 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
erstmal: Willkommen im Forum.

Zur Frage:

nicht wirklich. Ist aber unnötig, das sie ja nicht dynamisch sind. Das heißt du hast festgelegt wie groß das Array ist, also musst du dir das auch merken. Du könntest beispielsweise den nullten Wert zum Speichern der Größe benutzen.

MfG
  • Zuletzt bearbeitet von D2006 am Do, Aug 19, 2004 15:17, insgesamt einmal bearbeitet

sbrog

BeitragDo, Aug 19, 2004 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
wie meinst du das ?

Edit : naja egal
 

Flip

BeitragDo, Aug 19, 2004 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann ich für dynamische Sachen also nur DIM nehmen? Kann man da die Felder zählen?

DivineDominion

BeitragDo, Aug 19, 2004 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt keine Dynamischen sachen.

Du kennst das womöglich aus PHP oder anderen Interpretersprachen, wo man einfach mal sowas wie $bla[1][3] = new array( "y", "m" ); schreibt und plötzlich eine neue Dimension für den Arrayeitnrag hat.

Das geht mit BB nicht.

Du setzt Dim ein und definierst dort die Dimensionen und die größe.
Code: [AUSKLAPPEN]
Dim array(100,100,3,53)


Du kannst natürlich REdimmen, also Anfangs sowas wie Dim array(1) schreiben und später (z.b. wenn du eine KArte für dein Spiel einliest und die Größe sich ändert oder so) neu dimensionieren (Dim array(123) z.B. in einer Function etc.).

Aber entweder hast du eine Zahl, nach der du dich richtest(Dim array( maximal% )) oder du gibst den WErt per Hand in als Code ein (siehe oben mit den Zahlen).
Egal was ist, du kannst die Anzahl immer festhalten, weil du, zum re-dimmen z.b., immer wieder eine Variable mit der Anzahl haben musst oder eben einen festen WErt hast.
christian.tietze@gmail.com - https://christiantietze.de
macOS
 

Timo

BeitragDo, Aug 19, 2004 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, gibt schon dynamische Arrays --> Types aber da es bei denen keinen Index gibt, haben sie mit den PHP-Arrays net viel gemeinsam Wink
 

Flip

BeitragDo, Aug 19, 2004 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich brauch 360 Felder mit Werten die per Zufall geleert werden sollen.

Problem: Es sollen immer nur noch die vorhandenen Felder per Schleife durchlaufen werden und nicht alle 360.

Und außerdem funktioniert Rand(1,360) dann ja auch nicht korrekt...

Markus2

BeitragDo, Aug 19, 2004 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
@Flip

Dafür kannste wunderbar Types nehmen und
statt leeren entfernst du einen Eintrag ganz aus der Liste .
Mit For Each gehst du nur die vorhandenen durch .
 

Flip

BeitragDo, Aug 19, 2004 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Richtig, hab ich beim Durchsuchen der Befehle auch gefunden...

For bla.punkt = Each punkt
...
Next

Okay, damit frage ich alle (noch) vorhandenen Felder ab. Aber wie packe ich das sinnvoll in eine weitere Schleife?

Ausgangspunkt: 360 Felder ingesamt mit Werten (bla.punkt)

Per Schleife soll irgendein (!) Feld per Zufall ermittelt werden (also nicht einfach in Reihenfolge und auch nur ein Feld was wirklich noch existiert), dieses Feld verarbeite ich dann und es wird mit Delete gelöscht. Nachdem bla.punkt komplett leer ist, soll das Script enden.

EDIT: Also ich glaube ich sollte vorher schon das Type zufällig füllen, weil anders läßt sich dies wohl nicht lösen. Genauso gut kann ich dann auch ein DIM nehmen und normal mit IF-Schleife auslesen. Aber wie fülle ich ein DIM (360) mit zufälligen aber nicht gleichen Zahlen? Bzw. wie "shuffel" ich das DIM nachdem ich doch eine normale Zahlenfolge genommen habe?

Jolinah

BeitragDo, Aug 19, 2004 21:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

SeedRnd MilliSecs()


Type eintrag
Field inhalt
End Type


For i = 1 To 360
   e.eintrag = New eintrag
   e\inhalt = Rand(1,360)
Next


selected.eintrag = Null


Repeat
   
   For e.eintrag = Each eintrag
      i = Rand(0,10000)
      If i >= 9950 Then
         selected = e
         Exit
      EndIf   
   Next
   
Until Not selected = Null


Print Str$(selected\inhalt)

Delete selected


Delete Each eintrag


WaitKey()
End


Meinst du sowas in der Art?
Es werden 360 Objekte erstellt. Jedes Objekt enthält eine zufällige Zahl von 1 bis 360. Dann wird ein zufälliges Objekt ausgewählt welches man danach löschen kann.

Diese Methode ist zwar etwas Zeitaufwendig. Könnte man aber auch mit Arrays irgendwie hinbekommen.

Code: [AUSKLAPPEN]

SeedRnd MilliSecs()

Dim eintrag(360)
Dim vorhanden(360)


For i = 1 To 360
   eintrag(i) = Rand(1,360)
    vorhanden(i) = 1
Next


;Zufälliges feld auslesen
;Wenn das feld als gelöscht markiert ist vorgang
;wiederholen bis ein Feld gefunden wurde das
;nicht gelöscht ist.
valid = False
Repeat

   zufall = Rand(1,360)
   If vorhanden(zufall) = 1 Then valid = True

Until valid = True



Print eintrag(zufall)
vorhanden(zufall) = 0  ;Objekt löschen (bzw. ungültig machen)


WaitKey()
End
 

Flip

BeitragDo, Aug 19, 2004 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Es sollen einzeln die Zahlen 1 - 360 vorkommen und keine doppelt! Das ist ja das Problem :-/

Also die Abfrage mit EACH und Types ist perfekt, dazu müßten aber die 360 Felder VORHER schon per Zufall gefüllt werden.

In PHP würde ich das einfach so lösen:

// Generierung und Mischung
for($r=1;$r<360;$r++){$array[$r]=$r;};shuffle($array);

// Ausgabe und ev. noch Array löschen
for($r=1;$r<count($array);$r++){echo $array[$r]."<br>"};

wunderkind

BeitragDo, Aug 19, 2004 23:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Zum Thema füllen: recht einfach. Du nimmst ein Array, legst alle Werte hintereinander ab und mischst anschließend. Mein Vorschlag ist ein wenig brute force. Es werden immer zwei zufällige Array-Einträge genommen und schlichtweg getauscht. Je öfter man das macht, desto größer die Unordnung. Ehm, vermutlich Wink. Hier mal ein Beispiel mit übersichtlichen 10 Einträgen.

Code: [AUSKLAPPEN]
Const max_values% = 10
Const max_passes% = max_values * 10


Graphics(800,600,32,2)

Dim array%(max_values%)

; fill array
For i% = 0 To max_values% - 1
   array(i%) = i% + 1 ; 1...x
Next


; randomize array
SeedRnd(MilliSecs())

For i% = 0 To max_passes%
   ; take two value and just swap them
   entry_a% = Rand(0,max_values%-1)
   entry_b% = Rand(0,max_values%-1)
   value_a% = array(entry_a%) ; save value a
   array(entry_a%) = array(entry_b%) ; overwrite value a with value b
   array(entry_b%) = value_a% ; overwrite value b with value a
Next

; print array
For i% = 0 To max_values% - 1
   Print "Entry #"+i%+": "+array(i%)
Next


WaitKey()

End
 

dubitat

BeitragFr, Aug 20, 2004 11:57
Antworten mit Zitat
Benutzer-Profile anzeigen
es geht auch noch einfacher als wunderkinds bruteforce:

Code: [AUSKLAPPEN]

seedrnd millisecs()

dim array(360)
dim vorhanden(360)

for i = 1 to 360

random = rnd(1,360)
while zah_vorhanden=1
wert_finden()
wend

if zahl_vorhanden=0 then
array(i) = random

print array(i)
endif
next

function wert_finden()
zahl_vorhanden = 0
for a = 1 to 360

if zahl_vorhanden=1 then
zahl_vorhanden = 1
else
if vorhanden(a) = 1 then
if array(a) = random then
random = rnd(1,360)
zahl_vorhanden= 1
endif
endif
endif

next
end function


so gehts auch! du musst nur noch vorhanden auf 0 setzen und es ist "weg"
Erare humanum est - Irren ist Menschlich

Kabelbinder

Sieger des WM-Contest 2006

BeitragFr, Aug 20, 2004 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Gib doch einen boolean-wert für jeden Array-eintrag an, der verändert werden kann und nacher mit If abgefragt wirdetwa so:

Code: [AUSKLAPPEN]

Graphics 300,600,16,2

Global ort = 0

Dim Array(360,2)
For i = 1 To 360
Array(i,1) = Rand(0,100)
Array(i,2) = Rand(0,1)
Next

For i = 1 To 360
If Array(i,2) = 1 Then
Text 0,ort*10,Array(i,1),0,0
ort = ort + 1
EndIf
Next

WaitKey
End


Die Booleans werden per rnd entweder auf 0 oder 1 gesetzt und entsprechend wird nacher in der if-verzweigung der zugehörig wert ausgegeben, oder nicht. Das lässt sich ja auch noch modifizieren und das beste: du brauchst nur einen Array.
<Wing Avenger Download> ◊◊◊ <Macrophage Download>

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group