Beiträge von H.Brill

    Mal ein Zwischenstand :

    IndexOf() funktioniert auch in der Version 11.2. Es wird bloß nicht in der Hilfe erwähnt.

    Wenn man sich mal die MoveArrToList() - Funktion zunutze macht, sieht man auch genau,

    wie die Arrays kopiert werden und was eigentlich IndexOf() bei mehrdimensionalen Arrays

    zurück gibt. Das Array wird dimensionsweise in die Listboxliste kopiert, Also a&[0,0], a&[1,0]

    usw. Danach folgt die nächste Dimension. Und so geht vermutlich auch IndexOf() vor.


    Somit ist mir einiges klarer geworden. Somit kann man sich dann auch die genaue Position (spalte, index) ableiten.

    Ist nur schade, daß man die Dimensionen eines mehrdimensionalen Array nur mit pType$() bekommt.

    Vielleicht könnte RGH das


    @TypeOf(V#)


    so erweitern, daß man auch die Art ($,!,%,&) und die Dimensionen eines Arrays erfahren könnte. Also daß es

    sowas wie bei pType$() zurück liefert.

    Soweit bin auch schon gekommen, zumindest mal bei ! ,&, %, $, was gängig ist :

    Damit bekomme ich schon mal die Dimensionen 5,5,5 als String (tp$) und p& zeigt die Anzahl Dimensionen.

    Der Parameter x& soll dann angeben, welche Dimension mit w& durchsucht werden soll. Nun bin ich am

    überlegen, ob ich daraus Einzel-Arrays machen soll und dann mit IndexOf() suche. Bloß müßte ich da dann

    ein Array mit Arrays definieren. Oder halt eine verschachtelte Abfrage mit einer WhileLoop - Schleife. Das

    Problem ist, daß die Dimensionen ja unterschiedlich groß sein können (z.B.[8,5,3]). Oder werden die profanintern

    hintereinander gespeichert, also 16 Elemente ?

    So gesehen stimmt es auch wieder, ist aber trotzdem nicht sehr einsteigerfreundlich.

    Ich finde, daß es in der Hilfe erwähnt werden sollte, wie z.B. bei SubStr$(), wo bei

    keinem Fund des Trennzeichens eben der ganze String zurück gegebn wird.


    Wenn man es weiß, kann man dann eben > 1 abfragen, wenn man wissen will,

    wieviele Trenner vorhanden sind (ergebnis - 1). Es spart ja immerhin eine extra

    Schleife.


    Ich will mir ein spezielles IndexOf() basteln, das auch mit mehrdimensionalen Arrays

    klar kommt. Dabei will ich das pType$() speziell auswerten, da dieses ja auch die

    Dimensionen, falls vorhanden, zurückgibt : "&[8,8,2]". Damit hätte man die Anzahl

    Dimensionen und dazu auch die Größen. Anhand der Dimensionen könnte man

    dann ja einzelne Arrays erstellen und dann jeweils IndexOf() darauf anwenden.


    Auch ein erweitertes SelectString(), das nicht nur in der ersten Spalte einer Gridbox

    suchen kann, wäre vorstellbar.


    Mal sehen, was ich da basteln kann.

    Hallo,

    ich habe hier noch einen Stolperstein gefunden :

    Code
    Cls
    Declare String s1, s2
    
    s1 = "Hallo Welt"
    s2 = "Hallo, Welt"
    
    Print Len(s1, ","), Len(s2, ",")
    
    waitkey

    Da kommt 1 und 2 heraus. Warum bei s1 eine 1, da ist doch gar kein Komma drin ?

    Bei s2 stimmt es.

    Sollte da nicht besser bei s1 eine 0 kommen ?


    Ob jetzt Bug oder nicht, da kann man schon mal ins Stolpern kommen. Zumindest

    ist es etwas irritierend.

    Da ist tatsächlich InStr() die bessere Wahl.

    Ach ja, was bringt mir IndexOf() beim mehrdimensionalen Array für Positionen ?

    Normalerweise müßte da eine Fehlermeldung kommen, da nicht eindimensional.

    Auch SizeOf() reagiert da irgendwie komisch drauf.

    So o.ä. könnte man ein ArrDel in Profan Version 11.2 realisieren :

    Ich mußte auf eine Liste mit Create zurückgreifen. Ein b&[] = Arr&[] funktioniert nicht, weil Profan da immer

    eine 0 als Platzhalter für das gelöschte Element setzt. Ist jetzt nur für Long (&) - Arrays.

    Ich hätte einfach 6x immer aus 49 Zahlen gewürfelt und im Falle einer bereits gezogenen Zahl, einfach weiter gewürfelt, bis eine frische Zahl kommt und die dann als nächste neue Zahl präsentiert - und das eben solange, bis 6 Zahlen zusammen sind

    Das macht aber dann die Abfragen komplizierter. Bei den ersten beiden gezogenen Kugeln geht es noch,

    aber nach der dritten, vierten und fünften Kugel wird es interessant. Da war das Löschen der gezogenen

    Kugeln aus dem Array einfacher, da man dann einfach immer einen frischen Satz der noch gültigen Kugeln

    beim nächsten Durchlauf hat. Du mußt ja immer die 49 Werte testen, weil die gezogenen Werte ja in diesem

    Bereich (1-49) liegen können. Einfacher wäre es, wenn die 49 als erstes usw. gezogen würde, aber das ist

    ja nur selten der Fall. Da geht u.U. dann auch eine Menge Zeit drauf, wenn du mit Rnd() solange ziehen mußt,

    bis keine der schon gezogenen Zahlen dabei ist. Finde ich höchst uneffizient.


    ach so meinst du das. Das ist mir jetzt gar nicht aufgefallen, daß du das auch genau so umgesetzt hast - schau ich gleich nochmal genauer hin 8o

    Ich kenne das, weil ich früher öfters samstags abends die Liveziehung mitverfolgt hatte. Da hatte ich gesehen, daß nach

    jeder gezogenen Kugel die Trommel neu anlief. Und logischerweise immer mit einer Kugel weniger.

    Man braucht ja nicht unbedingt Arrays zu nehmen.

    List!(N) - List$(N) - List%(N) - List&(N) und Create("List", T)

    und natürlich auch die interne Listboxliste oder sonstige Stringlisten

    würden zwar auch gehen, nur müßte man jedesmal in eine echte

    Zahl umwandeln. Das Löschen eines Eintrages müßte man mit

    DeleteString machen. Daher waren die Arrays der beste Weg. Ansonsten

    ist ja codemäßig nicht sehr schwierig.


    Man muß bei jedem Durchlauf halt eines beachten :

    Bei der realen Ziehung wird ja auch nach jeder gezogenen Kugel

    die Maschine neu gestartet. Deshalb muß dies auch beachtet

    werden :


    1 Zahl aus 49 möglichen Zahlen

    1 Zahl aus 48 möglichen Zahlen

    1 Zahl aus 47 möglichen Zahlen

    1 Zahl aus 46 möglichen Zahlen

    1 Zahl aus 45 möglichen Zahlen

    1 Zahl aus 44 möglichen Zahlen


    Das war der hauptsächliche Knackpunkt bei meiner Maschine und deshalb

    kam mir ArrDel da sehr gelegen. Bei den früheren Profanversionen könnte

    man das auch mit Umkopieren der Arrays erreichen.

    Auch das ganze mit Bereichen zu machen, wäre interessant. Da kannst du deiner

    Kreativität freien Lauf lassen.

    Hallo Jörg,

    Das mit der 0 stimmt. Habs im Netz nochmals nachgeschaut und

    auch bei lotto.de sieht man bei der History (gezogene Zahlen für

    einen gewissen Zeitraum), manchmal ein 0.

    Deswegen das extra Array von 0 - 9. Und die ist immer einstellig.

    Was du evtl. meinst, ist die Landeslotterie. Da wird die Spielschein-Nr.

    bzw. Losnummer auf Gewinn geprüft.


    Ich habe dir mal einen alten Tippschein angehängt. Da siehst du

    unter den Zahlenreihen auch die Superzahl und darunter in der

    großen eckigen Klammer die Losnummer für die Landeslotterie,

    was durch Super 6 und Spiel 77 abgelöst wurde. Anbei auch die

    Quoten.

    Hier mal eine kleine Lottomaschine, die 6 mal eine Zahl zieht und danach die Superzahl.

    Wegen ArrDel geht es aber erst ab Version X3. Könnte man auch umfriemeln mittels einer

    anderen Liste, aus der man Einträge löschen kann. Nach jeder Ziehung einer Kugel fehlt diese

    ja beim nächsten Durchlauf. Es können ja nicht zwei gleiche gezogen werden.

    Die Animation einer Trommel mit laufenden Kugeln (mit OGL ?) habe ich mir erspart.

    Viel Spaß damit. :)

    Vielleicht noch ein Vorschlag für Version 5 :


    Könnte man IndexOf() so gestalten, daß bei String-Arrays die Genauigkeit der Suche

    mit angegeben werden kann ? Halt so ähnlich, wie bei db("Find",...) und db("Seek",...).


    Auch schön wäre, bei Zahlen-Arrays die Suche mit Operatoren zu gestalten, z.B.

    > 10 ' erste Zahl > 10 (auch >= )

    < 10 'erste Zahl < 10 (auch <= )

    usw.


    Vielleicht könnte auch ein Set("...",....) Befehl das Ganze steuern. Ohne geht es

    wie gehabt und mit Set() mit obiger Erweiterung. Ich denke da an Set("RegEx", N),

    wo eingeschaltet, Instr() usw. mit reg. Ausdrücken funktionieren und ausgeschaltet

    halt ganz normal.

    Oder daß RegEx auch bei IndexOf() und String-Arrays funktioniert.

    Da dBase in der mittleren Datentechnik noch nicht tot ist und für kleinere Datenbestände

    immer noch gut zu gebrauchen ist, hätte ich noch einen Vorschlag. Zumal RGH vor kurzem

    mal geschrieben hatte, daß er für sich privat das dBase-Modul etwas erweitert hätte.


    Es geht um die Suche. Ähnlich, wie bei dem Befehl db("SQLExec", S,N) die Befehle db("Find,...)

    und db("Seek",...) auch mit einem Ergebnismodus auszustatten. Also, daß man nicht mehr rekursiv

    in einer Schleife suchen müßte, sondern die Ergebnisse auf Bildschirm, in der Listboxliste oder gar

    in einer Gridbox landen. Da ja auch die Genauigkeit bei beiden Befehlen einstellbar sind, wären ja

    auch mehrere Treffer möglich, die dann in einer Liste landen könnten.


    Ist mal so ein Gedanke von mir für eine Version 5.0.

    Hier noch was, wie man das Schließenkreuz (rechts oben)

    zumindest deaktivieren (ausgrauen) kann.


    Paßt gerade hier in die Schublade.

    Wen das Copyright - Zeichen © stört, kann es ganz leicht entfernen mit :

    Code
    RemoveMenu 32767

    Habe mal mit dem ResHacker in die Profan.exe bzw. Prfrun32.exe geschaut. Im Unterpunkt Menu

    findet man eine Position 'Leer'

    Darin befindet sich das Copyright-zeichen ud deren Menüpunkt 32767.

    Macht man natürlich nach dem Fensteraufbau. Funktioniert im Interpreter

    als auch in der fertigen .exe.

    Na dann noch eine Spielerei mit Zufallswörtern :

    Code
    DEF RandomWort(1) IF(Len(@$(1), ",") > 1, SubStr$(@$(1), 1 + RND(Len(@$(1), ",")), ","), "")
    Randomize
    Print RandomWort("Hans,Susi,Kurt,Maria,Gerd")
    
    WaitInput

    Kann man bestimmt auch für andere Zwecke gebrauchen. Müssen ja nicht unbedingt

    Namen sein.


    Hallo, Volkmar

    Schön, daß es dir gefällt.

    In meinem Alter brauche ich sowas. Lesen und Kreuzworträtsel (wegen dem händischen

    Schreiben der Buchstaben) sind ja schon gut. Wenn man dann noch zusätzlich etwas

    programmiert, hilft das ungemein, den Geist fit zu halten.


    Ich finde das als ideale Ergänzung und kann es beim Älterwerden nur empfehlen.

    Es sollte auch durchaus öfter mal etwas kniffliger sein und nicht nur einen Code runterschreiben.

    Vielleicht mal so als Anregung an RGH :

    Könnte man Rnd(N1) auch ein Array von Ganzzahlen übergeben ?

    Also, daß Rnd() nur diejenigen Zahlen, die auch im Array sind, zufällig

    auswählt. Das Array könnte man ja bei jedem Durchlauf auf die

    verbliebenen Zahlen neu modifizieren.


    Hintergrund ist eine softwaremäßige Lotto-Ziehungsmaschine.

    Wenn man nun so eine Ausspielung 6 aus 49 betrachtet, sind es

    ja immer Einzelziehungen bei jedem Neustart der Trommel. Da

    ja dann immer eine Zahl fehlt, kommt ja die fortlaufende Nummerierung

    nicht mehr in Frage. Man sagt zwar so schön 6 aus 49, das wäre aber streng

    genommen nur dann, wenn die 6 gezogenen Zahlen nach einmaligem

    Mischen alle mit einem Plumps rausfallen würden.


    Theorethisch ist es ja so :


    1 Zahl aus 49 möglichen

    1 Zahl aus 48 möglichen

    1 Zahl aus 47 möglichen

    1 Zahl aus 46 möglichen

    1 Zahl aus 45 möglichen

    1 Zahl aus 44 möglichen


    Geht ja auch nicht anders, sonst hätten wir ja öfter doppelt gezogene Zahlen, wo dann

    immer ein weiterer Lauf nötig wäre, solange eine doppelte vorhanden wäre.

    Wenn Rnd() auch ein Array aktzeptieren würde, wäre so eine Ziehung mehr

    realitätsnäher.


    Ich frage auch deshalb, weil ich im Netz solche Online - Generatoren gesehen habe,

    denen man z.B. einen Pool an Wörtern mit Komma getrennt übergibt und dieser dann

    ein Wort zufällig auswählt. Da gibt es ja auch keine Sortierung bzw. Reihenfolge und

    die Unter- und Obergrenze ist variabel.


    Da würde man sich viel Overhead sparen oder hat jemand da noch eine andere Idee ?

    Ist auch nur mal als Gedankenanregung gedacht, damit das Forum hier wieder etwas

    belebt wird ;)