[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: C oder C++ Kurs auf Disk



Hallo Eberhard
> In Ansi-C wird man eine Funktion beispielsweise so deklarieren:
> int f(int a, int b, float c)
> {
>    /* Anweisungen */
> }
So kenne ich es.

> Das moegen aber viele Compiler nicht, sie erwarten die Deklaration im Stil
> von Kernighan-Ritchie:
>
> int f(a, b, c)
> int a, b;
> float c;
> {
>    /* Anweisungen */
> }
Diese Schreibweise habe ich erst bei der Analyse einiger Sourcen
gesehen. Ich benutze sie nie. Die verbreiteten Compiler von Borland,
Microsoft, Watcom oder der Gcc auf Unix-Platformen verstehen alle die
erstere Ansi-Variante.

> Und auch mit der Portabilitaet ist das so eine Sache. Ich hatte ein
> C-Programm auf einer SUN laufen, wo die Funktion sprintf den Typ char* hat
> und als Rueckgabewert einen Zeiger auf den Ergebnisstring liefert.
Laut Ansi ist das falsch.

> Als ich
> das Programm auf eine HP-Maschine brachte, gab es dort zunaechst jede
> Menge Kleinholz, bis ich kapierte, dass dort sprintf den Typ int hat und
> die Anzahl bearbeiteter Argumente liefert.
Und das ist ansi-konform. Die Dokumentation zur
Standard-c-Bibliothek libc zeigt fuer sprintf den Prototyp

int sprintf(char *buffer, const char *format, ...); .

Ich habe gelesen, dass gerade die systemeigenen kr-Compiler bei Hpux und
Sun/OS alles andere als ansi-tauglich sind. Sie wuerden wohl nicht einmal
mit Prototypen umgehen koennen. Stimmt das?

Sicher hat nicht jeder die Moeglichkeit, auf seiner Unix-Maschine mal
eben einen neuen Compiler zu installieren, aber wenn das doch moeglich
ist, sollte man zu einem ausgereiften Ansi-Compiler wie dem gcc (gnu c
compiler) greifen. Vom Gnu-Projekt gibt es in der Qualitaet des Gcc auch
Compiler fuer Pascal, c++, objective c und andere. Eine Version fuer Win32
gibt es auch. Aber damit lassen sich nur Konsolen-Applikationen gut
uebersetzen, da der Resourcen-Compiler noch unausgereift ist.

Auffaellige syntaktische Unterschiede habe ich zwischen gcc, Borland c
und Ms c bisher nicht festgestellt. Lediglich die Datentypen sind
natuerlich maschinenabhaengig und unterscheiden sich daher.

Uebrigens hat man mit gcc eine vollwertige 32-Bit-Umgebung fuer Dos. Man
kann den gesamten Adressraum des Prozessors linear ansprechen. Um die
Speicherverwaltung braucht man sich nicht zu kuemmern. Near und far gibt
es nicht mehr. Programme stuerzen nicht einfach ab, sondern werden mit
einem Registerdump abgebrochen. Jede Endlosschleife laesst sich mit Ctrl+c
beenden. Der Compiler unterstuetzt sogar die von Unix her bekannten
Signale. Aufrufe wie fork oder exec gehen natuerlich nicht.

So kann man unter Dos folgendes voellig untypische Programm uebersetzen.

/* Programm zur Demonstration von Signalen
Das Programm durchlaeuft die for-Schleife und macht dort etwas. Alle zwei
Sekunden wird der Ablauf durch ein Signal vom Timer unterbrochen und die
installierte Ausnahmebehandlung ausgefuehrt.
*/
#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void MeineFunktion(int sig);

void MeineFunktion(int sig)
{

// Diese Funktion wird aufgerufen, wenn die programmierte Zeit des
// Timers abgelaufen ist und dieser das Signal SIGALRM ausloest.
  printf("alle 2 Sekunden kann hier etwas gemacht werden\n");

// Wir programmieren den Timer erneut fuer den naechsten Durchlauf.
  alarm(2);
}


int main(void)
{
  void (*zeiger)(int) = MeineFunktion;

  signal(SIGALRM, zeiger);

// Wir programmieren den Timer fuer den ersten Durchlauf auf 2 Sekunden.
  alarm(2);

  for(;;)
  {
    hier();
    laeuft();
    das();
    Hauptprogramm();
  }
  return 0;
}

viele Gruesse