Software > Coding

Gemeinschaftsprojekt?

<< < (13/18) > >>

Dennis Schulmeister:
Hallo,

Singemäß wäre das so:


--- Code: ---void main(int, char**);
void recursive_function(int, int);

void recursive_function(int amount, int max_depth) {
   int count = amount + 1;

   if (count > max_depth) {
      return;
   }

   printf("%i ", count);
   recursive_function(count, max_depth);
}

void main(int argc, char** argv) {
  recursive_function(0, 10);
  return 0;
}

--- Ende Code ---

count ist hier eine lokale Variable, die auf dem Stack liegt und somit nur innerhalb der Funktion existiert. Ruft sich die Funktion selbst nochmal auf, entsteht ein neuer Stack Frame, auf dem dieselbe Variable aber mit anderem Wert liegt. Nach Verlassen der rekursiv aufgerufenen Funktion befindet sich das Programm wieder im urpsünglichen Aufruf, wo die Variable wieder ihren alten Wert besitzt.

Die Ausgabe des Programms (wenn der Formatstring für printf stimmt) ist also: 1 2 3 4 5 6 7 8 9 10

Gruß,
Dennis

Dennis Schulmeister:
PS: Vertauscht man folgende Zeilen, ist die Ausgabe des Programms 10 9 8 7 6 5 4 3 2 1, was den Sachverhalt noch besser verdeutlicht.


--- Code: ---   printf("%i ", count);
   recursive_function(count, max_depth);

--- Ende Code ---

simonsunnyboy:
Im tos.hyp steht übrigens alles was ihr braucht %)

http://toshyp.atari.org/de/005014.html#DTA

m0n0:
Ok, hier ist Teil 2.

Code:
(Vorsicht, kommentare sind etwas abweichend von denen im Zip Archiv, da fehlt ein kleiner absatz - aber sind ja nur kommentare ;) )


--- Code: ---/* funktionen wie memcpy, strcpy... bekannt machen: */
#include <string.h>

/* auch die standard funktionen bekannt machen:     */
#include <stdlib.h>
#include <stdio.h>

/* Standard TOS funktionen bekannt machen:          */

#include <tos.h>
#include <vdi.h>

/* Textbildschirm Funktionen bekannt machen         */
/* Diese Datei enthaelt makros (d.h. nichts anderes */
/* als Aliase fuer bestimmte kommandos, wer         */
/* interesse hat, was ich meine, schut einmal kurz  */
/* die Datei hinein                                 */
#include <screen.h>


/* Ein string konstante definieren:                 */
/* __DATE__ ist standard und wird vom               */
/* Compiler auf das aktuelle Datum gesetzt          */

#define VERSION     "0.1 - (" __DATE__ ")"


/* Neue (eigene) funktion textxy,                   */
/* ------------------------------------------------ */
/* Diese Funktion ist im gegensatz zu main() nicht  */
/* Pflicht. Es ist eine völlig eigens definierte    */
/* Funktion die machen kann was sie will, bzw. was  */
/* wir wollen.                                      */
/* man koennte sich auch anders benennen oder andere*/
/* dinge tun lassen....                             */
/* ------------------------------------------------ */
/* mit dieser Funktion kann man einen text an einer */
/* bestimmten stelle am Bildschirm ausgeben.        */
/* Die ersten beiden Parameter bestimmen die        */
/* Postion, sie sind vom typ short - das heisste    */
/* bei purec: 16 bit maximalwert.                   */
/* der parameter inv bestimmt ob schwarz auf weiss  */
/* oder weiss auf schwarz ausgegeben werden soll    */
/* der letzte parameter beinhaltet eine             */
/* Speicheradresse an die auszugebenden buchstaben  */
/* stehen, das ende der buchstaben wird durch ein   */
/* null byte markiert. (Uebernimmt der compiler     */
/* fuer gewoehnlich                                 */
/* Wichtig ist, das diese Funktion ueber main()     */
/* ausprogrammiert wird, bzw. vor jeder anderen     */
/* funktion in der diese funktin genutzt werden soll*/
/* der compiler kann nur aufrufen was er kennt....  */
/* es gibt auch die moeglichkeit funkt. aufzurufen  */
/* die nach dem aufruf ausprogrammiert sind.        */
/* aber das benoetigt eine vorherige "deklaration"  */
/* - darauf verzichten wir in diesem projekt        */

void textxy(short x, short y, short inv, char * str)
{
    /* wenn parameter inv (invertiert) ungleich 0   */
    /* ist-dann wird der reverse mode eingeschaltet */
    /* d.h. weiss auf schwarze ausgabe              */
    if( inv != 0 ) {
        /* Makro das in screen.h definiert wurde:   */
        Rev_on();
    }
    /* Jetzt wird der cursor an die gewuenschte     */
    /* Stelle gesetzt, diese anweisung ist ebenfalls*/
    /* in screen.h definiert                        */
    Goto_pos( y, x );
    
    /* Diese funktion kennen wir schon:             */
    /* wir merken: Cconws gibt immer an der moment. */
    /* cursor-position den text aus.                */
    Cconws( str );
    
    /* wenn inv ungleich 0 ist, dann wird der       */
    /* modus wieder auf normal gesetzt.             */
    if( inv != 0  ) {
        Rev_off();
    }
}

/* Hauptprogramm, wird aufgerufen nach start des Programms: */
int main(void)
{
    /* Anstatt Cconws rufen wir jetzt   */
    /* unsere eigene Textausgabe routine*/
    /* auf! */
    /* Spalte 2, Zeile 1, Invers, Text */

    textxy( 3, 1, 1,"SimpleBoot Version " VERSION );

    
    /* am ende wird nochmal ein Ruecklauf /         */
    /* Zeilenumbruch ausgegeben, damit die Konsole  */
    /* auf der wir ausgeben "sauber" ist.           */
    /* (testet einfach mal was passiert wenn man es */
    /* weglaesst.                                   */

    Cconws("\r\n");

    
    /* da die funktion main() den rueckgabetyp "int"*/
    /* (je nach compiler einstellung 16 oder        */
    /*  32 bit zahl) hat, muss ein entsprechender   */
    /* wert zurueckgegeben werden - 0 bedeutet: kein*/
    /* fehler.                                      */

    return( 0 );
}


--- Ende Code ---

P.S.: Wer unter Magic entwickelt, der kann das Programm mit der mitgelieferten Konsole/Shell laufen lassen ( cmd.prg ? ) .  Unter purem TOS kann ich dieses Programm empfehlen:

http://www.umich.edu/~archive/atari/Cli/ashell.lzh

(Aber eigentlich nur weil ich kein anderes kenne .... )

Unter FreeMiNT kann man das ganze gut mit Conholio oder Toswin2 testen.  

Arthur:
Ich hab die Projektdatei für ahcc selbst angepasst und es kompiliert. Da ich keine Konsole benutze hab ich ein getchar (); hinter die Textausgabe gepackt so dass das Programm erst nach einem Tastendruck beendet wird.


--- Code: ---    textxy( 3, 1, 1,"SimpleBoot Version " VERSION );
    getchar();

--- Ende Code ---


Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln