home *** CD-ROM | disk | FTP | other *** search
/ Commodore Disc 53 / Commodore_Disc_53_19xx_-_de.d64 / lektion7 < prev    next >
Text File  |  2022-10-26  |  5KB  |  127 lines

  1. /* Lektion7
  2.  
  3. Parameter und dynamische Variablen
  4.  
  5. Einer Funktion einen Parameter zu uebergeben ist mit Hilfe des Registers HR kein Problem. Zur Not gingen auch zwei Parameter mit Hilfe von NR. Fuer mehr als zwei Werte ist dieses Verfahren nicht zu gebrauchen.
  6.  
  7. Eine Funktion namens fuellen soll einen Speicherbereich mit einem Wert fuellen. Wir haetten zu uebergeben die Anfangsadresse des Speicherbereiches, den Wert und die Anzahl der Bytes. Dies kann folgendermassen geschehen:
  8.  
  9. ( screen , 'a' , 1000 fuellen )
  10.  
  11. Die Uebergabe kann ganz ohne globale Variablen erfolgen. Der Kommabefehl legt einen Wert in HR auf dem bereits bekannten Stapel ab. Eine oeffnende Klammer bewirkt etwas zusaetzliches, das bisher noch nicht besprochen wurde. Sie sichert den Stand des Parameterstapels auf dem Returnstapel. Eine schliessende Klammer berichtigt mit Hilfe des gesicherten Stapelstandes den Parameterstapel wieder. Wir duerfen daher innerhalb von Klammern einfach Werte auf den Parameterstapel befoerdern, auf welche dann eine Funktion (fuellen) zugreifen kann. Dies geschieht mit Hilfe von Parametervariablen:
  12.  
  13. void fuellen( adr zeichen )
  14. begin
  15.   int anzahl ;
  16.   go prf
  17. : wr zeichen ] adr ]++ by =
  18. : prf anzahl ]-- if wr
  19. bend
  20.  
  21. Dynamische Variablen sind Variablen, die sich auf dem Parameterstapel befinden. Funktionen, die solche Variablen benuetzen, muessen immer, auch wenn beim Aufruf keine Wertuebergabe stattfindet, innerhalb von Klammern aufgerufen werden. In der Klammer der Funktionsvereinbarung sind fuer die uebergebenen Werte Variablennamen anzugeben. Die Anzahl dieser Namen muss mit der Anzahl der Werte uebereinstimmen, sofern noch weitere dynamische Variablen innerhalb der Funktion definiert werden sollen. Im Beispiel wurden nur adr und zeichen als Parametervariablen angegeben, denn der letzte Wert anzahl wurde lediglich durch HR uebergeben. Diesen Wert haben wir zur Abwechslung in einer dynamischen Variablen abgelegt. Dynamische Variablen werden nach begin im Codebereich vereinbart. Die Vereinbarung ist mit Hilfe von int und char, fast genauso wie bei statischen Variablen moeglich. Kommas und Strichpunkte, die die Namen trennen beziehungsweise die Vereinbarung abschliessen, werden als Befehl, den Inhalt von HR auf den Stapel zu legen uebersetzt. Es kann daher bei der Definition bereits eine Zuweisung vorgenommen werden:
  22.  
  23. int a 5 3 + ;
  24.  
  25. Sogar Arithmetische Ausdruecke sind moeglich. Diese Ausdruecke duerfen aber keine Kommas oder Strichpunkte enthalten.
  26.  
  27. Verboten ist:
  28. int a ( 5 , 3 exp ) ;
  29.  
  30. Moeglich dagegen:
  31. ( 5 , 3 exp ) int a ;
  32.  
  33. Eine wiederholte Vereinbarung in einer Programmschleife gilt es zu vermeiden. Also bitte nicht:
  34.  
  35. : lab int a ;
  36.   getc nif lab
  37.  
  38. Moeglich waere bei unserer Funktion fuellen auch gewesen:
  39.  
  40. void fuellen( adr zeichen anzahl )
  41. begin ,
  42.  
  43. Hier stimmt die Anzahl der Variablen nicht mit den Werten auf dem Stapel ueberein, jedoch ein Komma nach begin legt den Wert nachtraeglich auf dem Stapel in anzahl ab. Der Vereinbarung weiterer dynamischer Variablen steht nichts mehr im Wege. Dynamische Variablen werden bei jedem Funktionsaufruf neu angelegt und behalten daher ihre Werte nicht bei, wie dieses bei statischen Variablen der Fall ist.
  44.  
  45. Es ist auch moeglich, eine unbestimmte Anzahl von Parametern zu uebergeben. Nur duerfen dann keine weiteren dynamischen Variablen innerhalb der Funktion mehr vereinbart werden, da der Compiler wegen Nichtkenntnis der Parameterzahl nicht deren Positionierung bestimmen kann. Aber fuer diesen Fall gibt es ja auch noch die statischen Variablen.
  46.  
  47. Ein Beispiel hierzu ist die Anweisung print, die im Unterschied zu putl mehrere Strings auszugeben vermag:
  48.  
  49. a$ putl b$ putl c$ putl
  50. ( a$ , b$ , c$ print )
  51.  
  52. Wir vereinbaren:
  53.  
  54. void print( liste )
  55. int zg ;
  56. begin , 0 ,
  57.   liste zg = ]
  58. : lab putl 2 zg += ] if lab
  59. bend
  60.  
  61. Nur fuer den ersten Wert wird eine Variable namens liste vereinbart. Nach begin wird der letzte Wert auf den Stapel gebracht und zusaetzlich eine Null, die das Ende der Liste markiert. Nach der Zuweisung liste zg = zeigt zg auf den Parameterstapel, wo sich die Variable liste befindet. Deren Inhalt ist die Adresse des ersten Strings. Die Ausgabe kann erfolgen. Nach Erhoehung des Zeigers zg um den Wert zwei wird auf die weiteren Parameter zugegriffen, bis die Nullmarkierung erreicht wird.
  62.  
  63. Programmbeispiel:
  64. */
  65.  
  66.  
  67. def cls 147 putc;
  68. def ]]++ ]++ by ];
  69.  
  70. void putc( )
  71. begin
  72.   ac by = 0xffd2 sys
  73. bend
  74.  
  75. void putl( )
  76. int zg ;
  77. begin
  78.   zg = go rd
  79. : wr putc
  80. : rd zg ]]++ if wr
  81. bend
  82.  
  83. char getc( )
  84. begin
  85.   0xffe4 sys ac by ]
  86. bend
  87.  
  88. char key( )
  89. begin
  90. : next getc nif next
  91. bend
  92.  
  93. void fuellen( adr zeichen anzahl )
  94. begin ,
  95.   zeichen ] go prf
  96. : wr swap adr ]++ by =
  97. : prf anzahl ]-- if wr
  98. bend
  99.  
  100. void print( liste )
  101. int zg ;
  102. begin , 0 ,
  103.   liste zg = ]
  104. : lab putl 2 zg += ] if lab
  105. bend
  106.  
  107. main()
  108. char
  109.   fu "( 1024 , 'a' , 1000 fuellen )"
  110. , taste " Weiter mit Taste "
  111. , fi "( 1024 , 'b' , 1000 fill )" ;
  112. begin
  113.  
  114. ( "/147Die Funktion " , fu , " fuellt den ganzen Bildschirm./n/n/n" , taste print )
  115.  
  116.   key ( 1024 , 'a' , 1000 fuellen )
  117.   ( "/19" , taste print ) key
  118.  
  119. ( "/147Die bereits in CP enthaltene Funktion/n" , fi , " ist/nwesentlich schneller./n/n/n" , taste print )
  120.  
  121.   key ( 1024 , 'b' , 1000 fill )
  122.   ( "/19" , taste print ) key cls
  123. bend
  124.  
  125.  
  126. /* Weiter mit lektion8 */
  127.