Die Programmiersprache C wurde Anfang der 70er Jahre von Dennis Ritchie entwickelt. Sie ist sehr leistungsstark und effizient. Daher stellt sie auch die Basis vieler neuer moderner Programmiersprachen dar.

Dieser Artikel ist eine kurze Zusammenfassung der wichtigsten Eigenschaften der Programmiersprache und ihrer Syntax.

Eigenschaften

  • Ermöglicht schnelle und direkte Speicherzugriffe
  • Case-sensitiv
  • Null-basierter Index
  • Keine objektorientierte Programmiersprache (vgl. C++)
  • Nicht typsicher

Syntax

In C folgt jedem Befehl ein Semikolon, außer nach Präprozessoranweisungen.

Kommentare

// Einzeiliger Kommentar
/*
   Mehrzeiliger
   Kommentar
*/

Datentypen

Für für die Größenordnung der Datentypen in C gilt:
char ≤ short int ≤ int ≤ long int ≤ long long int.

Anmerkung: Empfohlen wird die Verwendung der neuen Integer-Datentypen, die im C99-Standard definiert wurden, da hier gewährleistet ist, dass die Größe der Datentypen bei allen Compilern gleich groß ist. Bei den alten Integer-Datentypen kann die Größe je nach Compiler unterschiedlich sein. Auch die Genauigkeit (signifikante Nachkommastellen) von Gleitkommazahlen ist abhängig vom Compiler.

Neuer Datentyp Alter Datentyp Größe Wertebereich
 int8_t char  1 Byte -128
bis
127
uint8_t unsigned char  1 Byte 0
bis
255
 int16_t int 2 Byte -32.768
bis
32.767
uint16_t unsigned int 2 Byte 0
bis
65.535
 int32_t long 4 Byte -2.147.483.648
bis
2.147.483.647
uint32_t unsigned long 4 Byte 0
bis
4.294.967.295
 int64_t long long 8 Byte -9.223.372.036.854.775.808
bis
9.223.372.036.854.775.807
uint64_t unsigned long long 8 Byte 0
bis
18.446.744.073.709.551.615
Datentyp Größe Wertebereich
Kein bzw. beliebiger Typ
void
Boolsche Zahl
bool 1 Byte 0 (false)
oder
1 (true)
Zeichen (natürliche Zahlen)

signed
char
char
1 Byte -128
bis
127
unsigned char 1 Byte 0
bis
255
Natürliche Zahlen


signed
signed
short
short int
short
short int
2 Byte -32.768
bis
32.767
unsigned
unsigned
short
short int
2 Byte 0
bis
65.535

signed
int
int
2 Byte -32.768
bis
32.767
unsigned int 2 Byte 0
bis
65.535


signed
signed
long
long int
long
long int
4 Byte -2.147.483.648
bis
2.147.483.647
unsigned
unsigned
long
long int
4 Byte 0
bis
4.294.967.295


signed
signed
long long
long long int
long long
long long int
8 Byte -9.223.372.036.854.775.808
bis
9.223.372.036.854.775.807
unsigned
unsigned
long long
long long int
8 Byte 0
bis
18.446.744.073.709.551.615
size_t Maximales unsigned int (Prozessorabhängig)
Gleitkommazahlen
float 4 Byte 1,175494351E-38
bis
3,402823466E+38
double 8 Byte 2,2250738585072014E-308
bis
1,7976931348623158E+308
long double 16 Byte 3.4E-4932
bis
1.1E+4932

Variablen & Arrays

bool  bZustand = true;

int   iZahl = 3;
int   iZahl1, iZahl2 = 7;

float fKommazahl = 42.69;
int   iVektor[4] = {1,2,3,4};
int   iMatrix[2][3] = {{1,2,3},{4,5,6}};

char  cZeichen = 'S';
char  cZeichenkette[] = "Hallo Welt!";

Schlüsselwörter für Variablen

  • const: Konstante
  • static: Variable wird nach einem Anweisungsblock nicht verworfen, sondern speichert ihren Wert bis zum nächsten Aufrufen des Anweisungsblocks
  • register: Variable wird optimiert für schnelle und häufige Zugriffe als Registervariable im Prozessor gespeichert (wird bei modernen Compilern nicht empfohlen, da diese selbstständig Optimierungsaufgaben übernehmen)
  • volatile: Variable kann sich jederzeit ändern (z.B. durch eine Interrupt-Routine) und wird daher nicht optimiert und immer direkt aus dem Hardwarespeicher gelesen
  • extern: Variable ist in einem anderen C-File/H-File deklariert und verweist auf diese

Definition eines Datentyps

typedef unsigned long ulong; //ulong = unsigned long
ulong iZahl = 24;

Strukturierte Datentypen

typedef struct _Person {
    char  Name[30];
    int   Alter;
    float Groesse;
} Person;

Person sPersonen[10];

Union-Datenstruktur

Eine Union-Datenstruktur ähnelt einem strukturierten Datentyp, jedoch mit dem Unterschied, dass alle Untervariablen die selbe Speichergröße belegen. Der Speicherbedarf wird durch das größte Element bestimmt.

typedef union _Fahrzeug {
    typedef struct _Auto {
        int  Typ;       // 2 Byte
        int  Farbcode;  // 2 Byte
    } Auto;
    typedef struct _Fahrrad {
        bool Einrad;    // 1 Byte
        int  Modell;    // 2 Byte
        int  Farbcode;  // 2 Byte
    } Fahrrad;
} Fahrzeug;
typedef struct _Mobil {
    int Datentyp;       // Typ der Union-Datenstruktur
    Fahrzeug sFahrzeug; // 5 Byte
} Mobil;

Enumeration

enum Farbe {rot, gruen, blau};
/* rot   = 0
   gruen = 1
   blau  = 2
*/

enum Groesse {
    xs,
    s = 2,
    m,
    l = 2,
    xl
};
/* xs = 0
   s = 2
   m = 2
   l = 2
   xl = 4
*/

Zeiger

Zeiger (engl. pointer) halten die Speicheradresse des ersten Bytes einer Variablen.
int iZahl;        // Variable vom Typ Integer
int *pZeiger;     // Zeiger mit Sprungweite Integer (2 Byte)
pZeiger = &iZahl; // Adresse von iZahl in pZeiger speichern
*pZeiger = 180;   // An der Adresse von pZeiger den Wert 180 zuweisen (iZahl ist jetzt also 180)

char str[20]; // Zeichenkette mit 20 Zeichen
char *pStr;   // Zeiger mit Sprungweite Character (1 Byte)
pStr = str;   // Anfangsadresse der Zeichenkette in pStr speichern (Arrays sind bereits Zeiger)

Person sMensch;      // Variable vom Strukturtyp Person
Person *pMensch;     // Pointer mit Sprungweite des Strukturtyps Person
pMensch = &sMensch;  // Adresse von sMensch in pMensch speichern
pMensch->Alter = 18; // An der Adresse des Unterelements Alter von pMensch den Wert 18 zuweisen (sMensch.Alter ist jetzt also 18)

Standard-Bibliotheken

  • <stdlib.h> // Standard-Bibliothek
  • <stdio.h> // Input Output Bibliothek
  • <stdbool.h> // Boolsche Zahl
  • <limit.h> // Natürliche Zahlen
  • <float.h> // Gleitkommazahlen
  • <stdint.h> // Neue Integer-Datentypen nach C99-Standard

Beispiel-Programmcode: Hello World

//Bibliotheken
#include <stdlib.h>
#include <stdio.h>

int main() {
    printf("Hello World!\n"); //Ausgabe auf der Konsole

    system("pause"); //Programm anhalten
    return EXIT_SUCCESS; //Programm beenden
}

Literatur

Stargate Network Logo

Was ist Stargate Network?

Stargate Network ist ein Computerspiel, das auf dem Science-Fiction Film Stargate und den darauf aufbauenden Serien basiert. Das Spiel ermöglicht das Erforschen von vielen Welten aus dem Stargate Universum, welche mit einem hohen Detailgrad und einem Fokus auf Realität reproduziert werden. Stargate Network bietet die Möglichkeit Planeten und Raumschiffen aus den Stargate-Filmen und -Serien zu entdecken und ein Teil der „Stargate-Welt“ zu werden. Das Spiel ist kostenlos für Windows und Mac erhältlich.

Besonders die Serie Stargate – Kommando SG-1 gehört zu meinen Lieblings-Serien, sodass ich als „Stargate-Fan“ regelrecht verpflichtet bin dieses tolle Spiel, das von einer französischen Non-Profit-Organisation entwickelt wird, weiterzuempfehlen und bekannt zu machen.

Version 4.0 Alpha Update 01

Version 4.0 Alpha Update 01 (4.0.0-a1) ist die aktuelle Version (Stand: Januar 2019), die am 1. Dezember 2018 veröffentlicht wurde. In dieser Version ist es, nach der Umstellung auf die neue Entwicklungsplattform Unreal Engine 4, nun wieder möglich andere Planeten zu besuchen und zu erkunden.

Hinweis:
Das Video wird von YouTube eingebettet. Es gelten die Datenschutzbestimmungen von Google.

Planeten

Um einen anderen Planeten mit dem Stargate anzuwählen, muss man die Toradresse des Planeten wissen. Planeten werden über sechs Koordinaten lokalisiert. Dabei entspricht jeder Punkt des Koordinatensystems einem Planeten. Jedem Planeten ist ein Symbol zugeordnet. Weiterhin ist der Ausgangspunkt (engl. point of origin), also der Planet, von dem aus die Verbindung aufgebaut werden soll, notwendig zu wissen. Eine Toradresse besteht also aus insgesamt sieben Symbolen.

Stargate Koordinaten

Stargate-Adressen

In dieser Version können neben der Erde noch drei weitere Planeten besucht werden. Hier sind die Stargate-Adressen und die Ausgangssymbole (letztes Symbol) der Planeten aufgelistet:

(Tabelle wird bald mit Symbolen gefüllt)
1 2 3 4 5 6 | 7
Erde: |
Abydos: |
Schneewelt: |
Graswelt: |

Bugfix zur Steuerung des Puddel Jumpers

In dieser Version gibt es einen Fehler bei der Steuerung des Puddel Jumpers. Die Tasten für Vorwärts (Leertaste) und Rückwärts (Alt-Taste links) funktionieren nicht. Um diesen Fehler zu beheben habe ich eine Batchdatei geschrieben, die hier heruntergeladen werden kann:

Nach dem entpacken des Zip-Archivs muss die Batch-Datei nur ausgeführt werden. Der Patch ändert dabei die Datei „Input.ini“, die sich im Verzeichnis „%localappdata%\SGN\Saved\Config\WindowsNoEditor“ befindet, sodass diese folgenden Inhalt enthält:

[/Script/Engine.InputSettings])
AxisMappings=(AxisName="Jumper_FlyOFF_Land",Scale=-1.000000,Key=Gamepad_DPad_Down)
AxisMappings=(AxisName="Jumper_FlyOFF_Land",Scale=1.000000,Key=Gamepad_DPad_Up)
AxisMappings=(AxisName="Jumper_FlyOFF_Land",Scale=-1.000000,Key=LeftControl)
AxisMappings=(AxisName="Jumper_FlyOFF_Land",Scale=1.000000,Key=LeftShift)
AxisMappings=(AxisName="Jumper_Forward",Scale=-1.000000,Key=Gamepad_LeftTrigger)
AxisMappings=(AxisName="Jumper_Forward",Scale=1.000000,Key=Gamepad_RightTrigger)
AxisMappings=(AxisName="Jumper_Forward",Scale=-1.000000,Key=LeftAlt)
AxisMappings=(AxisName="Jumper_Forward",Scale=1.000000,Key=SpaceBar)
AxisMappings=(AxisName="Jumper_Sides_Azerty",Scale=-1.000000,Key=A)
AxisMappings=(AxisName="Jumper_Sides_Azerty",Scale=1.000000,Key=E)
AxisMappings=(AxisName="Jumper_Sides_Azerty",Scale=-1.000000,Key=Gamepad_LeftShoulder)
AxisMappings=(AxisName="Jumper_Sides_Azerty",Scale=1.000000,Key=Gamepad_RightShoulder)
AxisMappings=(AxisName="Jumper_Sides_Qwerty",Scale=1.000000,Key=E)
AxisMappings=(AxisName="Jumper_Sides_Qwerty",Scale=-1.000000,Key=Gamepad_LeftShoulder)
AxisMappings=(AxisName="Jumper_Sides_Qwerty",Scale=1.000000,Key=Gamepad_RightShoulder)
AxisMappings=(AxisName="Jumper_Sides_Qwerty",Scale=-1.000000,Key=Q)
AxisMappings=(AxisName="LookUp",Scale=1.000000,Key=Gamepad_RightY)
AxisMappings=(AxisName="LookUp",Scale=-1.000000,Key=MouseY)
AxisMappings=(AxisName="MoveForward",Scale=-1.000000,Key=Down)
AxisMappings=(AxisName="MoveForward",Scale=1.000000,Key=Gamepad_LeftY)
AxisMappings=(AxisName="MoveForward",Scale=-1.000000,Key=S)
AxisMappings=(AxisName="MoveForward",Scale=1.000000,Key=Up)
AxisMappings=(AxisName="MoveForward",Scale=1.000000,Key=W)
AxisMappings=(AxisName="MoveRight",Scale=-1.000000,Key=A)
AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=D)
AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=Gamepad_LeftX)
AxisMappings=(AxisName="MoveRight",Scale=-1.000000,Key=Left)
AxisMappings=(AxisName="MoveRight",Scale=1.000000,Key=Right)
AxisMappings=(AxisName="Turn",Scale=1.000000,Key=Gamepad_RightX)
AxisMappings=(AxisName="Turn",Scale=-1.000000,Key=Left)
AxisMappings=(AxisName="Turn",Scale=1.000000,Key=MouseX)
AxisMappings=(AxisName="Turn",Scale=1.000000,Key=Right)