count($array)
Übersicht

FlipBetreff: count($array) |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
kann man in BB Arrayinhalte zählen wie z.B. mit PHP und count($array)? |
||
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
wie meinst du das ?
Edit : naja egal |
||
Flip |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Kann ich für dynamische Sachen also nur DIM nehmen? Kann man da die Felder zählen? | ||
![]() |
DivineDominion |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Naja, gibt schon dynamische Arrays --> Types aber da es bei denen keinen Index gibt, haben sie mit den PHP-Arrays net viel gemeinsam ![]() |
||
Flip |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() |
KabelbinderSieger des WM-Contest 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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> |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group