Informatik: Einführung in C - Advanced Track
Released by matroid on So. 06. Januar 2008 17:08:16 [Statistics]
Written by matph - 1899 x read [Outline] Printable version Printer-friendly version -  Choose language   
Informatik

\(\begingroup\) Fortsetzung der Serie Einführung in C - Advanced Track

C


[Teil 1: Installation eines C-Compilers] [Teil 2: Hello World] [Teil 3: Taschenrechner]

Programm

In diesem Abschnitt wollen wir ein kleines Programm schreiben, welches eine Tabelle mit Werten einliest, sortiert und wieder ausgibt. So könnte unsere Tabelle folgendermaßen aussehen: \sourceon Text 1 1.44888869287653 11 19.33935732332509 9 5.65860770541676 2 0.49988629540891 10 16.58552877292631 1 13.59292506323962 15 18.82345345542381 18 7.60492279604192 20 16.78666250006916 15 19.71067918224974 13 7.67003265620908 17 19.87534373297247 14 2.45832884974273 15 14.46875569514668 17 13.12899996599392 7 12.58539019212717 20 6.46601592108281 19 8.28034593683675 7 17.06849060185916 4 3.69901037162612 18 4.30463143491759 \sourceoff tab1.txt Das Programm, welches anhand der ersten Spalte die Daten sortiert: \sourceon C /* Libs. importieren */ #include #include /* Definieren der Block-Größe (Makro) */ #define BLOCK 15 /* Strukturen definieren */ typedef struct{ int fst; double snd;} typA; typedef struct{ typA* a; int len;} readA; /* Sortierfunktion */ void hsort(int len, typA *a) { int i, j, k; typA it, tmp; /* Heap-Sort-Verfahren */ for(k=len-1; k>=0; k--){ for(i=0; i<=k; i++){ it=a[i]; j=i/2; while(i>0 && a[j].fstbsp1 tab1.txt das Programm aufrufen, und auf unsere Tabelle anwenden. Die Ausgabe wird wie folgt lauten: \sourceon Text 01 1.45 01 13.59 02 0.50 04 3.70 07 12.59 07 17.07 09 5.66 10 16.59 11 19.34 13 7.67 14 2.46 15 14.47 15 19.71 15 18.82 17 13.13 17 19.88 18 4.30 18 7.60 19 8.28 20 6.47 20 16.79 \sourceoff

Command-Line Arguments

Ein C Programm erlaubt es, das bereits beim Aufruf eine ganze Reihe von Parametern übergeben werden. Diese erhält die main-Funktion über ein Argument vom Typ int welches die Anzahl der Parameter angibt, und char**, quasi ein Array von Strings, welches diese nach Leerzeichen gesplittet beinhaltet, wobei an Stelle 0 immer der Programmname bzw. der Name durch den Aufgerufen wurde steht. In der Praxis wird die main-Funktion daher meist folgendermaßen deklariert \sourceon C int main(int argc, char* argv[]) \sourceoff Die Namen sind dabei zwar frei wählbar, Standard ist allerdings argc für die Anzahl der Parameter, und argv für die Argumente selbst. Im Beispiel ist es so möglich, den Dateinamen zu übergeben, um die richtige Tabelle ein zu lesen. Auch das Öffnen eines gewissen File-Typs über das Betriebssystem funktioniert meist auf diese Weise.

Dateien

Um einen so genannten Stream (Datenstrom) zu öffnen, gibt es in C die Funktion fopen, welche den Pfad so wie den Modus des Öffnens als zweites Argument enthält. Dabei steht r zum Lesen von der Datei, w zum schreiben, a für append bzw. Anhängen, r+ um zu Lesen und zu Schreiben, ähnlich wie w+ und a+ wobei in letzten Fällen nötigenfalls die Datei angelegt wird. Des Weiteren kann an jeden der obigen Modi noch ein b, für den Binärmodus angehängt werden. So wird durch \sourceon C if((fp=fopen("test.dat", "r+b"))==NULL) exit(1); \sourceoff fp ein Zeiger vom Typ FILE zugewiesen, oder NULL, falls es nicht Möglich ist test.dat binär im Lese- und Schreibmodus zu öffnen, und das Programm durch exit beendet. Via int fprintf(FILE *stream, const char *format, ...) kann in einen Stream geschrieben werden, so wie mittels int fscanf(FILE *stream, const char *format, ...) aus einem Datenstrom gelesen werden kann. Besondere Bedeutung besitzen stdin die Standardeingabe, stdout die Standardausgabe und stderr der Standardfehlerkanal.

Strukturen

Mittels Datenstrukturen lassen sich in C komplexe Typen darstellen, welche mehrere Speicherplätze besitzen. Sehen wir uns ein einfaches Beispiel an \sourceon C struct dummy{ int fst; double snd;} var; \sourceoff Hier definieren wir var als eine Instanz von dummy, und können var nun Werte zuweisen. Die Zuweisung und Abfrage können Elementweise var.fst = 1 oder zusammen mittels geschweiften Klammern var = {1, 3.1415926} geschehen. Des Weiteren stellt C einen eigenen Operator, var->fst, welcher eine Kurzform für das häufig benötigte (*var).fst ist, bereit. Mittels typedef ermöglicht C Typ-Synonyme, welche den Einsatz erleichtern. So steht im Beispiel \sourceon C typedef struct{ int fst; double snd;} typA; \sourceoff was den weiteren Einsatz über typA xxx im Code erlaubt, um xxx als typA zu deklarieren. Weiters gibt es das Konstrukt union \sourceon C union{ int fst; double snd;} var; \sourceoff welches nur einen gemeinsamen Speicherplatz bereitstellt, d.h. es kann nur entweder fst oder snd belegt werden. Auch enum wird immer wieder benötigt. Es handelt sich hierbei um einen Aufzählungstyp, der Form \sourceon C enum Farbe{ Weiss, Gelb, Orange, Rot, Schwarz}; \sourceoff was im Grunde der Definition vieler Konstanten entspricht, welche zusammen gehören.

Memory Allocation

Mit Variablen und Arrays stößt man schnell an die Grenzen der Speicherverwaltung, denn die Größe muss bereits vor der Erstellung bekannt sein, und kann während des Programmablaufs nicht geändert werden. Mit void *calloc(size_t nmemb, size_t size); void free(void *ptr); void *malloc(size_t size); void *realloc(void *ptr, size_t size); aus der stdlib.h lassen sich diese Probleme beseitigen. Wie können wir mit diesen Funktionen nun etwas der Art wie \sourceon C int a[10]; \sourceoff schreiben, die Lösung ist einfach \sourceon C int *a = malloc(10*sizeof(int)); \sourceoff wir reservieren 10-mal die Anzahl der Bytes welche ein int am System benötigt. Um den Speicherplatz wieder frei zu geben, benutzen wir free. calloc funktioniert ähnlich wie malloc, allerdings wird im Speicher jedes Bit 0 gesetzt. Mit realloc lässt sich die Größe des Speicherplatzes verändern, oder dieser anlegen, falls er noch nicht existiert. Auch Freigeben von Speicher ist möglich, wenn die Größe 0 gesetzt wird.
\(\endgroup\)
Get link to this article Get link to this article  Printable version Printer-friendly version -  Choose language     Kommentare zeigen Comments  
pdfFür diesen Artikel gibt es keine pdf-Datei


Arbeitsgruppe Alexandria Dieser Artikel ist im Verzeichnis der Arbeitsgruppe Alexandria eingetragen:
: Informatik :: automatisch eingefügt und unbearbeitet :
Einführung in C - Advanced Track [von matph]  
Fortsetzung der Serie Einführung in C - Advanced Track [Teil 1: Installation eines C-Compilers] [Teil 2: Hello World] [Teil 3: Taschenrechner]
[Die Arbeitsgruppe Alexandria katalogisiert die Artikel auf dem Matheplaneten]

 
 
Aufrufzähler 1899
 
Aufrufstatistik des Artikels
Insgesamt 7 externe Seitenaufrufe zwischen 2012.02 und 2015.04 [Anzeigen]
DomainAnzahlProz
http://www.doxapp.com571.4%71.4 %
http://r.duckduckgo.com114.3%14.3 %
http://google.de114.3%14.3 %

Häufige Aufrufer in früheren Monaten
Insgesamt 5 häufige Aufrufer [Anzeigen]
DatumAufrufer-URL
201202-03 (5x)http://www.doxapp.com/code/

[Top of page]

"Informatik: Einführung in C - Advanced Track" | 5 Comments
The authors of the comments are responsible for the content.

Re: Einführung in C - Advanced Track
von: kelvin am: Di. 08. Januar 2008 10:43:04
\(\begingroup\)Schoener Artikel ueber eine schoene Sprache! In Deinem Absatz "Command-Line Arguments" solltest Du vielleicht noch erwaehnen, dass argv[0] immer der Programmname ist. Gerade fuer Java-Programmierer, die sich noch nicht mit C auskennen, ist das interessant zu wissen. Und davon soll es ja mittlerweile einige geben ;)\(\endgroup\)
 

Re: Einführung in C - Advanced Track
von: kelvin am: Di. 08. Januar 2008 10:47:41
\(\begingroup\)... ausserdem liefern die Funktionen m-/c-/realloc nicht void, sondern einen Pointer auf das erste Element des reservierten Speicherplatzes. Auch nur ein Detail, aber nicht ganz unwichtig.\(\endgroup\)
 

Re: Einführung in C - Advanced Track
von: matph am: Di. 08. Januar 2008 17:59:09
\(\begingroup\)Hallo kelvin, Ich freue mich über deine Kommentare. Zum ersten Punkt: Dies steht bereits im Abschnitt über Command-Line Arguments 😉 Zum zweiten Punkt: Richtig, diese Pointer besitzen nach Funktionsdefinition den Typ void wie dies in C auch in vielen anderen Bereichen der Fall ist. Wenige Zeilen darunter habe ich auch angegeben wie diese void * zu verstehen sind: \sourceon C int *a = malloc(10*sizeof(int)); \sourceoff und im Beispielprogramm die entsprechende reale Anwendung angegeben. Die entsprechende zusätzliche Erwähnung der Punkt von dir finde ich allerdings positiv 😄 -- mfg matph\(\endgroup\)
 

Re: Einführung in C - Advanced Track
von: Gockel am: Di. 08. Januar 2008 19:52:24
\(\begingroup\)@matph: Eben das wollte kelvin doch sagen: Der Rückgabetyo ist nicht void, sondern void*, das ist ein Unterschied. Der Rückgabetyp void ließe es auch gar nicht zu, dass man ein Zeile wie \sourceon C int *a = malloc(10*sizeof(int)); \sourceoff überhaupt durch den Compiler bekommt. mfg Gockel.\(\endgroup\)
 

Re: Einführung in C - Advanced Track
von: owk am: Mi. 09. Januar 2008 00:54:12
\(\begingroup\)Soweit ich das sehen kann, steht auch im Artikel aus Rückgabetyp void* (außer natürlich bei free()). owk\(\endgroup\)
 

 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]