Live Coding: ANSI C

  • Man wird dann nur verrückt gemacht , wenn Hochbegabte dann über Zeiger reden nur um ihr Wissen preisgeben.

    Naja, Zeiger sind inhärenter Bestandteil von C. Ohne kannst du ja nicht mal einen String bilden, ein Array verwenden oder die Parameter vom Programm auslesen … das ist keine Magie ;)

    Ah, da hat jemand beim Stream aufgepasst. :))

    root42 auf YouTube


    80486DX@33 MHz, 16 MiB RAM, Tseng ET4000 1 MiB, GUSar Lite & TNDY & SnarkBarker, PC MIDI Card + SC55 + MT-32, XT CF Lite, OSSC 1.6

  • Nein, den Stream habe ich gar nicht angeschaut.
    Mein Englisch mit 70 Jahren ist rapide runtergegangen.


    Ich hatte das bei die nur gelesen und dann auch meine Fragestellungen in den anderen speziellen Foren führte zu der Aussage.


    Gruss

  • Nein, den Stream habe ich gar nicht angeschaut.
    Mein Englisch mit 70 Jahren ist rapide runtergegangen.


    Ich hatte das bei die nur gelesen und dann auch meine Fragestellungen in den anderen speziellen Foren führte zu der Aussage.


    Gruss

    Ne, ich bezog mich auf H.EXEs Antwort. Sie nutzte ziemlich genau meine Wortwahl. Nichts für Ungut.

    root42 auf YouTube


    80486DX@33 MHz, 16 MiB RAM, Tseng ET4000 1 MiB, GUSar Lite & TNDY & SnarkBarker, PC MIDI Card + SC55 + MT-32, XT CF Lite, OSSC 1.6


  • In der "Schule"(Kolleg) waren sogar die Professoren zu feige sich damit auseinanderzusetzen... und sowas schimpfte sich Programmierer. Die Zeiger sind sofort entzaubert wenn man in Assembler mal sowas wie "mov eax, dword ptr [ebx]" benutzt hat. Alles andere in C ist meist "Syntax".


    Anfangs schwer ist dann nur sich genau vorzustellen was man konkret machen(mehrdimensionales Feld z.B.) will und wie man es formuliert / deklariert - komplexere Deklarationen sind oft verwirrend aber nicht erforderlich(es sei denn man beansprucht sich in C wirklich auszukennen).

    Ein Programm wie Doom z.B. benutzt als komplexeste Variante "Zeiger auf Zeiger" für einige Datanstrukturen(z.B. Texturen, Farbwerte, etc. ).


    root_42 - sehr gutes Video!

  • Danke.


    -------------------------------------

    int *zeiger = NULL;

    Int a=128;


    zeiger = &a;

    --------------------------------------


    Warum braucht man denn eigentlich Zeiger und benutzt nicht die einfachen Variablen die man entworfen hat?


    Gruss

    Einmal editiert, zuletzt von funkheld ()

  • Dein Beispiel ist trivial und dient nur dazu, etwas zu erklären. Natürlich könnte man hier gleich den Integer a verwenden. Aber manch einfach mal weiter, dann kommst du zu Strings, Arrays und Speicheradressen und merkst, dass Zeiger unverzichtbar sind.

  • Danke.


    Kannst du bitte eine komplexe Deklaration nennen die man durch eine einfache Sache ersetzten kann.


    Gruss


    Das offensichtlichste Beispiel wären Funktionen die Zeiger auf (eine) Funktion(en) returnieren.

    Hier wird der Syntax schnell komplex und unübersichtlich. Vereinfachen kann man so etwas mit dem typedef keyword, welches es ermöglicht user-spezifische Typen mit einem neuen Namen zu verzieren(es entsteht kein neuer Datentyp!).


    Z.B.:

    Der user will eine Funktion schreiben die je nach eingegebener Datentypgrösse in bytes den jeweils richtigen Zeiger auf eine entsprechende Vergleichsfunktion(char, short, etc.) oder "NULL" liefert.


    Die allgemeine Deklaration solch einer Vergleichsfunktion könnte z.B.


    int Cmp_<Datentyp> (const void*, const void*);


    lauten. (Pseudopolymorphismus)

    Also daher für die gängigen Datentypen die Vergleichsfunktionen


    int Cmp_Int08( const void*, const void* ){ /* code */ return r; }

    int Cmp_Int16( const void*, const void* ){ /* code */ return r; }

    int Cmp_Int32( const void*, const void* ){ /* code */ return r; }

    int Cmp_Int64( const void*, const void* ){ /* code */ return r; }


    deklariert.

    Die (zur Zuteilung der Zeiger auf oben deklarierte Funktionen) verantwortliche Funktion sieht nun nicht sehr schön aus


    int ( *Cmp_SelectFp(const int type_size) )(const void*, const void*)

    {

    int (*fp)(const void*, const void*);


    switch ( type_size )

    {

    case 1: fp = Cmp_Int08; break;

    case 2: fp = Cmp_Int16; break;

    case 4: fp = Cmp_Int32; break;

    case 8: fp = Cmp_Int64; break;

    default:

    printf( "Warning: Unkown - %i bytes.\n",type_size );

    fp = NULL;       

    }


    return fp;

    }


    da man die Deklaration verschachteln muss.

    Hier hilft uns das typedef keyword aus der Patsche mit dem wir den "neuen Datentypen" Cmp_Fp deklarieren


    typedef int (*Cmp_Fp)(const void*, const void*);


    mit dem unsere neue Funktion nun wesentlich einfacher, im Bezug auf den zurückgegebenen Datentyp, zu verstehen ist


    Cmp_Fp Cmp_SelectFp( const int type_size )

    {

    int (*fp)(const void*, const void*);


    switch ( type_size )

    {

            case 1: fp = Cmp_Int08; break;

            case 2: fp = Cmp_Int16; break;

            case 4: fp = Cmp_Int32; break;

            case 8: fp = Cmp_Int64; break;

            default:

                printf( "Warning: Unkown - %i byte.\n", type_size );

                fp = NULL;    

    }


    return fp;

    }



    Ähnliches Prozeder kann man auch mit Zeigern auf arrays betreiben, aber da muss ich mir noch ein adequates Beispiel ausdenken, da es hier mehr Details gibt.

  • Zeiger sind inhärent in von Neumann Computern, so wie es unsere aktuellen PCs sind. Es gibt Sprachen, die davon abstrahieren (z.B. Java, Python und Co), aber wenn man in den generierten Maschinencode schaut, tauchen die Zeiger doch wieder auf.


    Ohne Zeiger könnte man kein Call by Reference machen, d.h. Funktionsaufrufe bei denen die Argumente nicht kopiert werden müssen. Irgendwie müssen Referenzen dargestellt werden und das ist in der Regel durch Zeiger möglich.


    Ansonsten müsste man jedes Datum kopieren und selbst dann muss man ja darauf zugreifen, und das geht wiederum eigentlich nur indem man die Speicherstelle auf Maschinencodeebene angibt. Und die Adresse der Speicherstelle ist einfach ein: Zeiger.


    In C wird man direkt mit Zeigern konfrontiert und es ist erstmal ungewohnt, aber eigentlich sind die Regeln sehr simpel und man gewöhnt sich recht schnell daran.

    root42 auf YouTube


    80486DX@33 MHz, 16 MiB RAM, Tseng ET4000 1 MiB, GUSar Lite & TNDY & SnarkBarker, PC MIDI Card + SC55 + MT-32, XT CF Lite, OSSC 1.6

  • Und da mir ebenso langweilig ist wie euch, gibt's einen Live Let's Code am Sonntag. Turbo C, Turbo Pascal, PowerBasic, was ihr wollt! Oder doch ein Spiel zocken? Naja, mal sehen. Wird völlig ungeplant, mitten im Umzugsstress :)


    Externer Inhalt youtu.be
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    root42 auf YouTube


    80486DX@33 MHz, 16 MiB RAM, Tseng ET4000 1 MiB, GUSar Lite & TNDY & SnarkBarker, PC MIDI Card + SC55 + MT-32, XT CF Lite, OSSC 1.6

  • Hmm.wofür..??? :


    -----------------------------------------------------------

    Gerne die Komplettlösung von C++

    ------------------------------------------------------------

  • Nächster Livestream voraussichtlich Sonntag 3. Mai, 20:30 CEST. Diesmal mit thp, der uns sein Game Loonies vorstellen wird.


    Externer Inhalt youtu.be
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    root42 auf YouTube


    80486DX@33 MHz, 16 MiB RAM, Tseng ET4000 1 MiB, GUSar Lite & TNDY & SnarkBarker, PC MIDI Card + SC55 + MT-32, XT CF Lite, OSSC 1.6

  • Nächster Livestream voraussichtlich Sonntag 3. Mai, 20:30 CEST. Diesmal mit thp, der uns sein Game Loonies vorstellen wird.

    In Deutsch oder Englisch?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!