REFERAT-MenüDeutschGeographieGeschichteChemieBiographienElektronik
 EnglischEpochenFranzösischBiologieInformatikItalienisch
 KunstLateinLiteraturMathematikMusikPhilosophie
 PhysikPolitikPsychologieRechtSonstigeSpanisch
 SportTechnikWirtschaftWirtschaftskunde  



Dieses Script soll die Unterschiede zwischen C und ANSI C augenscheinlicher machen

Dieses Script soll die Unterschiede zwischen C und ANSI C augenscheinlicher machen.


Turbo C 2.0


TURBO C 2.0 stellt im Gegensatz zu den neueren C++  Entwicklungssystemen relativ geringe Ansprüche an die Hardware, man kann damit rechnen , daß es auf den meisten Rechner läuft. C ist eine höhere Programmiersprache, eine universelle Sprache, hat die ALGOL_60 Blockstruktur. C hat eine modulare Struktur und hat einige elementare Sprachelemente zur Simulation paralleler Prozesse (include file <signal.h>) und eignet sich eingeschränkt auch zur Beschreibung von Echtzeitprozessen. Herausgegeben wurde C (revised 1986) von der Bell Telephone Laboratories Incorporation als zweiter Nachfolger der Bell Sprache BCPL. Der Name C soll der zweite Buchstabe aus BCPL sein. Strukturiertes Programmieren, wie ehemals in PASCAL, ist in C nur möglich, wenn die standardmäßig vorhandenen Kontrollstrukturen, insbesondere die zu unstrukturiertem Programmieren geradezu einladenden for-Schleife, neu definiert werden. Dazu bieten sich die in C vorkommenden neuen Präprozessor Sprachänderungsmöglichkeiten an. C-Anweisungen werden stets mit einem Semikolon abgeschlossen.




Die Schlüsselwörter müssen in Kleinbuchstaben geschrieben werden. Für selbstgewählte Wörter empfiehlt es sich, eine einmalige Form einzuführen, aber bei dieser Form auch zu bleiben. Speziell für Anfänger ist es von Vorteil, solche Schreibweisen anzuwenden.


Um bei Programmen immer die Übersicht zu behalten, empfiehlt es sich, bei Anweisungen etwas einzurücken, sorgfältiger modaler Aufbau, leicht zu verständlicher Kommentar und Quellcodes und gute Lesbarkeit durch unterschiedliche Schreibweisen.


Solange ein Programm noch in der Entwicklung sich befindet, sollte man vermeiden, Testläufe auszuführen, ohne zuvor den Compiler allein durchgeführt zu haben. Auch Warnungen sollten ernst genommen werden, da sie meistens auf Mißstände oder mangelhafte Portabilität hinzeigen. Mißachtete Warnungen können einem völlig unerklärlich scheinenden Verhalten des Programms zugrunde liegen.


Zweckmäßiges Strukturieren des Quellprogramms sollte sich an folgenden Regeln orientieren, welche es erleichtern, für den Ablauf besonders signifikante Symbole oder Schlüsselwörter einschließlich ihrer Beziehungen zueinander schnell zu erfassen:


Zusammengehörige öffnende und schließende geschwungene Klammern genau senkrecht untereinander schreiben, am besten genau unter dem Anfang des Schlüsselwortes, zu dem der so definierte Block gehört.


Jeden Zeilenanfang in einem mit begrenztem Block gegenüber den geschwungenen Klammern um wenigstens 2 Spalten eingerückt schreiben



Zusammengehörige Schlüsselwörter wie if, else, do, while und case genau senkrecht untereinander schreiben.


Einzelne Anweisungen, die deshalb keiner bedürfen, gegenüber dem Anfang des dem Block übergeordnetem Schlüsselworts etwas einrücken, zu Beispiel bis zum nächsten Wortanfang in der darüber stehenden Zeile, allenfalls mindestens um 2 bis 3 Spalten.


Anweisungen, die nicht in eine Bildschirmzeile passen, geeignet auf mehrere Zeilen aufteilen, keinesfalls Zeilen so lang schreiben, daß man wichtige Teile nicht auf dem Bildschirm sieht.


C verlangt auch, daß sogenannte Headerdateien, in denen die Prototypen der die Sprache ergänzenden Routinen zusammengefaßt sind, im Programmkopf mittels  #inlclude <datei.h> angegeben sind. Werden solche Routinen als Funktionen aufgerufen können sich auch einen Rückwert liefern.


Wenn sie aber als Prozeduren aufgerufen werden, wird hier auf einen Rückwert naturgemäß verzeichnet. Kommentare dient dem allgemeinem Verständlichmachens des Quellprogramms. Im Gegensatz zu Assemblerprogrammen sollten Programme in einer höheren Programmiersprache nicht zu exzessiv kommentiert sein. Es sollten vielmehr durch ausdrucksstarke Namensgebung darauf geachtet werden, daß der Quellcode verständlich ist.


Symbole sind Einheiten, die der Compiler als individuell erkennt und auf denen das Verständnis des Quellcodes basiert.


Präprozessor


Bevor der Compiler ein C-Quellprogramm übersetzt, führt der Präprozessor vorbereitende Arbeiten durch.


Mehrzeilige Quellprogramm-Aussagen werden zu einzeiligen zusammengefaßt.


Die für das Verständnis durch den Compiler erforderlichen Grundsymbole werden durch Zwischenraumzeichen getrennt.


Dateien, die durch #include eingeführt wurden, werden in den an den Compiler weiterzuleitenden Quellcode eingeführt. Es sind dies insbesondere die Headerdateien. Diese enthalten insbesondere Funktions-Prototypen, weiters vordefinierte Bezeichnung, Makros und dergleichen, im Falle unverständlicher Compiler-Fehlermeldungen lohnt es sich oft, die zuständige Header-Datei in den Editor zu laden und anzusehen.


#define-Direktiven werden im geamten Quellcode durch eine vereinbarten Wert ersetzt.


Bedingte Compilierung, das heißt, Quellprogramm-Abschnitte können je nach Abhängigkeit und anderen Direktiven nach Vorliegen bestimmter Bedingungen in den an den Compiler weiterzuleitenden Quellcode eingefügt werden. Mit #define können auch Makros definiert werden. Im Unterschied zu Unterprogrammen wird hier der ganze Code in das Programm eingeführt


Fehlende #include Dateien führen zu Warnungen, die man beachten sollte. In C++ sogar zu ernsten Fehlermeldungen. Um Warnungen zu Gesicht zu bekommen, wird erst mal mit   ALT-F9 nur compiliert. Nicht alle C-Routinen sind allgemein portabel, das heißt, unter beliebigen anderen Betriebssystemen ebenso verfügbar. Die Ablaufsteuerung dient dem Steuern des Ablaufs eines Programms in Abhängigkeit von Bedingungen, die sich während des Ablaufs ergeben. Für die Ablaufsteuerung stehen Schleifen und Auswahlanweisungen zur Verfügung. Um ein Assembler-Unterprogramm in ein C-Programm einzubinden, (=linken) muß der zugehörige Funktionsprototyp als extern vereinbart werden.

Die Speicherklassen eines Datenobjektes wird durch ein Speicherklassen-Attribut bestimmt. Die Speicherklasse bestimmt den Gültigkeitsbereich eines Datenobjektes. Die Sichtbarkeit wird häufig mit den Worten global und lokal beschrieben. Eine Variable kann gleichzeitig global und lokal sein. Global in dem Sinne, daß sie in dem Block, in den sie vereinbart ist. Sowie in allen untergeordneten Blöcken sichtbar ist, lokal in den Sinn daß sie aus einem übergeordnetem Blick nicht sichtbar ist.


ANSI C


Objektorientierte Programmierung ist zur Zeit ein Allheilmittel - obwohl es diese Methodik seit viel mehr als zehn Jahren gibt. Im Kern geht es um wenig mehr als darum, endlich die Prinzipien guter Programmierung anzuwenden, die man seit mehr als 20 Jahren beherrscht. Es stellt sich aber heraus daß man mit ANSI C schlicht und einfach weiter kommt als mit C++. C wurde ursprünglich von Dennis Ritchie im Anhang von [K&R83] definiert. Der ANSI C Standard erschien ungefähr zehn Jahre später und führte bestimmte Anderungen und Erweiterungen ein. ANSI C legt fest, daß Namen fast beliebig lang sein können. Namen, die mit einem Unterstrich beginnen, sind für Bibliotheken vorgesehen, das heißt , sie sollten nicht im Benutzerprogrammen verwendete werden. Global vereinbarte Namen kann man mittels eines Befehls in einer Quelldatei verstecken.

ANSI C erlaubt verlangt aber nicht daß bei der Vereinbarung von Funktionen die Parameter direkt in der Parameterliste deklariert werden. Funktionsdeklarationen legen damit auch die Typen ihrer Parameter fest Optional und ohne Einfluß auf die Funktionsdefinition können auch die Parameternamen angegeben werden.          Bei C und C++ reichen die portablen Möglichkeiten nicht aus. ANSI C wird benutzt um besonders objektorientiert zu programmieren Nur objektorientiertes Programmieren ermöglicht es Code von Projekt zu Projekt weiterzugeben.. Zu dieser Programmierung braucht man eine ganze Menge stilisierten Code. Die Namen können sich ändern aber die Struktur bleibt gleich. Durch einen eigenen Präprozessor werden wie bei C einige Arbeitsvorgänge durchgeführt. Dieser Präprozessor schreibt am Ende den gleichen ANSI Code wie er auch von Hand geschrieben werden könnte.


Abstrakte Datentypen Für den abstrakten Datentyp verbirgt sich sämtlicher Aspekt seiner Implementierung, wir zum Beispiel die Repräsentierung der einzelnen Werte, vor dem Anwendungsprogramm. Eine Anwendung hat nur Zugriff auf eine Definitionsdatei, in der ein Zeiger den Datentyp repräsentiert, und in der Operationen für den Datentyp als Funktionen deklariert sind, die generische Zeiger akzeptieren und liefern.


Dynamische Bindung, Generische Funktion Es werden hier auf eine einfache Weise Zeichenketten implementiert. Für diese Zeichenkette wird ein dynamischer  Puffer angelegt, der dann den Text enthält. Wenn die Zeichenkette gelöscht wird, muß der dynamische Puffer freigegeben werden. Wenn ein Zeiger auf ein Objekt besteht, kann mit Hilfe der dynamischen Bindung typenspezifische Funktionen finden. Jedes Objekt beginnt mit einer Beschreibung, die Zeiger auf Funktionen enthält, die auf das Objekt angewendet werden.


Arithmetische Ausdrücke Dynamische Bindung ist ganz allein eine sehr mächtige Programmiertechnik. An Stelle von wenigen Funktionen, die jeweils einen großen switch für viele Spezialfälle enthalten, können hier viel kleine Funktionen schrieben, die immer nur ein Fall bearbeiten müssen. Mit dynamischer Bindung sorgen man dafür, daß die korrekte Funktion aufgerufen wird. Diese Technik vereinfacht Routineaufgaben, und sie resultiert normalerweise in Code, der sich sehr leicht erweitern läßt. Dynamische Bindung kann sehr gut helfen, ein Problem in viele einfache Funktionen zu zerlegen. Ein daraus resultierendes Programm kann sehr leicht erweitert werden.


Der ooc Präprozessor Es gibt eine Vielzahl von Konventionen, wie bestimmte Funktionen geschrieben werden müssen und welche zusätzlichen Funktionen nötig sind (Selektoren, Initialisierung). Der Präprozessor hilft, die verscheidenden Konventionen einzuhalten. Der ooc hat nicht die Aufgabe jetzt einen neue Programmiersprache einzuführen, nur die Ausgabe von diesem Präprozessor könnte ebenso von Hand geschrieben es ist ANSI-Code. Es werden hier nur langweilige Routinen durch ein geeignetes Werkzeug erledigt. Wenn Codierstandards dazu führen, daß Teile eines Programms mechanisch erzeigt werden können, dann sollte man das auch tun.


Lecks in der Speicherverwaltung Moderne Arbeitsplatzrechner haben sehr viel Hauptspeicher. Wenn ein Programm hier und dort ein Byte verliert, macht das wahrscheinlich nicht viel aus. Lecks in der Speicherverwaltung sind aber normalerweise Anzeichen für Fehler in den Algorithmen entweder reagiert das Programm falsch auf unerwartete Eingaben, oder noch schlimmer, das Programm ist versehentlich so entworfen, daß es Verbindungen zu dynamisch beschafften Speicher abbricht.


Fehlerbehandlung mit System Moderne Programmiersprachen Wie Eiffel oder C++ verfügen über eine besondere Syntax zur Fehlerbehandlung. Bevor eine riskante Aktion versucht wird, führt man eine Fehler Behandlungsroutine ein. Während der riskanten Aktion können Software oder Hardware einen Fehler auslösen und damit die Fehlerbehandlung zu Fall bringen. Theoretische gibt es danach drei Möglichkeiten


Terminieren und zwar beides. Die Fehlerbehandlung und sowohl auch die riskante Aktion.

Fehlerbehandlung mit Terminierung kann in ANSI C sehr leicht durchgeführt werden.


Fortsetzen der riskanten Aktion unmittelbar nach dem Punkt, wo der Fehler entstand und die Fehlerbehandlung ausgelöst wurde.


Wiederholen der riskanten Aktion, die den Fehler verursacht hat.



Textquellen:   Strukturiertes Programmieren mit C von Harry Feldmann

Einführung in C von Walter Riemer Objektorientierte Programmierung mit ANSI C von Axel-Tobias Schreiner






Haupt | Fügen Sie Referat | Kontakt | Impressum | Nutzungsbedingungen