ALGORITHMEN - Teil XVIII: Neueste Fortschritte in Künstlicher Dummheit

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Information: Wir verlosen 9 Kinderbüchlein von Microsoft Mein Papa arbeitet bei Microsoft. Und ich darf mit!

    Unsere Datenschutzerklärung wurde aktualisiert. Mit der Nutzung unseres Forums akzeptierst Du unsere Datenschutzerklärung. Du bestätigst zudem, dass Du mindestens 16 Jahre alt bist.

    • Abt. Noch´n Rosetta Code: ´Verheiratete Folgen´
      =====================================
      Auch in XProfan kann man Algorithmen realisieren, in denen sich mehrere REKURSIVE Prozeduren gegenseitig aufrufen, solange man an die Geschwindigkeit nur moderate Anforderungen stellt. Beweis anbei.
      Gruss

      Quellcode

      1. WindowTitle "Douglas R. Hofstadter´s VERHEIRATETE FOLGEN erzeugen"
      2. 'Q: http://rosettacode.org/wiki/Mutual_recursion 'p.specht 2018-09
      3. AppendMenubar 100,"...mittels gegenseitig-rekursiver Aufrufe!"
      4. 'https://en.wikipedia.org/wiki/Hofstadter_sequence#Hofstadter_Female_and_Male_sequences
      5. 'Write two mutually recursive functions that compute members of the
      6. '*Hofstadter Female and Male sequences* defined as:
      7. ' F(0)=1:M(0)=0
      8. ' F(n)=n-M(F(n-1)),n>0
      9. ' M(n)=n-F(M(n-1)),n>0
      10. 'F sequence:
      11. ' 1 1 2 2 3 3 4 5 5 6 6 7 8 8 9 9 10 11 11 12 13
      12. 'M sequence:
      13. ' 0 0 1 2 2 3 4 4 5 6 6 7 7 8 9 9 10 11 11 12 12
      14. Set("numwidth",3):var to&=20'56
      15. PRINT "\n F sequence:\n"
      16. Whileloop 0,to&
      17. PRINT FNf(&Loop);
      18. EndWhile
      19. PRINT "\n\n M sequence:\n"
      20. Whileloop 0,to&
      21. PRINT FNm(&Loop);
      22. Endwhile
      23. beep:Waitinput
      24. END
      25. Proc FNf :parameters n%
      26. IF n%=0:n%=1:ELSE: n%=n%-FNm(FNf(n%-1)):ENDIF
      27. return n%
      28. Endproc
      29. Proc FNm :parameters n%
      30. IF n%=0:ELSE:n%=n%-FNf(FNm(n%-1)):ENDIF
      31. return n%
      32. EndProc
      Alles anzeigen
    • Abt. UnvmR 14´Wie man Leser verscheucht´
      =================================
      Wusstet Ihr schon, daß das Integral(x=-Inf..+Inf: x/Sqrt(x^4+10*x^2-96*x-71) ; dx) =
      -1/8*ln((x^6+15*x^4-80*x^3+27*x^2-528*x+781)*Sqrt(x^4+10*x^2-96*x-71)-(x^8+20*x^6-128*x^5+54*x^4-1408*x^3+3124*x^2+10001))+C ist?
      Eine alte Verleger-Weisheit besagt: Jede mathematische Formel in einem Blog oder Druckwerk vergrault die Hälfte der Leser. Frage: Wieviele Formeln muss der Autor abdrucken, damit von 19.683 Lesern nur noch 3 übrig bleiben?
    • Lösung zu UnvmR 14
      --------------------
      Ansatz:
      19683 * (1/2)^x = 3
      19683 = 3 * 2^x
      19683 / 3 = 2^x
      6561 = 2^x
      ln(6561) = ln(2^x) = x * ln(2)
      ln(6561) / ln(2) = Lg(6561) / Lg(2) = 3.8163 / 0.301 = 12.68

      Von 19683 auf 3 kommt man also in 12.68 Halbierungsschritten, es sind somit:
      Antwort: 12 Formeln und eine fast fertige = 13 Formeln erforderlich.
    • Abt. Sophomore-Gleichung mit verbessertem Algorithmus
      ==========================================
      Gibt man in der Gleichung y = x^x ein y vor, dann erweist sich die Frage, welches x diese Gleichung erfüllt als erstaunlich kompliziert und nicht mit elementaren mathematischen Funktionen lösbar. Dank Computer, Herrn Isaac Newton und einigen von mir beigesteuerten Tricks kann die Frage im Bereich 1.13 <= y <= 10^99 nun auch mit XProfan in kurzer Zeit gelöst werden.
      Gruss

      Quellcode

      1. Windowtitle " Sophomore-Gleichung: Approximation mittels Newton-Specht ;-)"
      2. AppendMenuBar 100," y = f(x) = x^x ; Bereich 1.13 <= y <= 10^99 , Ges: x = ? "
      3. CLS
      4. set("decimals",17)
      5. declare W$,x!,y!,eps!
      6. eps!=val("5E-16")
      7. WHILE 1
      8. locate 1,1:print "\n\n Y = ";
      9. locate 3,7:w$="1":input w$:y!=val(w$)
      10. if y!=1 : x!=0
      11. print "\n Für y=1 gilt x = 0 wegen 0^0 = 1 (´Lokale Definition´)"
      12. CONTINUE
      13. endif
      14. case (y!<1.13) or (y!>1e99)
      15. CONTINUE
      16. x!=1000
      17. REPEAT
      18. 'x!=x! - ( y!-x!^x! ) / (-1*(x!^x!)*(ln(x!)+1))
      19. 'x!=x! - 1/(ln(x!)+1) + y!/(x!^x!*(ln(x!)+1))
      20. 'x!=x! - 1/(ln(x!)+1) + y!*x!^(-x!)/(ln(x!)+1)
      21. 'x!=x! - 1/(lg(x!)+1) + y!*x!^(-x!)/(lg(x!)+1)
      22. 'Specht´s Beschleunigung:
      23. x!=x! - 1/(lg(x!)+1) + y!*x!^(-x!)/(lg(x!)+1)
      24. case (x!-ln(y!))>10000:x!=x!-1000
      25. 'Abbruchkriterium neu:
      26. case (abs(x!*ln(x!)-ln(y!))/ln(y!))<eps!:BREAK
      27. UNTIL 0
      28. font 2:print "\n X = ",x!
      29. font 0:sound 3000,30
      30. print "\n Probe: ";format$("%g",x!^x!),
      31. print " Abs.Fehler: ";format$("%g",abs(x!^x!-y!))
      32. waitinput
      33. CLS
      34. ENDWHILE
      35. END
      Alles anzeigen

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von p. specht ()

    • Abt. Rosetta Code "Längste ansteigende Unterfolge"
      =======================================
      Klappt, nach längerer Fehlersuche: Die Rück-Übergabe von Dynamischen Arrays aus einer Proc heraus, aber ohne dass diese in der Parameters-Liste vorkommt - erfordert dennoch vorab eine globale Deklaration dieses Arrays. Mit Declare imn der Proc selbst ging es nicht - zumindest nicht beim untenstehenden ´Proc ToList´.
      Gruss

      P.S.: Wie heißt es doch gleich bei Michael W.: Programmieren, das spannenste Detektivspiel der Welt - wie wahr!

      Quellcode

      1. WindowTitle "Längste ansteigende Unterfolge suchen"
      2. 'Q:http://rosettacode.org/wiki/Longest_increasing_subsequence#VBScript
      3. 'Calculate and show here a longest increasing subsequence of the list:
      4. ' {3,2,6,4,5,1} 'and of the list:
      5. ' {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15}
      6. 'Note that a list may have more than one subsequence that is of the maximum length.
      7. 'Output:
      8. '2,4,5,
      9. '0,2,6,9,11,15,
      10. PROC SUBLIST :parameters arr&[]
      11. Declare n&,p&[],m&[],s&[],l&,lo&,hi&,middle&,newl&,i&,k&
      12. n&=sizeof(arr&[])
      13. SetSize p&[],n&
      14. SetSize m&[],n&
      15. l& = 0
      16. WHILELOOP 0,n&-1:i&=&Loop
      17. lo& = 1
      18. hi& = l&
      19. While lo&<=hi&
      20. middle&=(lo&+hi&)\2
      21. If Arr&[m&[middle&]] < Arr&[i&]
      22. lo& = middle& + 1
      23. Else
      24. hi& = middle& - 1
      25. EndIf
      26. Endwhile
      27. newl& = lo&
      28. p&[i&] = m&[newl&-1]
      29. m&[newl&] = i&
      30. Case newL&>l&:l&=newl&
      31. ENDWHILE
      32. setsize s&[],l&
      33. k&=m&[l&]
      34. Whileloop l&-1,0,-1:i&=&Loop
      35. s&[i&] = arr&[k&]
      36. k& = p&[k&]
      37. Endwhile
      38. clear arr&[]
      39. return s&[]
      40. EndProc
      41. proc toList :parameters L$
      42. declare tmp$[]:tmp$[]=explode(L$,",")
      43. clear List1&[]:setSize List1&[],sizeof(tmp$[])
      44. List1&[]=val(tmp$[&index]):clear tmp$[]
      45. return List1&[]
      46. Endproc
      47. proc prtlst :parameters out&[]
      48. print "\n ";:var v&=sizeof(out&[])
      49. whileloop v&:print out&[&Loop-1];if(&Loop<v&,","," ");
      50. endwhile:print:clear out&[]
      51. endproc
      52. 'MAIN:
      53. var L1$="3,2,6,4,5,1"
      54. var L2$="0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15"
      55. CLS:Font 2
      56. declare List1&[]
      57. 'prtlst(toList(L1$))
      58. prtlst(SUBLIST(toList(L1$)))
      59. 'prtlst(toList(L2$))
      60. prtlst(SUBLIST(toList(L2$)))
      61. print "\n OK.":Sound 4000,20:Waitinput
      62. END
      Alles anzeigen

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von p. specht ()

    • Abt. UnvmR 15 ´Rotationen´
      =====================
      Ein Radfahrer legt in einer Sekunde 5 m zurück. Die Räder seines Fahrrades haben einen Umfang von je 125 cm. Wie viele komplette Umdrehungen macht jedes Rad in 5 Sekunden?

      Abt. UnvmR 16 ´Drei Seiten´
      =====================
      Evi addiert die Längen von drei der vier Seiten eines Rechtecks und erhält 44 cm. Ulla addierte auch die Längen
      von drei Seiten desselben Rechtecks, erhielt aber 40 cm. Frage: Wie groß ist der Umfang des Rechtecks?

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von p. specht ()

    • Lösung zu UnvmR 15
      --------------------
      Spoiler anzeigen

      5 [m/s] * 5 s = 25 m Strecke
      Umdrehungen = Strecke / Radumfang
      = 25 m / 1.25 m = 20 Umdrehungen


      Lösung zu UnvmR 16
      -------------------
      Spoiler anzeigen

      Ein Rechteck hat 2 lange und zwei kurze Seiten. Zählt man jeweils drei Seiten davon zusammen, so kann die Ursache für Unterschiede nur in der Zusammensetzung durch ´lange´ und ´kurze´ Seiten liegen:

      Evi: (1) 44 = 2 Lang + 1 Kurz
      Ulla (2) 40 = 1 Lang + 2 Kurz
      (2 * 2) 80 = 2 Lang + 4 Kurz
      -------------------------------------
      (2*2)-(1): 36 = 3 Kurz >>> Kurz = 12 cm
      Eingesetzt in (2): 40 = 1 Lang + 2 * 12 >>> 40 - 24 = Lang = 16 cm

      Umfang = 2 Lang + 2 Kurz = 2*16 + 2*12 = 32 + 24 = 56 cm
      -------------------------------------------------------------
      Probe:
      2*16+12 = 32 + 12 = 44
      16 + 2*12 = 16+24= 40
      q.e.d.
    • Abt. Und noch viel mehr Rätsel - UnvmR 17
      ================================
      Die Fahrt von Armdorf nach Reichstadt über Mittelhausen dauert 130 Minuten. Die Fahrt von Armdorf nach Mittelhausen dauert 35 Minuten. Wie viele Minuten dauert die Fahrt von Mittelhausen nach Reichstadt?

      Abt. UnvmR 18
      ===========
      Der Tierarzt des Zoos hat festgestellt: In der Gruppe der Kängurus wiegen die beiden Leichtesten 25 % des Gesamtgewichts der ganzen Gruppe. Die drei Schwersten wiegen 60 % des Gesamtgewichts. Wie viele Kängurus sind in der Gruppe?
    • Lösung zu UnvmR 17
      ---------------------------
      Spoiler anzeigen

      A--M--R
      | 130 |
      |35| ?|
      130 - 35 = 95 min

      Lösung zu UnvmR 18
      -------------------------
      Spoiler anzeigen
      Gruppengewicht * 25/100 = K1 + K2 >>> ein Leichtes wiegt durchschnittlich 12.5
      Gruppengewicht * 60/100 = S1 + S2 + S3 >>> ein Schweres wiegt durchschn. 20
      Alle zusammen müssen 100 / 100 ergeben, also fehlen noch 15:

      Gruppengewicht * 15/100 = Restliche(s) >>> ein Mittleres wiegt ca. 15,
      Es ist gibt nur ein Mittelschweres, weil die Bedingung ja lautet 12.5 < 15 < 20.
      Wären es nämlich 2 Mittlere, dann wöge jedes nur ca. 7.5 = leichter als die Leichten (Widerspruch!).

      Folglich: Es sind 2 + 3 + 1 = 6 Kängurus in der Gruppe.
      [/spoilsr]

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von p. specht ()

    • Abt. UnvmR 19 ´Ziffer überhört´
      ======================
      Von Paules siebenstelliger Telefonnummer habe ich 6 Ziffern in der richtigen Reihenfolge notiert. Ich weiß nicht, welche Ziffer ich vergessen habe und wo sie fehlt. Wie viele Rufnummern muss ich höchstens ausprobieren, um sicher zu sein, dass die richtige auch dabei ist? Die vorderste Ziffer könnte übrigens auch 0 gewesen sein...
    • Lösung zu UnvmR 19
      ===============

      Spoiler anzeigen
      Im ersten Augenblick scheint die Aufgabe einfach: Es gibt 7 Stellen, an denen man eine Zahl vergessen haben könnte:
      Vorne, zwischen den 6 bekannten Ziffern (=5 Stellen), und hinten. Da wir es mit 10 möglichen Ziffern 0 - 9 zu tun haben, sind an sich prinzipiell einmal 7 * 10 = 70 Möglichkeiten des Einfügens gegeben.

      Jedoch: 123 3 456 ist die selbe Nummer wie 12 3 3456 ! - und dabei ist egal, ob man die selbe Ziffer vor einer gleichen oder nach einer gleichen Telefonziffer einfügt. Daher muss man zu Beginn alle 10 Ziffern ausprobieren, danach aber nurmehr die 9 anderen an den sechs restlichen Stellen! Das gibt dann in Wirkllichkeit nur 10 + 6*9 = 10 + 54 = 64 Möglichkeiten.

    • Abt. Skepsis für Anfänger: Wie man Behauptungen beurteilt
      ==========================================
      1. Ist der Überbringer der Info verlässlich?
      2. Ist die Quelle existent und verlässlich?
      3. Was spricht alles dafür?
      4. Welches Gewicht hat die Aussage?
      5. Hat jemand versucht, die Behauptung zu widerlegen?
      6. Kann ich selbst die Behauptung falsifizieren? (Experiment, Erfahrung)
      7. Kann man die Behauptung prinzipiell falsifizieren?
      8. Was denken die Gegner, was dagegen spricht?
      9. Ist es bloss singuläre / persönliche Erfahrung / Werthaltung?
      10. Steckt eine Ideologie / ein Glaubenssystem / Sendungsbewusstsein dahinter?
      11. Hat der Informant Vorteile daraus? Fließt etwa Geld?
      12. Eröffnet die Behauptung neue Möglichkeiten, ohne alten Erfahrungen zu widersprechen?
      13. Erklärt die Behauptung reelle Phänomene?
      14. Wird mein Beitrag zu etwas "Grossem" eingefordert?
      15. Sprechen Logik und/oder erhärtete Naturgesetze gegen die Behauptung?
      16. Gibt es Fachleute, die den inneren Gehalt der Behauptung beurteilen können?
      17. Haben diese Fachleute Eigeninteressen?
      18. Wer hat diese Fachleute als solche bestätigt?
      19. Wer verlieh diesen Bestätigern die Kompetenz dazu?
      20. Geht es um Triebe, um Macht und Einfluss?
      ------------------------------------------------------------
      Bleibe skeptisch!
    • Abt. UnvmR 20 ´Halbkreis´
      ====================
      Fritz hat sich mühsam einen Kreis aus Goldfolie ausgeschnitten, doch sein böses Schwesterchen hat, kaum dass er mal kurz weg war, die Hälfte abgeschnitten und beide Häflten versteckt. "Gib das sofort zurück!" befiehlt Fritz. Schwesterchen meint dazu aber: "Nur wenn du mir sagen kannst, wie lang der Schnitt ist, denn ich gemacht habe - zumindest ungefähr! Die Fläche des einen Stücks ist jedenfalls 628 mm²". Wer hilft Fritz?

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von p. specht ()

    • Lösung zu UnvmR 20 ´Halbkreis´
      -----------------------------------
      Spoiler anzeigen
      Praxisgerechte Lösung: Fritz misst auf dem Reststück der Folie den Durchmesser des Kreislochs, und bekommt so sein Eigentum zurück.

      Mathematische Lösung:
      Kreisfläche F = r^2 * Pi ; Halbkreis-Fläche daher: Fh = r^2 * Pi / 2 wobei r = d/2
      Überlegungen: "... der Schnitt" = ein (1) Schnitt >>> Halbkreisschnitt-Länge = Durchmesser d

      Ansatz: Fh = r^2 * Pi / 2 = (d/2)^2*Pi / 2 = d^2/2^2 * Pi / 2 = d^2/4 * Pi/2
      Somit: Fh = d^2 * Pi / 8 , umgeformt: 8 * Fh / Pi = d^2 >>> d = Sqrt( 8 * Fh / Pi )
      Einsetzen: d = Sqrt ( 8 * 628 / Pi ) ~ sqrt(1600) = 40 mm
      Antwort: Der Schnitt ist ~40 mm lang.
      ---------------------------------------
      Probe: d = 40 >>> r = 20; Fh = r^2*Pi / 2 = 20^2/2 * Pi = ~628 mm², passt.

    • Abt. UNIFICATION (Doubletten rausschmeissen)
      ===================================
      Am Beispiel eines Arrays der Größe N Elemente, das mit Zufallszahlen aus [0..N] geladen ist, sollen die Doubletten erkannt und in einem zweiten Array nicht mehr aufgenommen werden. Der hier verfolgte Ansatz nutzt keine Sortierung oder lexikallische Clusterung, sodern geht naiv alle schon bekannten Elemente vergleichend durch. In der Praxis wird der erforderliche Vergleich der (erst zu generierenden) Schlüsselelemente noch deutlich mehr Zeit beanspruchen, aber nachstehender Benchmark lieferte zumindest erste Anhaltspunkte.

      Spoiler anzeigen
      XPROFAN-11.2a Interpreter
      Anzahl Elemente : Unifizierungszeit für ca. 34% Doubletten
      100:0.23 s, 200:0.732 s, 300:1.685 s, 400:2.76 s, 500:4.551 s,
      600:6.64 s, 700:9.093 s, 800:11.139 s, 900:14.293 s,
      1000:18.706 s, 1100:22.411 s, 1200:25.822 s, 1300:30.358 s,
      1400:40.949 s, 1500:82.196 s, 1600:84.034 s, 1700:52.755 s
      1800:71.889 s, 1900:134.462 s, 2000:147.544 s (2 min 27 s)

      XPROFAN 11.2a Compiler
      Anzahl Elemente : Unifizierungszeit von ~34% Doubletten s
      100:0.035 s
      200:0.151 s
      300:0.354 s
      400:0.58 s
      500:0.844 s
      600:1.263 s
      700:1.679 s
      800:2.308 s
      900:2.734 s
      1000:3.46 s
      1100:4.142 s
      1200:4.961 s
      1300:5.947 s
      1400:6.65 s
      1500:7.719 s
      1600:8.897 s
      1700:10.107 s

      1800:11.139 s
      1900:12.608 s
      2000:13.529 s
      2100:15.044 s
      2200:16.745 s
      2300:18.111 s
      2400:19.64 s
      2500:21.372 s
      2600:23.389 s
      2700:25.548 s
      2800:26.963 s
      2900:28.367 s
      3000:31.429 s
      3100:32.901 s
      3200:41.381 s
      3300:75.392 s
      3400:73.355 s
      3500:41.126 s
      3600:45.809 s
      3700:66.683 s
      3800:101.487 s
      3900:56.766 s
      4000:55.03 s
      4100:72.728 s
      4200:123.089 s
      4300:72.772 s
      4400:65.596 s
      4500:118.605 s
      4600:117.41 s
      4700:77.254 s
      4800:148.009 s
      4900:82.278 s
      5000:133.784 s (2 min 14 sek)
      P.S. Hier noch das Programm dazu:

      Quellcode

      1. WindowTitle "Unification Bench"
      2. '(CL) CopyLeft 2018-09 by p.specht, Vienna/EU
      3. ' No warranty whatsoever! OHNE JEDE GEWÄHR!
      4. CLS:print:font 2:randomize:clearclip
      5. var MAX&=5000
      6. $IFDEF COMPILER
      7. Putclip "XPROFAN COMPILER:\n"
      8. $ENDIF
      9. $IFDEF INTERPRETER
      10. Max&=1500
      11. Putclip "XPROFAN INTERPRETER:\n"
      12. $ENDIF
      13. declare w&[],Eintrag&,n&
      14. declare u&[],found&,tm&
      15. WHILELOOP MAX&
      16. n&=&Loop*100
      17. clear w&[],u&[]
      18. setsize w&[],n&
      19. w&[]=rnd(n&)
      20. print " Unifying ";sizeof(w&[]);" random elements:";
      21. tm&=&gettickcount
      22. Whileloop 0,sizeof(W&[])-1
      23. eintrag&=W&[&Loop]
      24. found&=0
      25. Whileloop 0,sizeof(u&[])-1
      26. if u&[&Loop]=Eintrag&
      27. found&=1
      28. BREAK
      29. endif
      30. endwhile
      31. if found&=0
      32. u&[sizeof(u&[])]=Eintrag&
      33. ' print "(";sizeof(u&[]);")";
      34. ' else
      35. ' casenot rnd(100):print ".";
      36. endif
      37. endwhile
      38. 'print
      39. tm&=&gettickcount-tm&
      40. 'waitinput
      41. 'print
      42. 'whileloop 0,sizeof(u&[])-1
      43. ' print u&[&loop],
      44. 'endwhile:print
      45. sound 1100,40
      46. 'Print "\n Unified array size = ";sizeof(u&[])
      47. print " ";int(sizeof(w&[])-sizeof(u&[])),\
      48. "Doublettes filtered in",format$("%g",tm&/1000),"sec"
      49. putclip str$(sizeof(w&[]))+":"+format$("%g",tm&/1000)+" s\n"
      50. 'print " OK."
      51. 'waitinput
      52. WEND
      53. sound 2000,300
      54. print:print "SIEHE ZWISCHENABLAGE !"
      55. End
      Alles anzeigen

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von p. specht ()

    • Abt. Weitere Experimente zur DynArray-Verwaltung
      ======================================
      Das Programm im vorigen Beitrag verwendet ein statisches und ein dynamisches Array. Auf statische, numerische Arrays kann mittels Assembler zugegriffen werden, weil die Adresse des 0.ten Elementes per addr(x![0]) korrekt ermittelbar ist und weitere Elemente im Adressbereich gleich dahinter liegen, in jeweils 4 oder (float) 8 Byte-Schritten.

      Anders bei Dynamischen numerischen Arrays: Hier liefert addr(a%[]) die Information, als wievieltes Element dieses Typs es declared wurde,und zwar in 4 Byte-Schritten ab -12. Werte sind also -12,-8.-4,0,4,8,12, etc. Es ist anzunehmen, dass an einer bestimmten Stammadresse plus diesem Versatz der Adressvektor auf das Nullte Element dieses Arraytyps steht. Diese Addresse liegt aber vermutlich in einem Bereich, der bei meinen Zugriffsversuchen stets Schutzverletzungen erzeugt. Schade für Assemblerprogrammierer - das Programm im vorigen Beitrag schreit geradezu nach Assembler!
      Gruss

      Quellcode

      1. WindowTitle "Als wievieltes Dyn-Array declared?"
      2. :proc ao$ :parameters x$:return ansitooem$(x$):endproc
      3. cls:font 1:declare v&
      4. Declare a%[],b%[],c%[],d%[],e%[]
      5. print chr$(34);a%[];chr$(34);" <<< print a%[] liefert Leerstring."
      6. print
      7. print " DynArray Typ %[]\n"
      8. print addr(a%[]),
      9. a%[0]=$FFFFFFFF
      10. print ",nach Init immer noch",addr(a%[]);" Wert: ";a%[0]
      11. print " Der abgespeicherter Wert liegt aber nicht an addr(a%[0]) = ";addr(a%[0])
      12. a%[1]=1234567890
      13. print " Der soeben dynamische zugewiesene Wert an a%[1] lautet ";a%[1]
      14. print " addr(a%[1]) auszulesen führt zur Falschmeldung 'Element gibt es nicht'"
      15. print addr(b%[])
      16. print addr(c%[])
      17. print addr(d%[])
      18. print addr(e%[])," ist somit das als ";int(addr(e%[])/4+4);". declarte Array dieses Typs."
      19. print
      20. Declare f&[],g&[],h&[],i&[],j&[],k&[]
      21. print " DynArray Typ &[]\n"
      22. print addr(f&[]),
      23. f&[0]=1
      24. print ",nach Init immer noch",addr(f&[])
      25. print addr(g&[])
      26. print addr(h&[])
      27. print addr(i&[])
      28. print addr(j&[])
      29. print addr(k&[])," ist somit das als ";int(addr(K&[])/4+4);". declarte Array dieses Typs."
      30. print
      31. Declare L$[],M$[]
      32. print ao$(" DynArray Typ $ : addr(L$[]) führt zu Absturz!")
      33. print
      34. Declare R# 'Dynamische Bereichsarrays sind in XProfan-11 nicht erlaubt
      35. print ao$(" DynArray Typ # : Dynamische Bereichsarrays sind nicht erlaubt!")
      36. print
      37. print " Ein einzelner undimensionierter Bereich hat die Addr:",addr(R#)
      38. print ao$(" Könnte als Prüfung ob DIMed verwendet werden!?")
      39. print
      40. print " Die nun DIMensionierte Bereichsvariable liegt im RAM bei:",
      41. dim R#,10
      42. print hex$(addr(R#)),ao$("Länge"),sizeof(R#)
      43. dispose R#
      44. waitinput
      45. End
      46. ProgEnd
      Alles anzeigen
    • Abt. Benchmark Statische vs. Dynamische Arrays
      =====================================
      Nachstehend werden 200,000 Elemente eines Statischen Arrays und ebensoviele Elemente eines Dynamischen Arrays declared, jeweils Werte zugewiesen, diese ausgelesen, um 1 erhöht und wieder in die Variable eingelesen. Ergebnis: Vom Timing her gibt es weder bei Interpreter noch Compiler signifikante Unterschiede zwischen diesen beiden Array-Arten - In einigen Fälen ist Dynamisch sogar etwas schneller als Statisch! Hätt´ ich nicht gedacht. :8O:
      Gruss

      Quellcode

      1. CLS:font 2
      2. var n&=200000
      3. declare static&[n&-1],dynamic&[],tm&
      4. tm&=&gettickcount
      5. whileloop 0,n&-1
      6. static&[&Loop]=1
      7. static&[&Loop]=static&[&Loop]+1
      8. endwhile
      9. tm&=&gettickcount-tm&
      10. print "\n Static Array: ";tm&;" ms"
      11. setsize dynamic&[],n&
      12. tm&=&gettickcount
      13. whileloop 0,n&-1
      14. dynamic&[&Loop]=1
      15. dynamic&[&Loop]=dynamic&[&Loop]+1
      16. endwhile
      17. tm&=&gettickcount-tm&
      18. print "\n Dynamic Array: ";tm&;" ms"
      19. Sound 500,50
      20. waitinput
      Alles anzeigen
    • Abt. Man lernt nie aus
      =================
      Folgendes funktioniert bestens, während z.B. if( 1 , print x$, input x$) nicht klappt:

      Quellcode

      1. CLS:font 2:print
      2. proc pr :parameters x&:print x&;:endproc
      3. if(0,tab(10),tab(55))
      4. if(0,pr(1),pr(0))
      5. waitinput
      6. end

      Beim Inline-IF() scheint es nur darauf anzukommen, daß zmindest ein Zahlenwert in den alternativen Funktionen zurückgegeben wird. Und: Eine Proc ohne Return gibt offenbar einen Nullwert zurück. Oder so ähnlich ...
      Gruss

      P.S.: if(1 bedeutet if(%true,<dann das hier>,<wenn nicht %true ddann as hier>)