<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=RobotProgger</id>
		<title>RN-Wissen.de - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=RobotProgger"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/RobotProgger"/>
		<updated>2026-04-11T17:34:28Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=GPS&amp;diff=15822</id>
		<title>GPS</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=GPS&amp;diff=15822"/>
				<updated>2009-12-13T13:51:29Z</updated>
		
		<summary type="html">&lt;p&gt;RobotProgger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ausbauwunsch|Konkrete Codebeispiele}}&lt;br /&gt;
&lt;br /&gt;
===Einführung===&lt;br /&gt;
[[Bild:gpsprinzip.gif|right]]&lt;br /&gt;
GPS, das ''Global Positioning System'' ist die Grundlage für alle modernen Navigations - und Ortungssysteme im Bereich der Land- ,Luft, - und Seenavigation. &lt;br /&gt;
&lt;br /&gt;
Es ist ein satellitengestützter Mobilfunkdienst, der in den 70er Jahren vom amerikanischen Verteidigungsministerium für militärische Zwecke aufgebaut wurde und auch heute noch unterhalten wird. Die Leitzentrale &amp;quot;Master Control Station&amp;quot; für das GPS befindet sich in der Schriever Air Force Base (ehemals Falcon AFB), in der Nähe von Colorado Springs.&lt;br /&gt;
&lt;br /&gt;
Das System besteht aus 24 Satelliten, die auf sechs kreisförmigen Bahnen im 24 Stunden Rhythmus in einer Entfernung von rund 20 000km um die Erde kreisen. &lt;br /&gt;
&lt;br /&gt;
Diese Anordnung stellt sicher, daß immer mindestens das Signal von vier Satelliten erfaßt werden kann. Dies stellt die mögliche Positionsberechnung mittels Entfernungsmessung ('''mind. vier Satelliten''') sicher. Hierbei können über die Differenzen der Signallaufzeiten die Differenzen der Entfernungen zu den Satelliten berechnet werden. Da die Postitionen der Satteliten bekannt ist, kann damit über eine geometrische Berechnung die Position bestimmt werden. Nur wenn die Höhe über dem Meeresspiegel bekannt ist (oder geschätzt wird) reichen drei Satelliten. &lt;br /&gt;
&lt;br /&gt;
Jeder Satellit sendet 50 mal pro Sekunde drei verschiedene Signale: &lt;br /&gt;
Den Pseude-Zufalls-Code (zur Positionsbestimmung), das Almanach-Signal (Satellitenstandort) und das Zeitkorrektur-Signal (Zeitbestimmung). &lt;br /&gt;
&lt;br /&gt;
Der Pseudo-Zufalls-Code wird auf zwei unterschiedlichen Frequenzen ausgesendet. Der eine ist für die militärische Nutzung, der zweite für die zivile Nutzung vorgesehen. &lt;br /&gt;
Für die zivile Nutzung wurde das Signal bis Mai 2000 mit einem künstlichen Timing-Fehler versehen, der die Genauigkeit der Positionsbestimmung auf ca. 100 m beschränkte. Am 2.Mai 2000 um 5:05 Uhr wurde die Signalverschleierung - selective availability - kurz SA&amp;quot; dann abgeschaltet. &lt;br /&gt;
&lt;br /&gt;
Mit mathematischen Funktionen im Empfängerteil von hochwertigen GPS Receivern konnte der Timingfehler in den Jahren bis 2000 jedoch auch korrigiert werden, so daß Genauigkeiten von 20 bis 30 Metern machbar waren. &lt;br /&gt;
Heute ist die Genauigkeit der Positionsbestimmung durch die Aufhebung der `Signalverschleierung(SA)` für die zivile Nutzung mit 5-25 Metern Abweichung , je nach verwendetem GPS-Empfänger, für die einfache zivile Nutzung mehr als ausreichend. Je nach Stellung der Satelliten am Himmel ist die Qualität des GPS-Signals jedoch auch stark zeit- und ortsabhängig.&lt;br /&gt;
&lt;br /&gt;
Für die Güte der Satellitengeometrie wird der DOP-Wert angegeben. H-DOP für den horizontalen Wert und V-DOP für den vertikalen Wert(dieser ist jedoch im Bereich Strassennavigation nicht weiter von Bedeutung. So sind HDOP-Werte unter 4 sehr gut, über 8 jedoch schlecht. Die HDOP Werte werden schlechter, wenn sich die empfangenen Satelliten hoch am Himmel befinden. VDOP Werte hingegen sind eher schlechter, wenn sich die Satelliten sehr nahe am Horizont befinden. Die HDOP und VDOP Werte werden im NMEA-Satz $GPGSA ausgegeben.&lt;br /&gt;
&lt;br /&gt;
GPS-Signale werden in einem sehr hohen Frequenzbereich (~ 1,5 GHZ ) ausgesendet, um die weiten Distanzen problemlos zurückzulegen. Nachteil der hohen Frequenzen ist die leichte Abschirmbarkeit der Signale bei fehlender Sichtverbindung zum Himmel z.B. in Gebäuden. Zur Nutzung von GPS-Signalen in Gebäuden gibt es mittlerweile Spezialantennen die einen Empfang in Gebäuden ermöglichen. Deshalb sollte beim Aufbau eigener präziser GPS-Anwendungen grundsätzlich vor allem auf eine hohe Qualität der Antenne geachtet werden(&amp;quot;Jedes GPS-Anwendung ist so gut wie seine Antenne&amp;quot; - Joe Wynders/GPS-Systems for High Precision/2004). &lt;br /&gt;
[[Bild:gpsmodul.jpg|thumb|Ein handelsübliches GPS Modul]]&lt;br /&gt;
Um das GPS Signal für die Navigation verwenden zu können, benötigt man das passende Kartenmaterial, das in digitaler vektorisierter Form vorliegen muß. Die Vektorform wird benötigt, um mittels mathematischer Funktionen eine Routenberechnung durchführen zu können.  &lt;br /&gt;
&lt;br /&gt;
Die Positionmarkierungen des Kartenmaterials werden so mit dem empfangenen Signal abgeglichen und die Route zu einem definierten Zielpunkt kann berechnet werden.  &lt;br /&gt;
&lt;br /&gt;
Zukünftig wird vor allem [[GALILEO]], ein GPS-System der europäischen Gemeinschaft, das mittlerweile veraltete GPS-System der Amerikaner revolutionieren und der bestehenden Abhängigkeit der EU vorbeugen. Die Inbetriebnahme ist für 2008 geplant. &lt;br /&gt;
&lt;br /&gt;
GPS-Module sind inzwischen auch recht preiswert mit RS232 Schnittstelle für Mikrocontroller erhältlich.&lt;br /&gt;
&lt;br /&gt;
==Wieviel Satelliten sind notwendig?==&lt;br /&gt;
Es reichen drei Satelliten, damit daraus die genaue Position und Höhe bestimmt werden kann. Dies setzt jedoch eine genaue Zeitvorgabe voraus. In der Praxis haben aber die Mehrzahl der GPS-Empfänger keine Uhr, die genau genug ist, um daraus die Laufzeiten korrekt berechnen zu können. Deshalb wird meistens das Signal eines vierten Satelliten herangezogen um die Position möglichst genau zu bestimmen.&lt;br /&gt;
3 Satelliten reichen jedoch stets aus um die genaue 2D-Position zu ermitteln. &lt;br /&gt;
&lt;br /&gt;
'''Aber unsere Erde ist dreidimensional, braucht man dann nicht doch vier Satelliten?'''&lt;br /&gt;
&lt;br /&gt;
Theoretisch ja, in der Praxis nein!  Man kann in der Praxis auch mit drei Satelliten eine Ortsbestimmung erhalten, aber wie erwähnt nur eine zweidimensionale Position. Zweidimensional bedeutet, dass sich die zu bestimmende Position auf der Erdoberfläche befinden muss. Der für die Berechnung notwendige vierte Satellit wäre der Erdmittelpunkt und die zu diesem Satelliten bestimmte Entfernung wäre die Entfernung der Erdoberfläche vom Erdmittelpunkt (6360 km). Somit hat man wieder vier gemessene Pseudoentfernungen aus denen die tatsächliche Position bestimmt wird. Aber eben mit der Einschränkung, dass der Empfänger immer davon ausgeht, dass man sich direkt auf der Erdoberfläche befindet. Erdoberfläche meint in diesem Fall das Erdgeoid, also Meereshöhe. Ist das nicht der Fall (ist man z.B. auf einem Berg), kommt es zu Fehlern, also Ungenauigkeiten bei der Bestimmung, da die Laufzeiten von den Satellitensignalen nicht stimmen.&lt;br /&gt;
&lt;br /&gt;
==Typen von GPS-Satelliten==&lt;br /&gt;
Man unterscheidet fünf Klassen von GPS-Satelliten: '''Block I, Block II, Block IIA, Block IIF und Block IIR-Satelliten.'''&lt;br /&gt;
&lt;br /&gt;
===Block I===&lt;br /&gt;
Zwischen 1978 und 1985 wurden von Kalifornien elf Block I-Satelliten (Masse 845 kg) gestartet, von denen heute keiner mehr in Betrieb ist, von denen jedoch einige, obwohl nur für 4,5 Jahre konzipiert, mehr als 10 Jahre in Betrieb waren. &lt;br /&gt;
&lt;br /&gt;
===Block II===&lt;br /&gt;
Die Konstellation der Block II-Satelliten unterscheidet sich durch die Inklination der Bahnebenen von 55 von der der Block I-Satelliten (63 ). Des weiteren waren sämtliche Signale der Block I-Satelliten zivilen Nutzern zugänglich, die der Block II-Satelliten jedoch nur eingeschränkt. &lt;br /&gt;
Der erste Block II-Satellit kostete an die $ 50 Mio., wog mehr als 1.500 kg und wurde 1989 von Cape Canaveral gestartet. Block II-Satelliten sind für 7,5 Jahre ausgelegt und erreichen eine durchschnittliche Betriebsdauer von 6 Jahren. &lt;br /&gt;
&lt;br /&gt;
===Block IIA===&lt;br /&gt;
Der erste Block IIA-Satellit (A : ''advanced'') wurde 1990 in die Umlaufbahn geschossen. &lt;br /&gt;
&lt;br /&gt;
===Block IIR===&lt;br /&gt;
Die Block IIR-Satelliten (R.''replacement'') mit einer angestrebten Betriebsdauer von 10 Jahren befinden sich noch in Entwicklung (1992) und werden vorraussichtlich Wasserstoff-Maser an Bord haben. Diese Atomuhren sind mindestens um eine Größenordnung genauer als die an Bord der Block II-Satelliten befindlichen Atomuhren. Satelliten vom Typ Block IIR wiegen mehr als 2.000 kg, kosten jedoch nur die Hälfte wie solche vom Typ II. Block IIR-Satelliten sollen mit Hilfe eines Space Shuttle in die Umlaufbahn gebracht werden, wobei jeder Shuttle bis zu drei Satelliten in die Umlaufbahn bringen könnte, was eine schnelle Vervollständigung der Satellitenkonstellation ermöglicht. &lt;br /&gt;
&lt;br /&gt;
===Block IIF===&lt;br /&gt;
Die nächste Generation von Satelliten, die vom Typ IIF (F: ''follow on'') werden zwischen 2000 und 2010 gestartet werden, ausgelegt für einen Betrieb von mindestens 10 Jahren.&lt;br /&gt;
&lt;br /&gt;
==NMEA-0183 Datenprotokoll==&lt;br /&gt;
Um GPS Daten an Endgeräte wie Pocket PC´s, Microcontroller weiterzugeben, bedient man sich vorwiegend des sogenannten NMEA-Protokolles.&lt;br /&gt;
Mit Hilfe der weitestgehend standardisierten NMEA-Daten gelingt es sehr leicht, die Daten praktisch jedes GPS-Geräts mit einem Navigations- und Kartenprogramm auf dem PC, Laptop oder Handheld zu verwenden. Sogenannte GPS-Mäuse (GPS-Empfänger ohne Display nur mit serieller Schnittstelle) kommunizieren ausschliesslich auf diese Art mit Ihrer Aussenwelt. In der Seefahrt werden Kursplotter und ähnliches mit Hilfe von NMEA-Datensätzen mit Positionsdaten versorgt.&lt;br /&gt;
&lt;br /&gt;
NMEA steht für ''National Marine Electronics Association'' (Nationale Vereinigung für Marineelektronik). Diese Vereinigung engagiert sich für die Ausbildung und den Fortschritt der Marine-Elektronikindustrie und dem Markt, den diese bedient. Es handelt sich dabei um eine nicht auf Profit ausgelegte Vereinigung von Herstellern, Vertreibern, Ausbildungsinstitutionen und anderen mit Interesse an diesem Markt (frei aus &amp;quot;NMEA News&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Das Protokoll NMEA-0183===&lt;br /&gt;
Die NMEA hat nun unter anderem den Standard NMEA-1083 definiert, um einen Datenaustausch zwischen verschiedenen Geräten aus der Marineelektronik zu ermöglichen. Die NMEA-0180, 0182 und 0183 Standards (die ersten beiden sind nicht mehr von Bedeutung) sehen pro &amp;quot;Netz&amp;quot; ein Sendegerät und diverse Empfangsgeräte vor. Der Sender soll Daten nach dem RS-232-Standard (vom PC als Datenformat der COM-Schnittstellen bekannt) ausgeben. Die Datenrate beträgt 4800 baud (ca. 600 Bytes/Sekunde) und es ist in diesem Standard kein Stecker oder ähnliches definiert. Die Anschlussart bleibt also dem Hersteller überlassen, weswegen alle Geräte unterschiedliche Stecker benötigen.&lt;br /&gt;
&lt;br /&gt;
Die Einschränkung, dass es nur einen Sender geben darf sorgt dafür, dass nicht wild durcheinandergequatscht wird. Sollen die Daten von mehreren Geräten zusammengefasst werden, braucht man mindestens ein Gerät, dass auch als Empfänger arbeitet und alle erhaltenen Daten in einen neues &amp;quot;Netz&amp;quot; wieder kombiniert einspeist.&lt;br /&gt;
&lt;br /&gt;
Die Daten werden im ASCII-Format (American Standard Code for Information Interchange, Amerikanischer Standard Code für Informationsaustausch) übertragen. Dabei sind alle druckbaren Zeichen sowie Carriage-Return (CR, Waagenrücklauf) und Line-Feed (LF, Neue Zeile) erlaubt und die Daten werden in der Form von Sätzen übertragen. Jeder dieser Sätze beginnt mir dem Zeichen &amp;quot;$&amp;quot;, einer zwei Zeichen langen Senderkennung, einer drei Zeichen langen Satzkennung und dann folgt eine Reihe von Datensätzen, die mit Kommas unterteilt werden. Schliesslich wird der Satz mit einer optionalen Prüfsumme und einer CR/LF abgeschlossen. Jeder Satz kann inklusive des führenden &amp;quot;$&amp;quot; und den beiden CR/LF bis zu 82 Zeichen enthalten. Ist ein Datenfeld in einem Satz zwar vorgesehen aber nicht verfügbar, so wird er einfach weggelassen, das dazugehörige Komma zur Trennung der Datensätze wird aber ohne Leerzeichen beibehalten. Durch Zählen der Kommas kann ein Empfänger dann aus jeden Satz die entsprechenden Informationen richtig zuordnen.&lt;br /&gt;
&lt;br /&gt;
Die meist optionale Prüfsumme besteht aus einem &amp;quot;*&amp;quot; und zwei Hexadezimalzahlen, die sich durch ein (bitweise) exklusiv-oder (1+1=0, 1+0=1, 0+0=0) aller Zeichen zwischen dem &amp;quot;$&amp;quot; und dem &amp;quot;*&amp;quot; berechnen. Bei manchen Sätzen ist die Prüfsumme notwendig.&lt;br /&gt;
&lt;br /&gt;
Der Standard erlaubt weiterhin einzelnen Herstellern eigene (proprietäre) Satzformate. Diese fangen mit &amp;quot;$P&amp;quot; an, gefolgt von der drei Buchstaben langen Herstellerkennung. Anschliessend folgen die Daten.&lt;br /&gt;
&lt;br /&gt;
Einige gängige Senderkennung sind:&lt;br /&gt;
&lt;br /&gt;
 GP GPS Empfänger &lt;br /&gt;
 LC Loran-C Empfänger (älteres Positionsbestimmungssystem) &lt;br /&gt;
 OM Omega Navigations Empfänger (altes Radionavigationssystem; ausser Betrieb) &lt;br /&gt;
 II Integrated Instrumentation (z.B. AutoHelm Seatalk System; Autopiloten) &lt;br /&gt;
&lt;br /&gt;
Die Datensätze der unterschiedlichen Geräte können sehr viele verschiedene Informationen beinhalten, darunter Position, Geschwindigkeit, Richtung, Wassertiefe, Wassertemperatur, Wegpunkte, Windgeschwindigkeit usw.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nachfolgend sollen beispielhaft die Daten, die ein Garmin etrex Vista ausgibt näher beschrieben werden. Ein praktisches Programm um sich unter anderem NMEA-0183 Daten anzusehen ist Visual-GPS.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, dass das Datenformat des GPS auf NMEA umgestellt wird (heisst beim Vista genau: NMEA In/NMEA Out). Die Daten werden dann einmal alle zwei Sekunden über die Schnittstelle ausgegeben. Viele PC-Navigations- und Kartenprogramme mit Anschlussmöglichkeit für GPS-Empfänger erwarten im übrigen auch das NMEA-Format zur Navigation. Funktioniert das Zusammenspiel zwischen GPS und einem PC-Programm nicht, sollte man also sowohl kontrollieren, ob man den GPS an der richtigen seriellen Schnittstelle (COM1 oder COM2) angeschlossen hat, als auch überprüfen, ob das Ausgabeformat am GPS auf NMEA eingestellt ist.&lt;br /&gt;
&lt;br /&gt;
Ein kompletter Block Daten sieht dann beispielsweise folgendermassen aus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 $GPRMC,191410,A,4735.5634,N,00739.3538,E,0.0,0.0,181102,0.4,E,A*19&lt;br /&gt;
 $GPRMB,A,9.99,L,,Exit,4726.8323,N,00820.4822,E,29.212,107.2,,V,A*69&lt;br /&gt;
 $GPGGA,191410,4735.5634,N,00739.3538,E,1,04,4.4,351.5,M,48.0,M,,*45&lt;br /&gt;
 $GPGSA,A,3,,,,15,17,18,23,,,,,,4.7,4.4,1.5*3F&lt;br /&gt;
 $GPGSV,2,1,08,02,59,282,00,03,42,287,00,06,16,094,00,15,80,090,48*79&lt;br /&gt;
 $GPGLL,4735.5634,N,00739.3538,E,191410,A,A*4A&lt;br /&gt;
 $GPBOD,221.9,T,221.5,M,Exit,*6B&lt;br /&gt;
 $GPVTG,0.0,T,359.6,M,0.0,N,0.0,K*47&lt;br /&gt;
 $PGRME,24.7,M,23.5,M,34.1,M*1D&lt;br /&gt;
 $PGRMZ,1012,f*36&lt;br /&gt;
 $PGRMM,WGS 84*06&lt;br /&gt;
 $HCHDG,170.4,,,0.4,E*03&lt;br /&gt;
 $GPRTE,1,1,c,*37&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn die Navigation mit einer Route aktiviert wurde, können noch weitere Sätze hinzukommen, die die Route beschreiben. Interessant ist auch, dass anscheinend je nach leicht Softwareversion unterschiedliche Datensätze ausgegeben werden. &lt;br /&gt;
&lt;br /&gt;
Nachfolgend sind noch einige Datensätze im einzelnen aufgeschlüsselt:&lt;br /&gt;
Der GPRMC-Datensatz (RMC = recommended minimum sentence C, empfohlener Minimumdatensatz) ist eine Empfehlung für das Minimum, was ein GPS-Empfänger ausgeben soll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$GPRMC,191410,A,4735.5634,N,00739.3538,E,0.0,0.0,181102,0.4,E,A*19&lt;br /&gt;
       ^      ^ ^           ^            ^   ^   ^      ^     ^ ^&lt;br /&gt;
       |      | |           |            |   |   |      |     | |&lt;br /&gt;
       |      | |           |            |   |   |      |     | Prüfsumme&lt;br /&gt;
&lt;br /&gt;
       |      | |           |            |   |   |      |     |&lt;br /&gt;
&lt;br /&gt;
       |      | |           |            |   |   |      |     Modus (A,D,E,N,S)&lt;br /&gt;
       |      | |           |            |   |   |      |&lt;br /&gt;
       |      | |           |            |   |   |      magnetische&lt;br /&gt;
       |      | |           |            |   |   |      Deklination 0.4° E&lt;br /&gt;
       |      | |           |            |   |   |&lt;br /&gt;
       |      | |           |            |   |   Datum: 18.11.02&lt;br /&gt;
       |      | |           |            |   | &lt;br /&gt;
       |      | |           |            |   wahrer Kurs (ohne Bewegung 0)&lt;br /&gt;
       |      | |           |            | &lt;br /&gt;
       |      | |           |            Geschwindigkeit über Grund (Knoten)&lt;br /&gt;
       |      | |           |&lt;br /&gt;
       |      | |           007° 39.3538' östliche Länge&lt;br /&gt;
       |      | | &lt;br /&gt;
       |      | 47° 35.5634' nördliche Breite&lt;br /&gt;
       |      |&lt;br /&gt;
       |      Empfängerwarnung, A = Daten OK, V = Warnung&lt;br /&gt;
       |&lt;br /&gt;
       Uhrzeit der Positionsbestimmung: 19:14:10 UTC-Zeit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Datenfeld Modus ist erst in NMEA Version 2.3 eingeführt worden und kann sein: A = Autonom; D = Differentiell; E = geschätzt (Estimated); N = ungültig (Not valid); S = Simulator&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Der GPGGA-Datensatz enthält die wichtigsten Informationen zur GPS-Position und Genauigkeit.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$GPGGA,191410,4735.5634,N,00739.3538,E,1,04,4.4,351.5,M,48.0,M,,*45&lt;br /&gt;
       ^      ^           ^            ^ ^  ^   ^       ^     &lt;br /&gt;
       |      |           |            | |  |   |       |    &lt;br /&gt;
       |      |           |            | |  |   |       Höhe Geoid minus &lt;br /&gt;
       |      |           |            | |  |   |       Höhe Ellipsoid (WGS84)&lt;br /&gt;
       |      |           |            | |  |   |       in Metern (48.0,M)&lt;br /&gt;
       |      |           |            | |  |   |  &lt;br /&gt;
       |      |           |            | |  |   Höhe über Meer (über Geoid)&lt;br /&gt;
       |      |           |            | |  |   in Metern (351.5,M)&lt;br /&gt;
       |      |           |            | |  |&lt;br /&gt;
       |      |           |            | |  HDOP (horizontal dilution&lt;br /&gt;
       |      |           |            | |  of precision) Genauigkeit&lt;br /&gt;
       |      |           |            | |&lt;br /&gt;
       |      |           |            | Anzahl der erfassten Satelliten&lt;br /&gt;
       |      |           |            | &lt;br /&gt;
       |      |           |            Qualität der Messung&lt;br /&gt;
       |      |           |            (0 = ungültig)&lt;br /&gt;
       |      |           |            (1 = GPS)&lt;br /&gt;
       |      |           |            (2 = DGPS)&lt;br /&gt;
       |      |           |            (6 = geschätzt nur NMEA-0183 2.3)&lt;br /&gt;
       |      |           | &lt;br /&gt;
       |      |           Längengrad&lt;br /&gt;
       |      |&lt;br /&gt;
       |      Breitengrad &lt;br /&gt;
       |&lt;br /&gt;
       Uhrzeit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Der GPGSA-Datensatz (SA=satellites active, aktive Satelliten) enthält Informationen über die PRN-Nummern der Satelliten, deren Signale zur Positionsbestimmung verwendet werden.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$GPGSA,A,3,,,,15,17,18,23,,,,,,4.7,4.4,1.5*3F&lt;br /&gt;
       ^ ^ ^                   ^   ^   ^&lt;br /&gt;
       | | |                   |   |   |&lt;br /&gt;
       | | |                   |   |   VDOP (vertikale Genauigkeit)&lt;br /&gt;
       | | |                   |   |&lt;br /&gt;
       | | |                   |   HDOP (horizontale Genauigkeit)&lt;br /&gt;
       | | |                   |&lt;br /&gt;
       | | |                   PDOP (Genauigkeit)&lt;br /&gt;
       | | |&lt;br /&gt;
       | | PRN-Nummern von maximal 12 Satelliten&lt;br /&gt;
       | |&lt;br /&gt;
       | Art der Positionsbestimmung (3 = 3D-fix)&lt;br /&gt;
       |                             (2 = 2D-fix)&lt;br /&gt;
       |                             (1 = kein Fix)&lt;br /&gt;
       |&lt;br /&gt;
       Auto-Auswahl 2D oder 3D Bestimmung&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Der GPGSV-Datensatz (SV=satellites in view, sichtbare Satelliten) enthält Informationen über Satelliten, die zur Zeit möglicherweise empfangen werden können und Informationen zu deren Position, Signalstärke usw. Da pro Satz nur die Informationen von vier Satelliten übertragen werden können (Beschränkung auf 82 Zeichen), kann es bis zu drei solche Datensätze geben.&lt;br /&gt;
&lt;br /&gt;
 $GPGSV,2,1,08,02,59,282,00,03,42,287,00,06,16,094,00,15,80,090,48*79&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der GPGLL-Datensatz ist ein Überbleibsel aus der Zeit, als es nur LORAN-C als Navigationssystem gab und enthält die geographische Position. Das GPS-Gerät emuliert sozusagen den LORAN-C Empfänger.&lt;br /&gt;
&lt;br /&gt;
 $GPGLL,4735.5634,N,00739.3538,E,191410,A,A*4A&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Der GPBOD-Datensatz gibt Informationen zur Richtung vom Startpunk zum Zielpunkt an. Der Kurs wird als wahrer (T=true) und magnetischer (M=magnetic) Kurs zum benannten Zielpunkt (hier 'Exit', da keiner angegeben ist) ausgegeben.&lt;br /&gt;
&lt;br /&gt;
 $GPBOD,221.9,T,221.5,M,Exit,*6B&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der GPVTG-Datensatz enthält Daten zur Bewegungsgeschwindigkeit und Richtung.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$GPVTG,0.0,T,359.6,M,0.0,N,0.0,K*47&lt;br /&gt;
       ^     ^       ^     ^&lt;br /&gt;
       |     |       |     |&lt;br /&gt;
       |     |       |     Geschwindigkeit über Grund in km/h (K)&lt;br /&gt;
       |     |       |&lt;br /&gt;
       |     |       Geschwindigkeit über Grund in Knoten (N)&lt;br /&gt;
       |     |      &lt;br /&gt;
       |     Kurs (magnetisch, M)     &lt;br /&gt;
       |&lt;br /&gt;
       Kurs (wahr, T)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Die folgenden drei Datensätze sind Garmin-eigene Datensätze, was die Kürzel P (proprietary) und GRM (Garmin).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der PGRME-Datensatz enthält den geschätzen Fehler der horizontalen und vertikalen Position. Die Angaben sind jeweils in Meter. Der erste Wert ist der horizontale, der zweite der vertikale und der dritte ein sphärischer Fehler (Kugelradius einer &amp;quot;Fehlerkugel&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
 $PGRME,24.7,M,23.5,M,34.1,M*1D&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der PGRMZ-Datensatz enthält die Höhe in Fuss.&lt;br /&gt;
&lt;br /&gt;
 $PGRMZ,1012,f*36&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der PGRMM-Datensatz enthält das verwendete horizontale Datum. Zu beachten ist, dass die Positionsangaben aus den Navigationsdatensätzen sich auf das hier angegebene Datum beziehen.&lt;br /&gt;
&lt;br /&gt;
 $PGRMM,WGS 84*06&lt;br /&gt;
&lt;br /&gt;
Der HCHDG-Datensatz enthält Angaben vom Magnetkompass, den nur wenige GPS-Geräte besitzen (vista, summit, GPS76s). Es sind Daten zur Richtung (170.4°) und Deklination (auch als 'deviation' bezeichnet; Abweichung von magnetisch Nord zu wahrem Nord, siehe auch hier).&lt;br /&gt;
&lt;br /&gt;
 $HCHDG,170.4,,,0.4,E*03&lt;br /&gt;
&lt;br /&gt;
Der GPRTE-Datensatz schliesslich enthält Angaben zur programmierten Route. Zum Zeitpunkt des angebenen Datenblocks war keine Route definiert, ansonsten würde der Satz wesentlich mehr Informationen enthalten.&lt;br /&gt;
&lt;br /&gt;
 $GPRTE,1,1,c,*37&lt;br /&gt;
&lt;br /&gt;
Andere GPS-Geräte enthalten teilweise andere herstellerspezifische Datensätze, die für die Position wichtigsten sind jedoch immer enthalten.&lt;br /&gt;
&lt;br /&gt;
==Oft verwendeter Chipsatz SIRF==&lt;br /&gt;
Ein der am häufigsten eingesetzten Chipsätze für GPS-Empfänger stammt von der Firma SiRF Technology, Inc., ein Hersteller von GPS Chip-Sätzen.&lt;br /&gt;
Diese Firma verfolgt mit Nachdruck ihr Ziel, die Vorteile GPS-basierter Standortinformations-Technologie auf eine breite Palette von Massen- Consumerprodukten und -applikationen anzuwenden. SiRF GPS-Lösungen zeichnen sich durch eine Reihe herausragender Merkmale in technisch kritischen Bereichen aus. SiRF hat über 40 Patente für diese entscheidend wichtigen und innovativen Bereiche angemeldet.&lt;br /&gt;
SiRF hat die gesamte Komplexität, die GPS mit sich bringt in seine SiRFstar Architektur integriert. Dies erleichtert das Design von Produkten auf Basis der SiRF GPS Chip-Sätze erheblich. Die verschiedenen Architekturen sind für unterschiedliche Gruppen GPS-basierender Geräte ausgelegt. &lt;br /&gt;
Die SiRF GPS Technologien sind als Chip-Sätze sowie als IP Core verfügbar. Sie unterstützen vollständige Software Entwicklungsumgebungen. Beiden Architekturen liegen die gleichen Eigenschaften zugrunde die SiRF vorallem für den Einsatz in Consumer-Produkten prädestinieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Bernd|Bernd]] 15:39, 13. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
* http://www.kowoma.de/gps/zusatzerklaerungen/NMEA.htm &lt;br /&gt;
* http://netscience.univie.ac.at/nets/gps/content/huebscher/satellites/node15.html &lt;br /&gt;
* http://www.sirf.com&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
* [[GALILEO]]&lt;br /&gt;
&lt;br /&gt;
==Weblinks==&lt;br /&gt;
* http://www.nmea.org/&lt;br /&gt;
* http://kanadier.gps-info.de/d-gpsundkanu2.htm &lt;br /&gt;
* http://kanadier.gps-info.de/d-gpsundkanu.htm &lt;br /&gt;
* http://www.itwissen.info/details/definition/rubriken//GPS-Positionsbestimmung/index.html &lt;br /&gt;
* http://www.nmea.de/nmea0183datensaetze.html&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;br /&gt;
[[Kategorie:Abkürzung]]&lt;/div&gt;</summary>
		<author><name>RobotProgger</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=15821</id>
		<title>C-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=C-Tutorial&amp;diff=15821"/>
				<updated>2009-12-13T13:50:17Z</updated>
		
		<summary type="html">&lt;p&gt;RobotProgger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ausbauwunsch|Mehr Grundlagen und vor allem Programmbeispiele etc.}}&lt;br /&gt;
&lt;br /&gt;
Die Programmiersprache C wurde 1971 als Grundlage für das Betriebssystem UNIX in den USA entwickelt (UNIX ist zu über 90% in C geschrieben). 1978 wurde von Brian Kernighan und Dennis Ritchie eine eindeutige Sprachdefinition entwickelt. Mittlerweile ist C von ANSI und ISO standardisiert.&lt;br /&gt;
&lt;br /&gt;
Heute sind C und ihr Nachfolger C++ die dominierenden Programmiersprachen. Sehr viele Anwendungen sind in C geschrieben, was inzwischen auch auf eingebettete Systeme zutrifft, die lange in Assembler programmiert werden mussten, da keine ausreichend leistungsfähigen [[Compiler]] zur Verfügung standen. &lt;br /&gt;
&lt;br /&gt;
Leider ist C nicht einfach zu lernen &amp;amp;ndash; es wurde weder von noch für Hobby-Programmierer entwickelt &amp;amp;ndash; und eignet sich daher nur bedingt für den Einsteiger. Mit etwas Übung und einem optimierenden Compiler kann man damit jedoch sehr effiziente Programme schreiben.&lt;br /&gt;
&lt;br /&gt;
Vom Design her ist C eine Hardware-unabhängig Sprache. Das bedeutet, daß C-Programme mit vertretbarem Aufwand auf ein anderes System portiert werden können. Dazu benötigt man lediglich einen anderen Compiler, und Inline-Assembler-Anweisungen (Assembleranweisungen innerhalb eines C-Programmes) müssen der neuen Hardware (Prozessor, [[Mikrocontroller]]) angepasst werden. &lt;br /&gt;
&lt;br /&gt;
==Geschichte==&lt;br /&gt;
;1971: C wird entwickelt&lt;br /&gt;
;1978: Kernighan und Ritchie definieren die Sprache.&lt;br /&gt;
;1983: ANSI und ISO standardisieren C.&lt;br /&gt;
;1992: Bjarne Stroustrup enwickelt die Nachfolgesprache C++.&lt;br /&gt;
&lt;br /&gt;
=Aufbau eines C-Programmes=&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&lt;br /&gt;
   C-Programme haben keinen fixen Aufbau wie z.B. Pascal. Es gibt zwar gewisse Regeln, aber sonst sind dem Programmierer alle Freiheiten überlassen. Der folgende &amp;quot;Beispiel-Aufbau&amp;quot; ist daher nicht zwingend und kann durchaus verändert werden.&lt;br /&gt;
&lt;br /&gt;
   Natürlich haben C-Programme einen fixen Aufbau! Ebenso wie Pascal-Programme auch unterliegen sie einer strikten Grammatik! &lt;br /&gt;
Auskommentiert --[[Benutzer:SprinterSB|SprinterSB]] 10:23, 17. Feb 2006 (CET)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Ein einfaches C-Programm könnte folgendermassen aussehen. Das Programm tut eigentlich nichts, aber das Beispiel zeigt den prinzipiellen Aufbau. &lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 int Zahl1;&lt;br /&gt;
 char Zeichen1;&lt;br /&gt;
 &lt;br /&gt;
 int main (void)&lt;br /&gt;
 {&lt;br /&gt;
    int zahl2;&lt;br /&gt;
 &lt;br /&gt;
    {{comment|Anweisungen}}&lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
'''Beschreibung:'''&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;nowiki&amp;gt;#include &amp;lt;...&amp;gt;&amp;lt;/nowiki&amp;gt;: Die Include-Direktive sagt dem Compiler, welche Header-Dateien er einbinden soll. In den Header-Dateien und den dazugehörigen Bibliotheken stehen Funktionen und Datentypen, die nicht im Compiler selbst implementiert sind, etwa komplexe Ausgabefunktionen wie &amp;quot;&amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;&amp;quot;, die weiter unten erklärt wird. Durch den Include kann man solche Funktionen nutzen. Elementare Dinge hingegen, wie die mathematischen Operatoren &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, etc. sind im Compiler selbst eingebaut.&lt;br /&gt;
;int Zahl1;: Diese Zeile definiert eine Variable vom Typ int. Diese Variable ist im ganzen Programm gültig, sie ist ''global''. Jede Deklaration/Anweisung in C wird mit einem Strichpunkt (Semikolon  &amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt;) abgeschlossen und dadurch von der nächsten Deklaration/Anweisung getrennt.&lt;br /&gt;
;char Zeichen1;: Hier geschieht das selbe, nur wird diesmal eine Variable des [[#Datentypen|Types char]] definiert. &lt;br /&gt;
;int main (void): definiert ein Unterprogramm mit dem Namen &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;, das keine Parameter hat (&amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;) und eine ganze Zahl ([[#Datentypen|&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;]]) zurückliefert. &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; ist das Hauptprogramm in C, wo mit der Ausführung nach dem Programmstart begonnen wird.&lt;br /&gt;
;{: Die linke geschwungenen Klammer beginnt den Rumpf (auch &amp;quot;''body''&amp;quot; genannt) der main-Funktion. Danach folgen Variablendefinitionen, Kommentare und Anweisungen von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;.&lt;br /&gt;
;int zahl2;: Innerhalb von &amp;quot;main&amp;quot; wird die lokale Variable &amp;lt;tt&amp;gt;zahl2&amp;lt;/tt&amp;gt; definiert. &lt;br /&gt;
;/* Anweisungen */: Das ist ein Kommentar in C. Hier kann man Anmerkungen zum Code hinschreiben oder Codestücke &amp;quot;auskommentieren&amp;quot;, um sie zu deaktivieren. Der Kommentar beginnt mit &amp;lt;tt&amp;gt;/*&amp;lt;/tt&amp;gt; und wird beendet mit einem &amp;lt;tt&amp;gt;*/&amp;lt;/tt&amp;gt;. Er kann mehrere Zeilen überspannen. Je nach C-Compiler werden auch einzeilige Kommentare mit &amp;lt;tt&amp;gt;//&amp;lt;/tt&amp;gt; akzeptiert, die nur bis zum nächsten Zeilenende reichen. Sie gehören jedoch nicht zum standard ANSI-C. Die Leerzeile nach dem Kommentar wird nicht weiter berücksichtig, sie kann zur Untergliederung des Codes zur besseren Lesbarkeit eingefügt werden.&lt;br /&gt;
;return 0;: Gibt den Wert&amp;amp;nbsp;0 zurück und beendet das Programm. Vor dem &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; können natürlich noch C-Anweisungen stehen, die aber erst weiter unten erklärt werden.&lt;br /&gt;
;}: Die schliessende geschwungenen Klammer beendet den Rumpf des Hauptprogramms.&lt;br /&gt;
&lt;br /&gt;
=Das Hauptprogramm main=&lt;br /&gt;
Die erste Funktion, die nach dem Programmstart ausgeführt wird, ist im Allgemeinen die Funktion mit dem Namen &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot;. Diese ist das Hauptprogramm. &lt;br /&gt;
&lt;br /&gt;
Der main-Funktion können beim PC Parameter übergeben werden. Dies sind die sogenannten Kommandozeilenparameter und evtl. Umgebungsvariablen, die beim Aufruf eines Programmes hinter dem Dateinamen stehen. Zudem wird auch ein int-Wert als Ergebnis zurückgeliefert, der den Aufrufer &amp;amp;ndash; üblicher weise eine Shell &amp;amp;ndash; den Erfolg bzw. Fehlerstatus des Programmes mitteilt. &lt;br /&gt;
&lt;br /&gt;
Beim [[Microcontroller]] ist &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt; das Startprogramm, das nach dem RESET und der Initialisierung aufgerufen wird. Hier gibt es also keine Funktionsparameter. Ein Rückgabewert ist auch nicht sinnvoll, so daß &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt; oft als  &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;-Funktion (ohne Rückgabewert) definiert wird. Um Compilerfehler/Warnungen zu vermeiden, muss der Compiler dann aber mit speziellen Einstellungen gestartet werden, denn C-Standard ist, daß main einen Wert zurückliefert!&lt;br /&gt;
 {{comment|void-Definition von main ist nur beim Controller ueblich}}&lt;br /&gt;
 {{comment|spezielle Compilereinstellungen sind noetig, damit bei dieser Definition von main}}&lt;br /&gt;
 {{comment|kein Fehler/Warnung erzeugt wird.}}&lt;br /&gt;
 void main ()&lt;br /&gt;
 {&lt;br /&gt;
     ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=Blöcke=&lt;br /&gt;
Im vorigen Abschnitt haben Sie bereits die geschwungenen Klammern { und } kennen gelernt. C-Programme sind in so genannte Blöcke unterteilt. Da gibt es zum einen das Hauptprogramm und die jeweiligen Unterprogramme, aber auch Schleifen und bedingte Anweisungen. Jedes dieser Konstrukte stellt ein eigenständiges Stück Code dar, das als solches gekennzeichnet werden muss. &lt;br /&gt;
&lt;br /&gt;
Die Kennzeichnung für einen Blockanfang ist die öffnende geschweifte Klammer, während ein Blockende mit der schließenden Klammer notiert wird. Ein Block kann mehrere Teilblöcke enthalten, die wiederum Teilblöcke enthalten dürfen etc. Öffnende und schließende Block-Klammern tauchen immer paarweise auf. &lt;br /&gt;
&lt;br /&gt;
Um Programme übersichtlich zu gestalten, wird jeder Block oder Teilblock eingerückt (siehe unten). Dann ist auch bei längerem Code sofort ersichtlich, wo ein Block beginnt und wo er endet. Geschweifte Klammern werden dann nur selten vergessen, und falls doch kann der Fehler schnell erkannt werden.&lt;br /&gt;
&lt;br /&gt;
Variablen, die in einem Block deklariert werden, sind nur innerhalb dieses Blocks &amp;amp;ndash; und damit auch in allen seinen Teilblöcken &amp;amp;ndash; gültig.&lt;br /&gt;
&lt;br /&gt;
 int main (void)&lt;br /&gt;
 {  {{comment|der Block &amp;quot;main&amp;quot; beginnt}}&lt;br /&gt;
    int zahl;&lt;br /&gt;
    &lt;br /&gt;
    {   {{comment|ein Block beginnt}}&lt;br /&gt;
        {{comment|hier koennen Deklarationen und Anweisungen stehen}}&lt;br /&gt;
    }   {{comment|der Block endet}}&lt;br /&gt;
   &lt;br /&gt;
    return 0;&lt;br /&gt;
 }  {{comment|&amp;quot;main&amp;quot; endet}}&lt;br /&gt;
&lt;br /&gt;
=Datentypen=&lt;br /&gt;
==Elementare Datentypen==&lt;br /&gt;
Der Datentyp einer Variable gibt an, welche Werte eine Variable enthalten kann, welcher Art diese Daten sind und wie sie verarbeitet werden, etwa in arithmetischen Operationen wie einer Addition. So ist es zum Beispiel möglich, in eine Variable vom Typ &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; ganze Zahlen zwischen ca. -32000 und +32000 einzutragen. In einer char-Variable können ASCII-Zeichen gespeichert werden (alles, was Sie mit der Tastatur erzeugen können) oder ganze Zahlen von -128 bis 127.&lt;br /&gt;
&lt;br /&gt;
;Achtung: Da C plattformabhängig ist, hängt die Größe eines Datentypes zum Teil von der genutzten Hardware (z.B. 8, 16 oder 32 Bit-Controller) und dem Compiler und dessen Einstellungen ab!&lt;br /&gt;
&lt;br /&gt;
===int, char, short, long (ganze Zahlen)===&lt;br /&gt;
In Variablen dieser Typen können Sie ganze Zahlen abspeichern, also z.B. 1, &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;2, 100, 12345. Jeden dieser Typen gibt es in zwei Ausprägungen: als &amp;quot;&amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;quot;, also als vorzeichenbehafteten Typ, und als &amp;quot;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&amp;quot;, also ohne Vorzeichen, d.h. das Vorzeichen wird als 0 oder +1 genommen. &lt;br /&gt;
&lt;br /&gt;
Vorzeichenbehaftete Ganzzahl-Typen werden intern im &amp;lt;tt&amp;gt;n-1&amp;lt;/tt&amp;gt;-Komplement dargestellt, das Vorzeichen selbst findet sich also im höchstwertigen Bit. Werden zur Speicherung ''b'' Bits verwendet, dann reicht der Wertebereich von &amp;lt;tt&amp;gt;-2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''-1&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bei Ganzzahl-Typen ohne Vorzeichen reicht der Wertebereich von &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; bis zu &amp;lt;tt&amp;gt;2&amp;lt;sup&amp;gt;''b''&amp;lt;/sup&amp;gt;-1&amp;lt;/tt&amp;gt;, wenn der Typ ''b'' Bits breit ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! Größe (Bit) || Typ || Vorzeichen || colspan=&amp;quot;2&amp;quot;| Grenzen des Wertebereichs&lt;br /&gt;
|- &lt;br /&gt;
| 8  || &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; &lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | -128&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 127&amp;lt;br /&amp;gt;255&lt;br /&gt;
|- &lt;br /&gt;
| 16 || &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | -32.768&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 32.767&amp;lt;br /&amp;gt;65.535&lt;br /&gt;
|- &lt;br /&gt;
| 32 || &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | -2.147.483.648&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 2.147.483.647&amp;lt;br /&amp;gt;4.294.967.295&lt;br /&gt;
|- &lt;br /&gt;
| 64 || &amp;lt;tt&amp;gt;long long&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | -9.223.372.036.854.775.808&amp;lt;br /&amp;gt;0&lt;br /&gt;
| align=&amp;quot;right&amp;quot; | 9.223.372.036.854.775.807&amp;lt;br /&amp;gt;18.446.744.073.709.551.615&lt;br /&gt;
|-&lt;br /&gt;
|8, 16, 32, 64&amp;lt;br/&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|plattform-/compilerabhängig&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Boolean (Logische Variablen)====&lt;br /&gt;
In der Sprache C gibt es keinen Datentyp für boolsche Werte &amp;quot;wahr&amp;quot; bzw. &amp;quot;TRUE&amp;quot; oder &amp;quot;falsch&amp;quot; bzw. &amp;quot;FALSE&amp;quot;. Statt dessen wird gerne der Datentyp &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; dafür verwendet.&lt;br /&gt;
Hat die jeweilige Variable den Wert 0, so ist sie FALSE, sonst (ungleich 0) ist sie TRUE.&lt;br /&gt;
;Hinweis: Bitte beachten, daß eine Variable, die TRUE ist, nicht unbedingt den Wert&amp;amp;nbsp;1 haben muß. Sie muß lediglich ungleich&amp;amp;nbsp;0 sein!&lt;br /&gt;
&lt;br /&gt;
====char (Zeichen)====&lt;br /&gt;
In einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variable können Sie 8-Bit-Werte speichern. Dieser Datentyp wird oft für ASCII-Zeichen genutzt, denn für den Computer ist es egal, ob sich eine Zahl oder ein Zeichen in der Variablen befindet. Er speichert alles in Form von Binärzahlen. &lt;br /&gt;
&lt;br /&gt;
Dabei darf man eines nicht vergessen: Es macht einen großen Unterschied, ob man in einer &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Variablen das Zeichen &amp;lt;tt&amp;gt;'1'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 49) abspeichert, oder die Zahl &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; (das entspricht ASCII-Zeichen Nr. 1, also irgendeinem Sonderzeichen). Man kann zwar mit beiden rechnen, aber &amp;lt;tt&amp;gt;'1' * 2&amp;lt;/tt&amp;gt; ergibt nicht &amp;lt;tt&amp;gt;'2'&amp;lt;/tt&amp;gt;, sondern &amp;lt;tt&amp;gt;'b'&amp;lt;/tt&amp;gt; (ASCII-Zeichen Nr. 98)!&lt;br /&gt;
&lt;br /&gt;
===float, double (Gleitkommazahlen)===&lt;br /&gt;
In einer Gleitkomma-Variable können Kommazahlen gespeichert werden, z.B. 3.141592654. &lt;br /&gt;
&amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; reicht für die meisten Kommazahlen. Werden jedoch noch höhere Genauigkeiten benötigt, kommt der Datentyp &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; zum Einsatz.&lt;br /&gt;
;Vorsicht: bei PIC (microchip) ist die innere Darstellung dieser Zahlen anders als bei den meisten anderen Compilern, beim binären Senden z.B. zum PC muß dann konvertiert werden! Bei [[avr-gcc]] finden die Rechnungen intern mit &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt; statt, auch wenn ein Typ als &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; deklariert ist.&lt;br /&gt;
&lt;br /&gt;
===void===&lt;br /&gt;
Dies ist ein spezieller Typ, der soviel bedeutet wie &amp;quot;nicht vorhanden&amp;quot;. Eine Funktion, die keinen Rückgabewert zurückliefert, definiert als Rückgabetyp &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;, und kennzeichnet damit, daß sie eben nichts zurückliefert. Objekte vom Typ &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt; können nicht angelegt werden.&lt;br /&gt;
&lt;br /&gt;
==Zeiger==&lt;br /&gt;
Jede Variable steht an einer definierten Stelle im Speicher, an ihrer sogenannten ''Adresse''. &lt;br /&gt;
&lt;br /&gt;
Ein Zeiger ist eine Variable, in der eine Adresse gespeichert werden kann. Diese stellt eine bestimmte Position im Arbeitsspeicher dar. Die Adresse eines Objektes erhält man, indem man ihm ein&amp;amp;nbsp;&amp;lt;tt&amp;gt;&amp;amp;&amp;lt;/tt&amp;gt; voranstellt. Die Umkehrung davon &amp;amp;ndash; also der Zugriff auf die Speicherstelle, die im Zeiger enthalten ist &amp;amp;ndash; erledigt ein vorgestellter&amp;amp;nbsp;&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;. Der Operator &amp;amp;nbsp;&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; gibt also den ''Inhalt'' der Adresse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  int * zeiger;&lt;br /&gt;
  int zahl;&lt;br /&gt;
 &lt;br /&gt;
  zeiger = &amp;amp;zahl;&lt;br /&gt;
  *zeiger = 12;&lt;br /&gt;
  &lt;br /&gt;
  printf (&amp;quot;%d = %d&amp;quot;, zahl, *zeiger);&lt;br /&gt;
  &lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Definition von &amp;lt;tt&amp;gt;zeiger&amp;lt;/tt&amp;gt; als Zeiger ist so zu lesen: Der Inhalt von &amp;lt;tt&amp;gt;zeiger&amp;lt;/tt&amp;gt; ist ein &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. Damit wird &amp;lt;tt&amp;gt;zeiger&amp;lt;/tt&amp;gt; zu einem &amp;quot;Zeiger auf &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;&amp;quot;. Dabei gehört der&amp;amp;nbsp;&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; sinngemäß zum Bezeichner &amp;lt;tt&amp;gt;zeiger&amp;lt;/tt&amp;gt;, nicht zum Typ. Folgende Definition definiert also nicht zwei Pointer, sondern einen Pointer (auf &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;) sowie einen &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 int * zeiger, zahl;&lt;br /&gt;
&lt;br /&gt;
Um den Zeiger mit der Adresse von &amp;lt;tt&amp;gt;zahl&amp;lt;/tt&amp;gt; zu laden, schreibt man den Adress-Operator&amp;amp;nbsp;&amp;lt;tt&amp;gt;&amp;amp;&amp;lt;/tt&amp;gt; von &amp;lt;tt&amp;gt;zahl&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 zeiger = &amp;amp;zahl; &lt;br /&gt;
Jetzt möchten Sie der Speicherstelle, deren Adresse der Zeiger enthält, einen Wert zuweisen. Dazu verwendet man den &amp;quot;Inhalts-Operator&amp;quot; &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; (&amp;lt;tt&amp;gt;z.B. *zeiger = 12&amp;lt;/tt&amp;gt;). &lt;br /&gt;
Genauso können Sie mit dem Inhaltsoperator Werte abfragen und an &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt; (und jedes andere Unterprogramm) übergeben.&lt;br /&gt;
&lt;br /&gt;
==Enum==&lt;br /&gt;
&lt;br /&gt;
Über &amp;lt;tt&amp;gt;enum&amp;lt;/tt&amp;gt; können Aufzählungen definiert werden. Die Werte sind &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;-Werte und beginnen mit&amp;amp;nbsp;0. Der folgende enum hat einen um&amp;amp;nbsp;1 grösseren Wert. Mit einer Zuweisung können auch andere Werte zugeordnet werden. Klarer wird's im Beispiel:&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
 enum Farben&lt;br /&gt;
 {&lt;br /&gt;
    ROT,&lt;br /&gt;
    GRUEN,&lt;br /&gt;
    BLAU,&lt;br /&gt;
    BRAUN = 5,&lt;br /&gt;
    SCHWARZ&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
Dies definiert die Konstanten &amp;lt;tt&amp;gt;ROT=0&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;GRUEN=1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;BLAU=2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;BRAUN=5&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;SCHWARZ=6&amp;lt;/tt&amp;gt; und den Typ &amp;lt;tt&amp;gt;enum Farben&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void foo (enum Farben farbe)&lt;br /&gt;
{&lt;br /&gt;
   switch (farbe)&lt;br /&gt;
   {&lt;br /&gt;
      case ROT:&lt;br /&gt;
         ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit kann man anstatt &amp;quot;magischer&amp;quot; Zahlen sprechende Namen im Code verwenden, etwa in Berechnungen und Zuweisungen, Vergleichen oder als Konstante hinter einem &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Zusammengesetzte Datentypen==&lt;br /&gt;
===Arrays===&lt;br /&gt;
Oft muß man sehr viele Werte gleichzeitig abspeichern und betrachten, die alle der selben Aufgabe dienen. Man schreibt z.B. ein Programm, das 10 Zahlen einlesen und anschließend wieder ausgeben soll. Man könnte das natürlich mit 10 einzelnen Variablen bewerkstelligen, aber es ist sinnvoller, dabei Arrays &amp;amp;ndash; teilweise auch als ''Felder'' bezeichnet &amp;amp;ndash; zu verwenden.&lt;br /&gt;
&lt;br /&gt;
In einem Array werden mehrere Variablen gleichen Typs zusammengefasst und hintereinander im Speicher abgelegt. So kann man viele tausend Variablen anlegen mit nur einer Zeile Code. Doch es gibt noch größere Vorteile: Sie können das Array mit einer Schleife ganz einfach nach Werten durchsuchen. Stellen Sie sich vor, Sie müssten mit 100 verschiedenen Variablen &amp;lt;tt&amp;gt;Zahl_00&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;Zahl_99&amp;lt;/tt&amp;gt; arbeiten!&lt;br /&gt;
&lt;br /&gt;
'''Syntax:'''&lt;br /&gt;
 {{Type}} {{Bezeichner}}&amp;amp;#91;{{Konstante}}&amp;amp;#93;;&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
 unsigned int werte[100];&lt;br /&gt;
&lt;br /&gt;
Der Name muß natürlich ein gültiger Bezeichner sein, als Datentyp kann jeder Typ genommen werden &amp;amp;ndash; sowohl elementare Datentypen als auch Zeiger, Strukturen, Unions oder selbst definierte Datentypen. In der eckigen Klammer wird die Anzahl der Elemente bekanntgegeben. Ein mit [3] definiertes Array hat Platz für drei Variablen. Da der Index immer bei 0 beginnt, greift man also mit &amp;lt;tt&amp;gt;[0]&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;[1]&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;[2]&amp;lt;/tt&amp;gt; auf den jeweilige Inhalt zu. Um auf eine der im Array enthaltenen Variablen zugreifen zu können, müssen Sie den Variablennamen und in eckigen Klammern den Index (die &amp;quot;Nummer&amp;quot;) der Variablen angeben. Diese Variable verhält sich dann wie eine ganz normale Variable des jeweiligen Datentypes. &lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #define NZAHLEN 10&lt;br /&gt;
 &lt;br /&gt;
 int main(void)&lt;br /&gt;
 {&lt;br /&gt;
    int i;&lt;br /&gt;
    int zahlen[NZAHLEN];  {{comment|zahlen[0] ... zahlen[9]}}&lt;br /&gt;
  &lt;br /&gt;
    for (i=0; i &amp;lt; NZAHLEN; i++)&lt;br /&gt;
    {&lt;br /&gt;
       printf (&amp;quot;Bitte Zahl %d eingeben: &amp;quot;, i);&lt;br /&gt;
       scanf  (&amp;quot;%d&amp;quot;, &amp;amp; zahlen[i]);&lt;br /&gt;
       printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    printf (&amp;quot;Super!\n&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    for (i=0; i &amp;lt; NZAHLEN; i++) &lt;br /&gt;
       printf (&amp;quot;Zahl %d ist: %d\n&amp;quot;, i, zahlen[i]);&lt;br /&gt;
      &lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Zuerst wird ein 10 int-Variablen großes Array angelegt. &lt;br /&gt;
In dieses wird nun der Reihe nach 10 Zahlen eingelesen. &lt;br /&gt;
Anschließend werden alle 10 Zahlen ausgegeben. &lt;br /&gt;
&lt;br /&gt;
Dabei wird die Größe der Arrays und das Schleifenende über das Define &amp;quot;&amp;lt;tt&amp;gt;NZAHLEN&amp;lt;/tt&amp;gt;&amp;quot; angegeben. Dadurch muss nur ''eine Stelle'' im Code geändert werden, wenn die Größe des Arrays einmal einen anderer Wert als 10 haben soll &amp;amp;ndash; dies vermeidet Fehler die dadurch entstehen, wenn man beim Anpassen der Array-Größe eine Codestelle vergisst, zudem wird der Code lesbarer als wenn irgendwo die Zahl &amp;quot;10&amp;quot; auftaucht.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
'''Merke:'''&lt;br /&gt;
:Wird ein ungültiger Index angeben (einer, der in der Deklaration nicht enthalten ist) können  undefinierte Dinge passieren, wenn dadurch andere Variableninhalte oder Programmcode überschrieben wird, der hinter oder vor dem Array im Speicher liegt. Schlimmstenfalls kann sogar der Computer/Controller abstürzen. Also darauf achten, daß keine ungültigen Werte als Index auftreten!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Strings (Zeichenketten)===&lt;br /&gt;
Ein String ist nichts anderes als ein Array, das aus einzelnen Zeichen (&amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;) gebildet wird. Die Ausgabe auf dem Bildschirm funktioniert am einfachsten mittels Strings.&lt;br /&gt;
&lt;br /&gt;
Die Definition eines Strings erfolgt also genauso wie bei Arrays:&lt;br /&gt;
 char string[21];&lt;br /&gt;
&lt;br /&gt;
Nun haben Sie eine String, in dem Sie 21 Zeichen speichern können. Ganz richtig ist das jedoch nicht. C arbeitet mit &amp;quot;null-terminierten Strings&amp;quot;. Das beudeutet, dass die Länge des Strings nicht abgespeichert wird, sondern das Zeichen mit dem ASCII-Wert 0 das Stringende kennzeichnet. Daher auch die Bezeichnung  &amp;quot;null terminiert&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Das letzte Zeichen eines Strings muß daher immer das ASCII-Zeichen Nr. 0 sein. Ist es das nicht, hat der String kein definiertes Ende, und wenn Sie versuchen, ihn durch eine Standard-Funktion auszugeben zu lassen, könnte es eine Weile dauern, bis sich im Speicher zufällig irgendwo eine 0 befindet. Es stehen ihnen daher bei dem Beispiel nur 20 Zeichen zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
===Mehrdimensionale Arrays===&lt;br /&gt;
Manchmal benötigt man mehr als nur ein eindimensionales Array, wie Sie es bisher kennengelernt haben. Auch dies ist kein Problem. In der Deklaration geben Sie einfach mehrere eckige Klammern hintereinander an. Aber Vorsicht: der Speicherplatz ist begrenzt, ein &amp;quot;&amp;lt;tt&amp;gt;char feld[1024][1024]&amp;lt;/tt&amp;gt;&amp;quot; hat die Speicherplatzgrenzen vermutlich bereits weit überschritten, und der Compiler wird einen (bei gewissen Einstellung auch keinen) Fehler liefern.&lt;br /&gt;
Beim Zugriff auf mehrdimensionale Felder müssen auch mehrere Indizes angeben werden:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  int x,y;&lt;br /&gt;
  int feld[3][5];&lt;br /&gt;
 &lt;br /&gt;
  for (x=0; x&amp;lt;3; x++) &lt;br /&gt;
  {&lt;br /&gt;
     for (y=0; y&amp;lt;5; y++)&lt;br /&gt;
     {&lt;br /&gt;
       printf (&amp;quot;Feldwert x: %d,  y: %d &amp;quot;, x, y);&lt;br /&gt;
       scanf  (&amp;quot;%d&amp;quot;, &amp;amp; feld[x][y]);&lt;br /&gt;
       printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for(x=0; x&amp;lt;3; x++) &lt;br /&gt;
     for (y=0; y&amp;lt;5; y++) &lt;br /&gt;
        printf (&amp;quot;Wert: feld[%d][%d] = %d\n&amp;quot;, x, y, feld[x][y]);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&lt;br /&gt;
Zuerst wird ein 3 mal 5 &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;-Array angelegt. &lt;br /&gt;
Dann werden die Werte eingegeben: zuerst &amp;lt;tt&amp;gt;feld[0][0]&amp;lt;/tt&amp;gt;, dann &amp;lt;tt&amp;gt;feld[0][1]&amp;lt;/tt&amp;gt;, usw. bis &amp;lt;tt&amp;gt;feld[2][4]&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Zum Schluß werden alle Werte noch einmal ausgegeben.&lt;br /&gt;
&lt;br /&gt;
===Strukturen===&lt;br /&gt;
In C können Sie sogenannte &amp;quot;Strukturen&amp;quot; definieren. Dabei handelt es sich um eine Zusammenfassung mehrerer Datentypen zu einem größeren. Im Unterschied zu Feldern können in Strukturen unterschiedliche Datentypen zusammengestellt und gespeichert werden: &lt;br /&gt;
&lt;br /&gt;
'''Syntax:'''&lt;br /&gt;
 struct {{Bezeichner}}&lt;br /&gt;
 {&lt;br /&gt;
    {{Deklaration}}&lt;br /&gt;
    {{Deklaration}}&lt;br /&gt;
    ...&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
 {{comment|Definition der Struktur 'Person'}}&lt;br /&gt;
 struct Person &lt;br /&gt;
 {&lt;br /&gt;
    int id;&lt;br /&gt;
    char vname[20], nname[20];&lt;br /&gt;
    char telnr[15];&lt;br /&gt;
    int alter;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;lt;tt&amp;gt;struct Person {&amp;lt;/tt&amp;gt;&amp;quot; leitet die Definition der Struktur mit dem Namen &amp;quot;&amp;lt;tt&amp;gt;Person&amp;lt;/tt&amp;gt;&amp;quot; ein. &lt;br /&gt;
Dann werden in dieser Struktur fünf Komponenten definiert: drei Strings und zwei &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. &lt;br /&gt;
mit &amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt; wird die Definition abgeschlossen. Sie haben damit einen Datentyp erstellt. Um eine Variable des Typs &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt; anzulegen, geben Sie einfach an&lt;br /&gt;
 struct Person {{Bezeichner}};&lt;br /&gt;
&lt;br /&gt;
Zum Zugriff auf eine Komponente der Struktur gibt man den Namen der Struktur-Variablen an (im folgenden Beispiel also &amp;lt;tt&amp;gt;hubert&amp;lt;/tt&amp;gt; bzw. &amp;lt;tt&amp;gt;klaus&amp;lt;/tt&amp;gt;), einen Punkt und danach den Bezeichner der Komponente:&lt;br /&gt;
 {{comment|Definition zweier Struktur-Variablen}}&lt;br /&gt;
 struct Person hubert, klaus;&lt;br /&gt;
 &lt;br /&gt;
 {{comment|Zugriff auf Struktur-Komponenten}}&lt;br /&gt;
 hubert.alter = 32;&lt;br /&gt;
 klaus.alter = hubert.alter + 1;&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:'''&lt;br /&gt;
Der eventuell etwas lästige Gebrauch von &amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt; kann schon bei der Definition der Struktur vermieden werden.&lt;br /&gt;
Der Definition ist ein &amp;lt;tt&amp;gt;typedef&amp;lt;/tt&amp;gt; voranzustellen. Der Definition folgt dann ein gültiger (und auch eindeutiger) C-Name.&lt;br /&gt;
&lt;br /&gt;
'''Syntax:'''&lt;br /&gt;
 typedef struct {{Bezeichner}}&lt;br /&gt;
 {&lt;br /&gt;
    {{Deklaration}}&lt;br /&gt;
    {{Deklaration}}&lt;br /&gt;
    ...&lt;br /&gt;
 } {{Bezeichner}} ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
 {{comment|Definition der Struktur '_Mensch' bzw. 'Mensch'}}&lt;br /&gt;
 typedef struct _Mensch&lt;br /&gt;
 {&lt;br /&gt;
    int id;&lt;br /&gt;
    char vname[20], nname[20];&lt;br /&gt;
    char telnr[15];&lt;br /&gt;
    int alter;&lt;br /&gt;
 } Mensch;&lt;br /&gt;
&lt;br /&gt;
Jetzt sind folgende Deklarationen identisch:&lt;br /&gt;
 struct _Mensch {{Bezeichner}};&lt;br /&gt;
 Mensch {{Bezeichner}};&lt;br /&gt;
&lt;br /&gt;
Ist der Struktuname nicht notwendig (im Beispiel oben &amp;lt;tt&amp;gt;_Mensch&amp;lt;/tt&amp;gt;), kann auch kürzer geschrieben werden:&lt;br /&gt;
&lt;br /&gt;
'''Syntax:'''&lt;br /&gt;
 typedef struct &lt;br /&gt;
 {&lt;br /&gt;
    {{Deklaration}}&lt;br /&gt;
    {{Deklaration}}&lt;br /&gt;
    ...&lt;br /&gt;
 } {{Bezeichner}} ;&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
 {{comment|Definition der Struktur 'Mensch'}}&lt;br /&gt;
 typedef struct &lt;br /&gt;
 {&lt;br /&gt;
    int id;&lt;br /&gt;
    char vname[20], nname[20];&lt;br /&gt;
    char telnr[15];&lt;br /&gt;
    int alter;&lt;br /&gt;
 } Mensch;&lt;br /&gt;
&lt;br /&gt;
In diesem Fall ist lediglich die Deklaration &amp;lt;tt&amp;gt;Mensch {{Bezeichner}};&amp;lt;/tt&amp;gt; gültig.&lt;br /&gt;
&lt;br /&gt;
Der Hinweis gilt sinngemäß auch für die Definition &amp;lt;tt&amp;gt;union&amp;lt;/tt&amp;gt; im nachfolgenden Abschnitt.&lt;br /&gt;
&lt;br /&gt;
===Unions===&lt;br /&gt;
Eine Union wird ganz analog zu einer Struktur deklariert und verwendet. Sie unterscheidet sich von einer Struktur jedoch dadurch, daß ihre Elemente nicht nacheinander im Speicher abgelegt werden, sondern sich überlagern. Auf die in einer Union enthaltenen Daten gibt es also verschiedene Sichten: je nachdem, welche Sicht bzw. Interpretation der Daten man gerne hätte, wählt man den gewünschten Zugriff.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
union Daten &lt;br /&gt;
{&lt;br /&gt;
   int id;&lt;br /&gt;
&lt;br /&gt;
   struct Person u_person;&lt;br /&gt;
&lt;br /&gt;
   struct u_double&lt;br /&gt;
   {&lt;br /&gt;
      int id;&lt;br /&gt;
      double wert;&lt;br /&gt;
   };&lt;br /&gt;
&lt;br /&gt;
   struct u_pointer&lt;br /&gt;
   {&lt;br /&gt;
      int id;&lt;br /&gt;
      union Daten * p1;&lt;br /&gt;
      union Daten * p2;&lt;br /&gt;
   };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union Daten data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dies definiert eine Union mit den vier Zugriffsmöglichkeiten &amp;lt;tt&amp;gt;id&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;u_person&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;u_double&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;u_pointer&amp;lt;/tt&amp;gt;. Die Größe der Union richtet sich dabei nach der größten Komponente. In diesem Beispiel sind alle Komponenten so angelegt worden, daß sie an erster Stelle ein &amp;lt;tt&amp;gt;int id&amp;lt;/tt&amp;gt; enthalten. In &amp;lt;tt&amp;gt;data.id&amp;lt;/tt&amp;gt; könnte man sich also merken, wie die Daten in der Union zu interpretieren sind. Würde &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt; nicht dieses &amp;lt;tt&amp;gt;id&amp;lt;/tt&amp;gt; enthalten, so würde sich &amp;lt;tt&amp;gt;data.id&amp;lt;/tt&amp;gt; mit &amp;lt;tt&amp;gt;data.u_person.vname&amp;lt;/tt&amp;gt; überlagern. Ein Ändern der ersten Buchstaben von &amp;lt;tt&amp;gt;vname&amp;lt;/tt&amp;gt; hätte also ein Ändern von &amp;lt;tt&amp;gt;id&amp;lt;/tt&amp;gt; zur Folge, und man könnte es nicht mehr als Merker verwenden. Mit diesem Feld überlagert das &amp;lt;tt&amp;gt;id&amp;lt;/tt&amp;gt; von &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt; die &amp;lt;tt&amp;gt;id&amp;lt;/tt&amp;gt;-Felder der anderen Sichten, z.B. ist &amp;lt;tt&amp;gt;data.id&amp;lt;/tt&amp;gt; der selbe Zugriff wie auf &amp;lt;tt&amp;gt;data.u_person.id&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Beispiel ist eine Union, die es ermöglicht, auf die einzelnen Bytes eines &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt; zuzugreifen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef union&lt;br /&gt;
{&lt;br /&gt;
   unsigned long  as_long;&lt;br /&gt;
   unsigned short as_short[2];&lt;br /&gt;
   unsigned char  as_byte[4];&lt;br /&gt;
} data32_t;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dies überlagert einen &amp;lt;tt&amp;gt;unsigned long&amp;lt;/tt&amp;gt; &amp;amp;ndash; also eine 32-Bit-Zahl &amp;amp;ndash; mit vier Bytes bzw. zwei Shorts.&lt;br /&gt;
 data32_t wert;&lt;br /&gt;
 &lt;br /&gt;
 wert.as_long = 0x12345678;&lt;br /&gt;
 wert.as_byte[0] = 0xab;&lt;br /&gt;
 {{comment|nun ist wert.as_long gleich 0xab345678 oder 0x123456ab (je nach Plattform)}}&lt;br /&gt;
&lt;br /&gt;
==Eigene Datentypen==&lt;br /&gt;
&lt;br /&gt;
=Variablen=&lt;br /&gt;
Eine Variable ist ein Synonym (=anderer Name) für eine Speicherstelle in einem Computer. Einfacher gesagt, eine Variable bietet Raum, um Daten wie Zahlen oder Zeichen zu speichern und wieder zu lesen.&lt;br /&gt;
&lt;br /&gt;
==Variablennamen==&lt;br /&gt;
Ein Variablenname kann zusammengesetzt werden aus den Buchstaben &amp;lt;tt&amp;gt;'''A'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''Z'''&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;'''a'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''z'''&amp;lt;/tt&amp;gt;, den Ziffern &amp;lt;tt&amp;gt;'''0'''&amp;lt;/tt&amp;gt; bis &amp;lt;tt&amp;gt;'''9'''&amp;lt;/tt&amp;gt;, sowie dem Sonderzeichen &amp;quot;Unterstrich&amp;quot; (underscore) &amp;lt;tt&amp;gt;'''_'''&amp;lt;/tt&amp;gt;. Dabei darf an erster Stelle keine Ziffer stehen. Die Bezeichner &amp;lt;tt&amp;gt;hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALLO&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Hallo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;HALL0&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;_123&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;_HALLO&amp;lt;/tt&amp;gt; sind also alle gültige und unterschiedliche Variablennamen.&lt;br /&gt;
&lt;br /&gt;
==Anlegen von Variablen==&lt;br /&gt;
Um eine Variable verwenden zu können, muss sie zuerst vereinbart (&amp;quot;erzeugt&amp;quot;) werden. Dies wird auch als &amp;quot;''Definition der Variablen''&amp;quot; bezeichnet und geht so: Schreiben Sie zuerst den Datentyp, dann den Namen der Variablen. Zum Schluß kommt noch der Strichpunkt, wie nach jeder C-Anweisung oder Deklaration. Und nicht vergessen: C unterscheidet zwischen  Groß- und Kleinschreibung! &lt;br /&gt;
 int Zahl1, Zahl2;&lt;br /&gt;
 char Zeichen;&lt;br /&gt;
 &lt;br /&gt;
 int main (void)&lt;br /&gt;
 {&lt;br /&gt;
    float gleitZahl;&lt;br /&gt;
    {{comment|Anweisungen}}&lt;br /&gt;
 &lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:'''&lt;br /&gt;
In einer Zeile können auch mehrere Variablen gleichen Types vereinbart werden, wenn man ein Komma dazwischen setzt. Variablen können in jedem Block vereinbart werden. Siehe [[#Gültigkeitsbereich|Gültigkeitsbereich]].&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen==&lt;br /&gt;
Man kann einer vereinbarten Variable Werte [[#Zuweisungen|zuweisen]]. Dazu schreibt man zuerst den Variablennamen, ein Gleichheitszeichen &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot; und anschliessend den zuzuweisenden [[#Ausdrücke|Ausdruck]]. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  int zahl1, zahl2 = 12;&lt;br /&gt;
  char zeichen1 = 'A';&lt;br /&gt;
&lt;br /&gt;
  zahl1 = 52;&lt;br /&gt;
  zeichen1 = zeichen1 + 1; &lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zuerst werden drei Variablen angelegt (&amp;lt;tt&amp;gt;zahl1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;zahl2&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;zeichen1&amp;lt;/tt&amp;gt;). &lt;br /&gt;
;&amp;lt;tt&amp;gt;zahl2&amp;lt;/tt&amp;gt;: wird gleich bei der Vereinbarung der Wert 12 zugewiesen. &lt;br /&gt;
;&amp;lt;tt&amp;gt;zahl1 = 52&amp;lt;/tt&amp;gt;: Hier wird der Variablen &amp;lt;tt&amp;gt;zahl1&amp;lt;/tt&amp;gt; der Wert 52 zugewiesen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;zeichen1&amp;lt;/tt&amp;gt;: wird um 1 erhöht. Da in der Variablen &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; gespeichert ist, gibt sich ihr neuer Wert aus &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt;. Weil &amp;lt;tt&amp;gt;'A'&amp;lt;/tt&amp;gt; dem Wert 65 entspricht, ist &amp;lt;tt&amp;gt;'A' + 1&amp;lt;/tt&amp;gt; gleich 66, was dem Wert für &amp;lt;tt&amp;gt;'B'&amp;lt;/tt&amp;gt; entspricht.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei float==&lt;br /&gt;
Das funktioniert genau wie bei normalen Zuweisungen. Nachkommastellen werden durch einen Punkt abgegrenzt: &lt;br /&gt;
 floatVariable = 3.14;&lt;br /&gt;
Zusätzlich kann eine Zehnerpotenz angegeben werden:&lt;br /&gt;
 floatVariable2 = -1.234E-6;&lt;br /&gt;
Dadurch wird der erste Wert mit 10&amp;lt;sup&amp;gt;&amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;6&amp;lt;/sup&amp;gt; multipliziert, der Wert der Variablen ist also &lt;br /&gt;
:&amp;lt;math&amp;gt;-1{,}234\cdot10^{-6} = -0.000001234&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen bei logischen Variablen==&lt;br /&gt;
Wie bereits erwähnt, besitzt C keinen logischen Datentyp. Es müssen also &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt; dafür genutzt werden. Die Zuweisung entpricht der Standard-Zuweisung. Wird der Wert 0 zugewiesen, dann ist die Variable &amp;quot;unwahr&amp;quot;, ansonsten ist sie &amp;quot;wahr&amp;quot;. &lt;br /&gt;
 intVariable = !0;   /* entspricht &amp;quot;wahr&amp;quot;   */&lt;br /&gt;
 intVariable = 0;    /* entspricht &amp;quot;unwahr&amp;quot; */&lt;br /&gt;
&lt;br /&gt;
==Konstanten==&lt;br /&gt;
Konstanten können als Variable angesehen werden, die nicht beschrieben, sondern nur gelesen werden können. Ein typisches Beispiel dafür ist die Zahl &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; (rund 3,141592654). Niemand würde in der realen Welt versuchen, ihr einen anderen Wert zuzuweisen. Würde man &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt; jedoch wie eine normale Variable anlegen, wäre dies ohne weiteres möglich. Um dies zu verhindern, gibt es das Schlüsselwort &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; in C:&lt;br /&gt;
 const {{Type}} {{Bezeichner}} = {{Konstante}};  {{comment|Zuweisung bei der Defininition der Variablen}}&lt;br /&gt;
&lt;br /&gt;
Wichtig dabei ist, dass man Konstanten nur bei der Vereinbarung einen Wert zuweisen kann. &lt;br /&gt;
Da Konstanten gewöhnlich im gesamten Programm, zumindest einer Quelldatei genutzt werden, definiert man diese allerdings gewöhnlich außerhalb des main-Blockes entweder am Anfang eines Programmes, oder in einer sogenannten Header-Datei, die per &amp;lt;tt&amp;gt;#include&amp;lt;/tt&amp;gt; eingebunden wird.&lt;br /&gt;
 const float PI = 3.141592;  {{comment|Zuweisung bei der Defininition der Variablen}}&lt;br /&gt;
&lt;br /&gt;
Es sei jedoch erwähnt, daß auch einer Konstanten nachträglich ein anderer Wert zugewiesen werden kann. Im obigen Beispiel könnte mit&lt;br /&gt;
 * ((float*) &amp;amp;PI) = 2;&lt;br /&gt;
der Wert von &amp;lt;tt&amp;gt;PI&amp;lt;/tt&amp;gt; im Nachhinein verändert werden. Es wird die Adresse von &amp;lt;tt&amp;gt;PI&amp;lt;/tt&amp;gt; genommen und diese Adresse durch den Cast in eine ganz normale &amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt;-Adresse umgewandelt, über welche der Wert geändert wird. Die sei der Vollständigkeit halber erwähnt.&lt;br /&gt;
&lt;br /&gt;
Je nachdem, an welcher Stelle sich das &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; bei einer Pointer-Deklaration befindet, markiert es den Pointer als konstant oder das Objekt, auf das dieser Pointer zeigt. Eine häufige Parameterdeklaration in Ausgabe-Funktionen, die einen String erhalten, ist&lt;br /&gt;
 void foo (const char * str, ...);&lt;br /&gt;
Dadurch ist &amp;lt;tt&amp;gt;str&amp;lt;/tt&amp;gt; der Zeiger auf eine Zeichenkette, die innerhalb der Funktion nicht verändert wird bzw. verändert werden darf. Eine Zuweisung wie &amp;lt;tt&amp;gt;*str = 'a'&amp;lt;/tt&amp;gt; ergibt also einen Fehler. &amp;lt;tt&amp;gt;str&amp;lt;/tt&amp;gt; selbst kann aber sehr wohl verändert werden, etwa mit &amp;lt;tt&amp;gt;str++&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Soll ausgedrückt werden, dass &amp;lt;tt&amp;gt;str&amp;lt;/tt&amp;gt; unveränderlich ist, dann so:&lt;br /&gt;
 void foo (char * const str, ...);&lt;br /&gt;
Jetzt wäre eine Änderung des Strings in Ordnung, etwa durch &amp;lt;tt&amp;gt;str[10] = 'a'&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Um sich zu merken, worauf das &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; wirkt, trennt man die Deklaration in Gedanken beim&amp;amp;nbsp;&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; auf: Steht das &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; links vom&amp;amp;nbsp;&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;, dann gehört es zum &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;, steht es rechts davon, dann gehört es zum Pointer. Natürlich ist es auch denkbar, beides &amp;amp;ndash; also den Zeiger und sein Ziel &amp;amp;ndash; als konstant zu markieren.&lt;br /&gt;
&lt;br /&gt;
==Gültigkeitsbereich==&lt;br /&gt;
In C können mehrere Variablen den gleichen Namen haben, solange eindeutig ist, welche in welchem Block gültig ist. Dabei gelten folgende Regeln: &lt;br /&gt;
&lt;br /&gt;
;Lokale Variablen: sind Variablen, die innerhalb eines Blockes definiert werden. Jede Variable ist nur in dem Block gültig, in dem sie vereinbart wurde, sowie in allen darin enthaltenen Blöcken; es sei denn, in einem Unter-Block wird eine Variable gleichen Namens definiert. Dann bezieht sich in diesem Unter-Block der Bezeichner auf die im Unter-Block angelegte Variable.&lt;br /&gt;
;Globale Variablen: werden ausserhalb jedes Blockes definiert und gelten ab der Stelle, an der sie deklariert werden, siehe auch [[#Deklaration und Definition|Deklaration und Definition]]. Wird jedoch in einem Block eine Variable gleichen Namens angelegt, gilt ab hier bis zum Ende des Blocks nicht mehr die globale Variable, sondern die im Block deklarierte. Das Spiel kann man weiterspielen: wird in einem Unter-Block wieder eine namensgleiche Variable angelegt, gilt diese in dem Unterblock.&lt;br /&gt;
&lt;br /&gt;
==Speicherklassen==&lt;br /&gt;
Jede Variable in C gehört zu einer bestimmten Speicherklasse&lt;br /&gt;
;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;: Lokale Variablen sind in aller Regal sogenannte ''automatische Variablen''. Das bedeutet, sie werden automatisch angelegt, wenn ein Block bzw. eine Funktion betreten wird und danach wieder entfernt. Das Schlüsselwort &amp;quot;&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;&amp;quot; wird praktisch nie hingeschrieben, denn lokale Variablen ohne die ausdrückliche Angabe einer Speicherklasse, sind automatisch automatische Variablen.&lt;br /&gt;
;&amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt;: Ein externes Symbol ist im ganzen Programm bekannt bzw. in dem Block, in der die Deklaration steht. In unterschiedlichen Blöcken stehende Deklarationen beziehen sich auf das gleiche Symbol! Obgleich das Datum global zugreifbar ist, ist der Gültigkeitsbereich auf den deklarierenden Block begrenzt bzw. auf das deklarierende Quell-Modul, sofern das Symbol ausserhalb jedes Blocks des Moduls deklariert wird. Siehe auch [[#Deklaration und Definition|Deklaration und Definition]].&lt;br /&gt;
;&amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt;: Die Variable ist im Block gültig bzw. im Quell-Modul (also in der C-Datei, in der die angelegt wurde), wenn sie nicht innerhalb eines Blockes angelegt wurde. Statische Variablen werden nicht in Registern oder im Frame der Funktion angelegt, sondern im selben Speicherbereich, in dem auch die globalen Variablen liegen; Konstanten evtl. auch im Flash. Eine lokale Variable, die als &amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt; angelegt wird, &amp;quot;überlebt&amp;quot; also das Verlassen des Blocks und hat beim neuerlichen Betreten des Blockes ihren bisherigen Wert. In unterschiedlichen Blöcken angelegte lokale statische Variablen beziehen sich auf unterschiedliche Speicherstellen, genau wie bei lokalen Variablen auch.&lt;br /&gt;
;&amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt;: Durch diese Speicherklasse wird eine Variable &amp;amp;ndash; falls möglich &amp;amp;ndash; als Registervariable angelegt, also in einem Maschinenregister des Computer/Controllers gehalten. Dadurch kann auf solche Variablen besonders schnell zugegriffen werden. Dieses Schlüsselwort ist bei modernen Compilern weitgehend überflüssig, da die entsprechenden Optimierungen selbständig vorgenommen werden, wenn ausreichend Register vorhanden sind. Auch globale Variablen können als Register angelegt werden, davon ist dem Anfänger aber dringend abzuraten, weil leicht schwerauffindbare Fehler und Abstürze auftreten, wenn man nicht genau weiss, welche Implikationen in einer solchen Definition stecken!&lt;br /&gt;
;&amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt;: (FIXME: volatile ist ein Qualifier und keine Speicherklasse) Dies ist das genaue Gegenteil von &amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt; und bewirkt, dass die Variable auf keinen Fall in einem Register zwischengespeichert werden darf, sondern immer aus dem RAM gelesen und ins RAM geschrieben werden soll. &amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt; müssen alle ''globalen'' Variablen markiert werden, die in [[ISR | Interrupt-Handlern]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=Ausdrücke=&lt;br /&gt;
Eine Variable oder eine Konstante in C stellen einfache Ausdrücke dar.&lt;br /&gt;
Diese elementaren Ausdrücke können durch Operatoren miteinander verknüpft werden und so zu neuen, komplexeren Ausdrücken zusammen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Einfache Beispiele für Ausdrücke sind also z.B.:&lt;br /&gt;
 1&lt;br /&gt;
 a&lt;br /&gt;
 'a'&lt;br /&gt;
 1 + a&lt;br /&gt;
 a == 1&lt;br /&gt;
&lt;br /&gt;
Auch Funktionen können einen Wert zurückliefern und in Ausdrücken weiter benutzt werden.&lt;br /&gt;
In den folgenden Abschnitten wird gezeigt, welche Operatoren in C vorhanden sind,&lt;br /&gt;
und wie man damit neue Ausdrücke aufbauen kann.&lt;br /&gt;
&lt;br /&gt;
==Lvalues==&lt;br /&gt;
&lt;br /&gt;
Ein Lvalue in C ist ein Ausdruck, dem ein anderer Ausdruck zugewiesen werden kann, dessen Wert also durch eine Zuweisung verändert werden kann.&lt;br /&gt;
das 'L' leitet sich ab von 'left' bwz. 'links' und das 'value' bedeutet Wert: Ein Lvalue ist ein Ausdruck, der auf der linken Seite einer Zuweisung stehen darf. Ein Lvalue ist also immer auch ein gültiger Ausdruck, aber die Umkehrung gilt in aller Regel nicht.&lt;br /&gt;
&lt;br /&gt;
Ein einfaches Beispiel für einen Lvalue ist eine &amp;quot;normale&amp;quot; Variable, die nicht mit &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; als Konstante markiert ist:&lt;br /&gt;
 a = 1;&lt;br /&gt;
Hingegen ist der Ausdruck &amp;lt;tt&amp;gt;a+1&amp;lt;/tt&amp;gt; kein Lvalue, denn eine Zuweisung wie&lt;br /&gt;
 a+1 = 2;&lt;br /&gt;
die mathematisch durchaus sinnvoll ist, erzeugt einen Compilerfehler, der etwa lauten könnte &amp;quot;illegal lvalue in assignment&amp;quot;:&lt;br /&gt;
&amp;quot;ungültiger Wert in Zuweisung&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Andere Beipiele für Lvalues sind die Komponenten von (nicht-konstanten) [[#Strukturen|Strukturen]] und [[#Unions|Unions]], [[#Arrays|Array]]-Elemente und die Dereferenzierungen von Pointern: Die Konstante&amp;amp;nbsp;4 wird durch den Cast in eine Adresse umgewandelt. Über die Dereferenzierung&amp;amp;nbsp;&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; wird an die Adresse&amp;amp;nbsp;4 im Speicher eine&amp;amp;nbsp;3 geschrieben. Ob das erlaubt bzw. sinnvoll ist, ist abhängig von der jeweiligen Architektur.&lt;br /&gt;
 * ((unsigned int *) 4) = 3;&lt;br /&gt;
Hier ist der gesamte &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;-Ausdruck ein Lvalue&lt;br /&gt;
&lt;br /&gt;
==Logische (boolsche) Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp;amp;&amp;amp;amp; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr und &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wahr oder &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; wahr&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a == b&amp;lt;/tt&amp;gt; || gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a != b&amp;lt;/tt&amp;gt; || ungleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;= b&amp;lt;/tt&amp;gt; || kleiner oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt; b&amp;lt;/tt&amp;gt; || kleiner als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt;= b&amp;lt;/tt&amp;gt; || glösser oder gleich&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;gt; b&amp;lt;/tt&amp;gt; || grösser als&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;!a&amp;lt;/tt&amp;gt; || wahr, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; nicht wahr und vice versa&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine interessante Eigenschaft der Operatoren &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;||&amp;lt;/tt&amp;gt; ist, dass&lt;br /&gt;
sie die Auswertung abbrechen, sobald das Ergebnis feststeht. Die Ausdrücke werden&lt;br /&gt;
dabei immer von links nach rechts ausgewertet. Ein oft anzutreffendes Codestück sieht so aus, dabei sei &amp;lt;tt&amp;gt;p&amp;lt;/tt&amp;gt; ein Zeiger auf einen &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
  if (p &amp;amp;&amp;amp; *p == 5)&lt;br /&gt;
  {&lt;br /&gt;
     {{comment|mach was}}&lt;br /&gt;
  }&lt;br /&gt;
Zuerst wird in der Bedinung geprüft, ob Zeiger&amp;amp;nbsp;&amp;lt;tt&amp;gt;p&amp;lt;/tt&amp;gt; einen Wert ungleich Null hat, also ob er überhaupt einen gültigen Wert enthält. Es ist eine weit verbreitete Konvention in C, daß Zeiger, die keinen gültigen Wert haben, die Adresse&amp;amp;nbsp;0 enthalten. '''Nur dann, wenn ein Zeiger nicht ein Null-Pointer ist, darf überhaupt ein Zugriff über ihn erfolgen!'''&lt;br /&gt;
&lt;br /&gt;
==Vergleich von Variablen==&lt;br /&gt;
Skalare Variablen (also ganze Zahlen, Gleitkommazahlen, Zeiger) können miteinander verglichen werden. Dazu gibt es die folgenden Operatoren in C: &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!| Operator || Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;==&amp;lt;/tt&amp;gt; || ist gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;!=&amp;lt;/tt&amp;gt; || ist nicht gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;&amp;lt;/tt&amp;gt;  || ist kleiner &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;lt;=&amp;lt;/tt&amp;gt; || ist kleiner oder gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;&amp;lt;/tt&amp;gt;  || ist größer &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;gt;=&amp;lt;/tt&amp;gt; || ist größer oder gleich &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
Das Ergebnis der Auswertung ist eine ganze Zahl. Ist die Bedingung erfüllt, dann ist der Wert ungleich&amp;amp;nbsp;0. Ist die Bedingung nicht erfüllt, dann ist ihr Wert gleich&amp;amp;nbsp;0.&lt;br /&gt;
Meistens wird man diese Operatoren in &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Konstrukten finden wie zum Beispiel&lt;br /&gt;
 if (x &amp;gt;= 10)&lt;br /&gt;
    x = 10;&lt;br /&gt;
oder in Abbruchbedingungen von Schleifen, wie sie weiter unten erklärt werden.&lt;br /&gt;
&lt;br /&gt;
Es ist auch möglich, das Ergebnis der Auswertung in einer &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;-Variablen zu speichern:&lt;br /&gt;
 int i;&lt;br /&gt;
 int z1, z2;&lt;br /&gt;
 &lt;br /&gt;
 z1 = 5;&lt;br /&gt;
 z2 = 100;&lt;br /&gt;
 i = z1 &amp;lt;= z2;  {{comment|Ein Vergleich. i wird &amp;quot;wahr&amp;quot;, da z1 kleinergleich z2 ist}}&lt;br /&gt;
&lt;br /&gt;
Die Variable &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; ist ungleich&amp;amp;nbsp;0 (&amp;quot;wahr&amp;quot;), wenn &amp;lt;tt&amp;gt;z1&amp;lt;/tt&amp;gt; kleiner oder gleich &amp;lt;tt&amp;gt;z2&amp;lt;/tt&amp;gt; ist. Ist &amp;lt;tt&amp;gt;z1&amp;lt;/tt&amp;gt; jedoch größer als &amp;lt;tt&amp;gt;z2&amp;lt;/tt&amp;gt;, dann ist &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; gleich&amp;amp;nbsp;0 (&amp;quot;unwahr&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Arithmetische Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a + b&amp;lt;/tt&amp;gt; || Summe (Addition)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a - b&amp;lt;/tt&amp;gt; || Differenz (Subtraktion)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a * b&amp;lt;/tt&amp;gt; || Produkt (Multiplikation)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a / b&amp;lt;/tt&amp;gt; || Quotient (Division, evtl. mit Rest)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a % b&amp;lt;/tt&amp;gt; || Rest bei Division (Modulo)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;-a&amp;lt;/tt&amp;gt; || Vorzeichenumkehr (Zweierkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Bit-Operatoren==&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;amp; b&amp;lt;/tt&amp;gt; || bitweise und (and)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&amp;lt;/tt&amp;gt; || bitweise oder (or)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a ^ b&amp;lt;/tt&amp;gt; || bitweise exclusiv-oder (xor, exor)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;~a&amp;lt;/tt&amp;gt; || jedes Bit in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; invertieren (not, Einerkomplement)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Index-Operator bei Arrays==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a[b]&amp;lt;/tt&amp;gt; || das (b+1)ste Element des Feldes a&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Folgendes gilt es bei der Verwendung des Indexoperators zu beachten:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; muss ein [[C-Tutorial#Felder | Feld]] oder [[C-Tutorial#Zeiger | Zeiger]] sein&lt;br /&gt;
# &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; muss ein Integer sein oder ein Datentyp, der sich in einen int umwandeln läßt (z.B. char)&lt;br /&gt;
# Es wird nicht geprüft, ob der Index &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; im Feld &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; gültig ist!&lt;br /&gt;
# Der erste Index eines Feldes ist immer 0. Daher ''(b+1)stes Element'' in der Beschreibung&lt;br /&gt;
&lt;br /&gt;
==Komponenten-Auswahl bei Structs und Unions==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;a.b&amp;lt;/tt&amp;gt; || Element b der [[C-Tutorial#Strukturen | Struktur]] oder des Unions a&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adress-Operator und Dereferenzierung==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Ausdruck ||Beschreibung&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;amp;amp;a&amp;lt;/tt&amp;gt; || Speicheradresse der Variablen &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;*a&amp;lt;/tt&amp;gt; || Wert, der an der Adresse &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;tt&amp;gt;a-&amp;amp;gt;b&amp;lt;/tt&amp;gt; || Wert des Elements &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; der Struktur, deren Adresse in &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; steht&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Adressoperator &amp;amp; kann auf Variablen angewendet werden und&lt;br /&gt;
gibt die Startadresse der Variablen im Speicher zurück.&lt;br /&gt;
&lt;br /&gt;
Handelt es sich bei einer Variable um einen [[C-Tutorial#Zeiger | Zeiger]], so enthält&lt;br /&gt;
sie eine Speicheradresse. Um an den '''Wert''' zu gelangen, der&lt;br /&gt;
an dieser Adresse steht, wird der Operator * vorangestellt.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
 {{comment|x ist eine Integervariable und hat den Wert 5}}&lt;br /&gt;
 int x = 5;&lt;br /&gt;
     &lt;br /&gt;
 {{comment|z ist ein Zeiger auf eine Integer-Variable und enthaelt somit}}&lt;br /&gt;
 {{comment|die Speicheradresse einer Integer-Variablen}}&lt;br /&gt;
 int *z;       &lt;br /&gt;
  &lt;br /&gt;
 {{comment|Verwendung des Adress-Operators: weist an z die Adresse von x zu}}&lt;br /&gt;
 z = &amp;amp;x;&lt;br /&gt;
 &lt;br /&gt;
 {{comment|Verwendung der Dereferenzierung}}&lt;br /&gt;
 {{comment|erhoehe den Wert, der bei Adresse z steht, um eins}}&lt;br /&gt;
 *z = *z + 1;&lt;br /&gt;
 &lt;br /&gt;
 {{comment|da z auf x zeigt, hat x jetzt den Wert 6}}&lt;br /&gt;
&lt;br /&gt;
Da in C häufig Zeiger auf [[C-Tutorial#Strukturen | Strukturen]] verwendet werden, ist für den Zugriff auf Struktir- und Union-Elemente eine abkürzende Schreibweise möglich:&lt;br /&gt;
&lt;br /&gt;
Statt &lt;br /&gt;
  (*strukturZeiger).element&lt;br /&gt;
kann geschrieben werden&lt;br /&gt;
  strukturZeiger-&amp;gt;element&lt;br /&gt;
Beide Schreibweisen sind absolut gleichbedeutend, die Klammern bei der ersteren sind notwendig.&lt;br /&gt;
&lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
:Bei der Dereferenzierung durch &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; findet keine Prüfung statt, ob der Zeiger auch auf eine gültige Speicheradresse verweist. Folgendes Codestück führt zum Absturz oder zu einer Änderung '''irgendeiner''' Speicherstelle!&lt;br /&gt;
&lt;br /&gt;
 int *z; {{comment|z ist ein Zeiger auf einen int}}&lt;br /&gt;
 &lt;br /&gt;
 {{comment|An dieser Stelle ist z immer noch keine Speicheradresse zugewiesen.}}&lt;br /&gt;
 {{comment|z enthaelt irgendeine ungueltige Adresse!!}}&lt;br /&gt;
 &lt;br /&gt;
 {{comment|&amp;quot;Erhoehe einen Integer _irgendwo_ im Speicher um 1&amp;quot; -&amp;gt; CRASH !!!}}&lt;br /&gt;
 *z = *z + 1;&lt;br /&gt;
&lt;br /&gt;
Viele C-Compiler erzeugen in der Standardeinstellung für das obige Codestück ''keine Warnung''!&lt;br /&gt;
&lt;br /&gt;
==Cast-Operator==&lt;br /&gt;
&lt;br /&gt;
Der Cast Operator dient dazu, den Datentyp eines Wertes zu ändern. Dafür wird einfach der neue Datentyp in Klammern vor den Wert geschrieben.&lt;br /&gt;
&lt;br /&gt;
Um zum Beispiel aus einem Float ein Integer zu machen:&lt;br /&gt;
 var  = (int) 5.60;&lt;br /&gt;
Dabei wird der Wert aber auch gerundet, und es findet somit ein Informationsverlust statt. (Genau genommen wird nicht gerundet, sondern die Nachkommastellen werden nur abgeschnitten; wenn man runden möchte, empfiehlt es sich, zuerst 0.5 zu addieren und dann zu casten.)&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel ist das Umwandeln einer ganzen Zahl in eine Adresse:&lt;br /&gt;
 int * addr;&lt;br /&gt;
 addr = (int*) 0x1234;&lt;br /&gt;
Damit ist &amp;lt;tt&amp;gt;addr&amp;lt;/tt&amp;gt; ein Zeiger auf einen &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; an Adresse 0x1234.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen | &lt;br /&gt;
'''Achtung!'''&lt;br /&gt;
&lt;br /&gt;
Der Cast-Operator selbst führt ''keine Konvertierung'' von Darstellungen durch, etwa die Umwandlung der ganzen Zahl 123 ein den String &amp;lt;tt&amp;gt;&amp;quot;123&amp;quot;&amp;lt;/tt&amp;gt;, der diese Zahl darstellt! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
  int main(int argc, char ** argv)&lt;br /&gt;
  {&lt;br /&gt;
        char text[] = &amp;quot;5.6&amp;quot;;&lt;br /&gt;
        int zahl = (int) text;&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%d\n&amp;quot;, zahl);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ausgegeben wird weder 5 noch 6 sondern die Anfangsadresse des Strings &amp;lt;tt&amp;gt;&amp;quot;5.6&amp;quot;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Komma-Operator==&lt;br /&gt;
Mit einem &amp;lt;tt&amp;gt;,&amp;lt;/tt&amp;gt; können mehrere Ausdrücke nacheinander ausgewertet werden.&lt;br /&gt;
Die Auswertung erfolgt von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Solche Konstrukte sieht man manchmal in Abfragen wie&lt;br /&gt;
 FILE  *file;&lt;br /&gt;
 if (file = fopen (&amp;quot;foo.exe&amp;quot;, &amp;quot;r&amp;quot;), file != NULL)&lt;br /&gt;
was erst an &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; einen Wert zuweist und den &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Block nur betritt,&lt;br /&gt;
wenn &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; nicht der Nullpointer ist.&lt;br /&gt;
&lt;br /&gt;
Bequem kann das auch in einer [[#for-Schleife|for-Schleife]] sein, wenn man zwei (oder mehr) Laufvariablen hat oder so:&lt;br /&gt;
 for (i=0, j=0; i &amp;lt; 10; i++, j += 2)&lt;br /&gt;
    &amp;amp;middot;&amp;amp;middot;&amp;amp;middot;&lt;br /&gt;
&lt;br /&gt;
==Zuweisungen und Operatoren mit Nebeneffekt==&lt;br /&gt;
===Zuweisung===&lt;br /&gt;
=== ++ und -- ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;++&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;--&amp;lt;/tt&amp;gt; stellen einfachere Schreibweisen dar zum Addieren bzw. Subtrahieren von&amp;amp;nbsp;1.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;tt&amp;gt;++&amp;lt;/tt&amp;gt; (Inkrementieren)'''&lt;br /&gt;
 int foo = 1; &lt;br /&gt;
 foo++; &lt;br /&gt;
 {{comment|entspricht}}&lt;br /&gt;
 foo = foo + 1;&lt;br /&gt;
 {{comment|jetzt ist foo &amp;amp;#61; 3}}&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;tt&amp;gt;--&amp;lt;/tt&amp;gt; (Dekrementieren)'''&lt;br /&gt;
 int foo = 1; &lt;br /&gt;
 foo--;&lt;br /&gt;
 {{comment|entspricht}}&lt;br /&gt;
 foo = foo - 1;&lt;br /&gt;
 {{comment|jetzt ist foo &amp;amp;#61; -1}}&lt;br /&gt;
&lt;br /&gt;
Die beiden Operatoren können sowohl in der Präfix-Schreibweise (vor der Variablen) als auch als Postfix-Schreibweise (hinter der Variablen) notiert werden. &lt;br /&gt;
Der Unterschied liegt darin, dass beim Präfix der Wert zuerst neu berechnet wird und die Variable dann verwendet wird. Beim Postfix wird die Variable zuerst verwendet und erst nach Auswertung des Ausdrucks, in dem sie enthalten ist, neu berechnet.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel'''&lt;br /&gt;
 int ausgabe1, ausgabe2, var1 = 10, var2 = 10;&lt;br /&gt;
 ausgabe1 = 3 * ++var1; {{comment|ausgabe1 &amp;amp;#61; 33; var1 &amp;amp;#61; 11;}}&lt;br /&gt;
 ausgabe2 = 3 * var2++; {{comment|ausgabe2 &amp;amp;#61; 30; var2 &amp;amp;#61; 11;}}&lt;br /&gt;
&lt;br /&gt;
Für Zeiger arbeiten diese Operatoren etwas anders, siehe dazu [[#Zeiger-Arithmetik|Zeiger-Arithmetik]].&lt;br /&gt;
&lt;br /&gt;
===Bedingter Ausdruck===&lt;br /&gt;
 ({{Bedingung}}) ? {{Ausdruck|1}} : {{Ausdruck|2}}&lt;br /&gt;
Wenn &amp;lt;tt&amp;gt;Bedingung&amp;lt;/tt&amp;gt; erfüllt ist, dann wertet dieser Ausdruck aus zu &amp;lt;tt&amp;gt;Ausdruck1&amp;lt;/tt&amp;gt;. Ist er nicht erfüllt, dann wertet er aus zu &amp;lt;tt&amp;gt;Ausdruck2&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
 x = (x &amp;gt;= 3) ? 0 : x+1;&lt;br /&gt;
Startet man &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; mit dem Wert 0, dann nimmt es bei mehrfacher Anwendung dieser Zeile (z.B. in einer Schleife) nacheinander die folgende Werte an:&lt;br /&gt;
:&amp;lt;tt&amp;gt;1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, ...&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Reihenfolge der Auswertung==&lt;br /&gt;
&lt;br /&gt;
Wie auch in der Mathematik gibt es auch in C genaue Regeln über die Abarbeitungsreihenfolge (precedence)&lt;br /&gt;
der Operatoren. Dass sich alle C-Compiler genau an diesen ANSI-Vorschlag halten, ist leider nicht sicher.&lt;br /&gt;
Sicher jedoch ist, dass nicht jeder Programmierer diese Regel jederzeit im Kopf hat. &lt;br /&gt;
Daher ist es sinnvoll, Ausdrücke durch runde Klammern eindeutig zu kennzeichnen. &lt;br /&gt;
Nebenbei stören sich Compiler nicht an überflüssigen Klammerpaaren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!|Priorität ||Operator||Assoziativität&lt;br /&gt;
|-&lt;br /&gt;
  &lt;br /&gt;
|&amp;lt;tt&amp;gt;15&amp;lt;/tt&amp;gt; ||&amp;lt;tt&amp;gt; ( ) [ ] -&amp;gt; . &amp;lt;/tt&amp;gt;                      ||von links nach rechts&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;14&amp;lt;/tt&amp;gt; ||&amp;lt;tt&amp;gt;! ~ ++ -- + - (TYP) * &amp;amp; sizeof &amp;lt;/tt&amp;gt;    ||von rechts nach links&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;13&amp;lt;/tt&amp;gt; ||&amp;lt;tt&amp;gt; * / % (Rechenoperationen) &amp;lt;/tt&amp;gt;         ||von links nach rechts&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;12&amp;lt;/tt&amp;gt; ||&amp;lt;tt&amp;gt; + - (binär) &amp;lt;/tt&amp;gt;                       ||von links nach rechts&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;11&amp;lt;/tt&amp;gt; ||&amp;lt;tt&amp;gt; &amp;lt;&amp;lt; &amp;gt;&amp;gt; &amp;lt;/tt&amp;gt;                             ||von links nach rechts&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;10&amp;lt;/tt&amp;gt; ||&amp;lt;tt&amp;gt; &amp;lt; &amp;lt;= &amp;gt; &amp;gt;= &amp;lt;/tt&amp;gt;                         ||von links nach rechts&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt; 9&amp;lt;/tt&amp;gt; ||&amp;lt;tt&amp;gt; == != &amp;lt;/tt&amp;gt;                             ||von links nach rechts&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt; 8&amp;lt;/tt&amp;gt; ||&amp;lt;tt&amp;gt; &amp;amp; (bit-AND-Operator)&amp;lt;/tt&amp;gt;               ||von links nach rechts&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt; 7&amp;lt;/tt&amp;gt; ||&amp;lt;tt&amp;gt; ^ (bit-XOR-Operator)&amp;lt;/tt&amp;gt;               ||von links nach rechts&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt; 6&amp;lt;/tt&amp;gt; ||&amp;lt;tt&amp;gt; &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; (bit-OR-Operator)&amp;lt;/tt&amp;gt;   ||von links nach rechts&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt; 5&amp;lt;/tt&amp;gt; ||&amp;lt;tt&amp;gt; &amp;amp;&amp;amp; &amp;lt;/tt&amp;gt;                                ||von links nach rechts&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt; 4&amp;lt;/tt&amp;gt; ||&amp;lt;tt&amp;gt; &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; &amp;lt;/tt&amp;gt;               ||von links nach rechts&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt; 3&amp;lt;/tt&amp;gt; ||&amp;lt;tt&amp;gt;? : &amp;lt;/tt&amp;gt;                               ||von rechts nach links&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt; 2&amp;lt;/tt&amp;gt; ||&amp;lt;tt&amp;gt; = += -= /= *= %= &amp;gt;&amp;gt;= &amp;lt;&amp;lt;= &amp;amp;= &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;= ^= &amp;lt;/tt&amp;gt; ||von rechts nach links&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt; 1&amp;lt;/tt&amp;gt; ||&amp;lt;tt&amp;gt; , (Sequenz-Operator) &amp;lt;/tt&amp;gt;              ||von links nach rechts&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Reihenfolge der Auswertung von Funktionsargumenten ist in der ANSI-Spezifikation nicht angegeben und daher compilerabhängig. Von Konstrukten wie&lt;br /&gt;
 {&lt;br /&gt;
    int i=0;&lt;br /&gt;
    func (i++, i++);&lt;br /&gt;
 }&lt;br /&gt;
ist also dringend abzuraten!&lt;br /&gt;
&lt;br /&gt;
=Kontrollanweisungen=&lt;br /&gt;
&lt;br /&gt;
Eine Kontrollanweisung ist eine Anweisung, die Einfluss auf den Programmfluss hat. Normalerweise werden Anweisungen so ausgeführt, wie sie in der Quelldatei stehen: Von links nach rechts (falls mehrere Anweisungen in einer Zeile stehen sollten, wovon i.A. abzuraten ist) und von oben nach unten. Mit einer Kontrollanweisung kann dieser lineare Programmfluss durchbrochen werden: Die Codeausführung kann kann abhängig von einer Bedingung gemacht werden (&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;), kann wiederholt werden (Schleife) oder an einer anderen Stelle der Funktion fortgesetzt werden (&amp;lt;tt&amp;gt;goto&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==if-Anweisung==&lt;br /&gt;
Mit Hilfe des if-Befehls kann man Codeteile abhängig davon einer Bedingung ausführen lassen:&lt;br /&gt;
&lt;br /&gt;
'''Syntax:'''&lt;br /&gt;
 if ({{Bedingung}})&lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
oder mit else-Teil&lt;br /&gt;
 if ({{Bedingung}})&lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
 else&lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
 if (x &amp;gt; 100)&lt;br /&gt;
 {&lt;br /&gt;
    {{comment|falls x &amp;gt; 100 ist: Fehlerausgabe}}&lt;br /&gt;
    printf (&amp;quot;x = %d ist zu gross fuer die Berechnung!\n&amp;quot;, x);&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
    {{comment|falls x &amp;lt;&amp;amp;#61; 100 ist: Berechne Summe der Zahlen 1...x}}&lt;br /&gt;
    {{comment|Die lokale Variable x2 lebt nur innerhalb dieses alse-Blocks}}&lt;br /&gt;
    int x2 = x;&lt;br /&gt;
 &lt;br /&gt;
    for (x = 0; x2 &amp;gt; 0; x2--)&lt;br /&gt;
       x += x2;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Wenn die Bedingung wahr ist (&amp;lt;tt&amp;gt;x &amp;gt; 100&amp;lt;/tt&amp;gt;), dann wird eine Meldung ausgegeben; danach ist die if-Anweisung beendet. Der else-Block wird also nicht ausgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist die Bedingung nicht erfüllt (&amp;lt;tt&amp;gt;x &amp;amp;le; 100&amp;lt;/tt&amp;gt;), dann wird gleich zum else-Teil gesprungen, und nach dessen Ausführung der if-Befehl beendet.&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Ein häufiger Fehler ist es, statt &amp;lt;tt&amp;gt;if (a &amp;amp;#61;&amp;amp;#61; 23)&amp;lt;/tt&amp;gt; etwas wie &amp;lt;tt&amp;gt;if (a &amp;amp;#61; 23)&amp;lt;/tt&amp;gt; zu schreiben. &lt;br /&gt;
Dann wird allerdings nicht geprüft, ob die Variable&amp;amp;nbsp;&amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; gleich 23 ist, sondern der Variablen&amp;amp;nbsp;&amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; wird der Wert 23 zugewiesen. Der Ausdruck &amp;lt;tt&amp;gt;a &amp;amp;#61; 23&amp;lt;/tt&amp;gt; hat den Wert&amp;amp;nbsp;23 und ist damit immer &amp;quot;wahr&amp;quot;! Daher ist diese if-Bedingung immer erfüllt!&lt;br /&gt;
&lt;br /&gt;
Die Syntax hierbei ist allerdings korrekt, der Compiler wird also keinen Fehler ausspucken sondern bestenfalls eine Warnung. Damit ist dieser Fehler sehr schwer zu finden. Abhilfe schafft die Schreibweise &amp;lt;tt&amp;gt;if (23 &amp;amp;#61;&amp;amp;#61; a)&amp;lt;/tt&amp;gt;. Wenn man dort anstatt des Vergleichsoperators '&amp;lt;tt&amp;gt;&amp;amp;#61;&amp;amp;#61;&amp;lt;/tt&amp;gt;' den Zuweisungsoperator '&amp;lt;tt&amp;gt;&amp;amp;#61;&amp;lt;/tt&amp;gt;' verwendet, spuckt der Compiler sehr wohl einen Fehler aus! Ist die Zuweisung jedoch erwünscht und eine Compiler-Warnung lästig, dann wählt man eine Schreibweise wie &amp;lt;tt&amp;gt;if ((a &amp;amp;#61; b))&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;if (a &amp;amp;#61; b, a)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer häufiger Fehler ist zu schreiben &amp;lt;tt&amp;gt;if (Bedingung);&amp;lt;/tt&amp;gt; Richtig muss es heissen &amp;quot;&amp;lt;tt&amp;gt;if(Bedingung)&amp;lt;/tt&amp;gt;&amp;quot; Das Semikolon im ersten Fall ist eine leere Anweisung, die im if-Falle ausgeführt wird &amp;amp;ndash; sie bleibt also ohne Resultet. Auch hier liegt kein Syntaxfehler vor und der Compiler schweigt; ein auf das Semikolon folgende Anweisung die eigentlich zum &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; gehören soll wird immer ausgeführt, die sie nicht mehr zum &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; dazu gehört.&lt;br /&gt;
}}&lt;br /&gt;
Bei verschachtelten &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-&amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt;-Konstrukten gehört ein &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; zu letzten &amp;quot;freien&amp;quot; &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;. Soll in einer &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-&amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt;-Folge das &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; zum ersten &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; gehören, dann ist das so zu hinzuschreiben:&lt;br /&gt;
 if ({{Bedingung}})&lt;br /&gt;
 {&lt;br /&gt;
    if ({{Bedingung}})&lt;br /&gt;
       {{Anweisung}}&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
Ohne die geschweiften Klammern um das zweite &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; gehörte das &amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt; dort hinzu.&lt;br /&gt;
&lt;br /&gt;
==switch-Anweisung==&lt;br /&gt;
'''Syntax:'''&lt;br /&gt;
&lt;br /&gt;
 switch ({{Ausdruck|}}) &lt;br /&gt;
 {&lt;br /&gt;
     case konstante1:&lt;br /&gt;
         {{Anweisung}}&lt;br /&gt;
         {{Anweisung}}&lt;br /&gt;
         ...&lt;br /&gt;
         break;&lt;br /&gt;
&lt;br /&gt;
     case konstante2:&lt;br /&gt;
         {{Anweisung}}&lt;br /&gt;
         {{Anweisung}}&lt;br /&gt;
         ...&lt;br /&gt;
         break;&lt;br /&gt;
          &lt;br /&gt;
     {{comment|weitere case-Marken}}&lt;br /&gt;
 &lt;br /&gt;
     default:&lt;br /&gt;
         {{Anweisung}}&lt;br /&gt;
         {{Anweisung}}&lt;br /&gt;
         ...&lt;br /&gt;
 } {{comment|Ende von switch}} &lt;br /&gt;
&lt;br /&gt;
Der Ausdruck muss ein skalarer Typ sein, er wird in die nächste ganze Zahl gewandelt und mit den Werten hinter den &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt;-Marken verglichen. Bei einer Übereinstimmung werden alle Befehle ab dem zutreffenden &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt; ausgeführt. Stimmt der Ausdruck mit keinem der Werte überein, so wird der &amp;lt;tt&amp;gt;default&amp;lt;/tt&amp;gt;-Abschnitt ausgeführt falls vorhanden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Auch die Anweisungen der nachfolgenden &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt;- und des &amp;lt;tt&amp;gt;default&amp;lt;/tt&amp;gt;-Abschnitts werden ausgeführt, wenn die Anweisungen des &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt;-Abschnitts nicht mit dem Befehl &amp;lt;tt&amp;gt;break;&amp;lt;/tt&amp;gt; beendet werden!&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es dürfen beliebig viele &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt;-Abschnitte angegeben werden, pro Vergleichswert jedoch nur einer.&lt;br /&gt;
Der &amp;lt;tt&amp;gt;default&amp;lt;/tt&amp;gt;-Abschnitt ist optional. Die Reihenfolge, in der &amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;default&amp;lt;/tt&amp;gt; angegeben werden, ist unerheblich.&lt;br /&gt;
&lt;br /&gt;
==Schleifen==&lt;br /&gt;
Um Anweisungen mehrmals hintereinander auszuführen, benötigt man Schleifen. Diese führen Anweisungen aus, bis oder solange Bedingungen erfüllt sind.&amp;lt;br&amp;gt; &lt;br /&gt;
Wichtig ist also, ob die Bedingung '''vor''' oder '''nach''' den Schleifen-Anweisungen geprüft wird. &lt;br /&gt;
&lt;br /&gt;
===while-Schleife===&lt;br /&gt;
'''Syntax:'''&lt;br /&gt;
 while ({{Bedingung}})&lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
&lt;br /&gt;
Die while-Schleife wird solange durchlaufen, wie die Bedingung erfüllt ist. Die Schleife wird also unter Umständen garnicht durchlaufen. Die Anweisung kann natürlich auch ein Block sein, der aus mehreren Deklarationen und Anweisungen besteht. &lt;br /&gt;
&lt;br /&gt;
 int zahl1 = 0;&lt;br /&gt;
 int zahl2 = 1;&lt;br /&gt;
 &lt;br /&gt;
 while (zahl1 &amp;lt; 3)&lt;br /&gt;
 {&lt;br /&gt;
    zahl1 = zahl1 + 1;&lt;br /&gt;
    zahl2 = zahl2 * 2;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird die Schleife drei mal durchlaufen. Zu Beginn des vierten Durchlaufs ist die Bedingung nicht mehr erfüllt (&amp;lt;tt&amp;gt;zahl1&amp;lt;/tt&amp;gt; ist dann nicht mehr kleiner, sondern gleich 3!), also wird mit dem Befehl nach der Schleife fortgesetzt.&lt;br /&gt;
&lt;br /&gt;
===do-while-Schleife===&lt;br /&gt;
'''Syntax:'''&lt;br /&gt;
 do&lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
 while ({{Bedingung}});&lt;br /&gt;
&lt;br /&gt;
Die do-while-Schleife wird auf jeden Fall einmal durchlaufen und dann solange wiederholt, wie die Bedingung erfüllt ist.&lt;br /&gt;
 int i = 2;&lt;br /&gt;
 &lt;br /&gt;
 do &lt;br /&gt;
 {&lt;br /&gt;
     i = i*i;   {{comment|i quadrieren}}&lt;br /&gt;
     printf (&amp;quot;i = %d\n&amp;quot;, i);&lt;br /&gt;
 }&lt;br /&gt;
 while (i &amp;lt; 20);&lt;br /&gt;
&lt;br /&gt;
Die Schleife wird durchlaufen und wiederholt, solange &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; kleiner als 20 ist. Es werden also nacheinander die Werte 2, 4 und 16 ausgegeben. Nach der Schleife hat&amp;amp;nbsp;&amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; den Wert 256.&lt;br /&gt;
&lt;br /&gt;
===for-Schleife===&lt;br /&gt;
'''Syntax:''' &lt;br /&gt;
 for ({{Ausdruck|1}}; {{Bedingung}}; {{Ausdruck|2}})&lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
&lt;br /&gt;
Bei den Ausdrücken wird es sich um einen Ausdrücke mit Nebeneffekt handeln wie etwa &amp;lt;tt&amp;gt;i=0&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;i=i+2&amp;lt;/tt&amp;gt;. Es werden folgende Aktionen ausgeführt:&lt;br /&gt;
# &amp;lt;tt&amp;gt;Ausdruck1&amp;lt;/tt&amp;gt; wird ausgewertet&lt;br /&gt;
# &amp;lt;tt&amp;gt;Bedingung&amp;lt;/tt&amp;gt; wird ausgewertet&lt;br /&gt;
# falls die Bedingung wahr ist, dann führe &amp;lt;tt&amp;gt;Anweisung&amp;lt;/tt&amp;gt; aus.&lt;br /&gt;
# falls die Bedingung unwahr ist, dann sprinte zu 7 (Ende).&lt;br /&gt;
# &amp;lt;tt&amp;gt;Ausdruck2&amp;lt;/tt&amp;gt; wird ausgewertet&lt;br /&gt;
# gehe zu 2&lt;br /&gt;
# nächste Anweisung nach der for-Schleife&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
 int lauf, summe;&lt;br /&gt;
 &lt;br /&gt;
 for (lauf=1, summe=0; lauf &amp;lt;= 10; lauf += 2) &lt;br /&gt;
 {&lt;br /&gt;
    summe += lauf;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel ist &amp;lt;tt&amp;gt;Ausdruck1&amp;lt;/tt&amp;gt; ein [[#Komma-Operator|Komma-Ausdruck]], der zwei Anweisungen kombiniert und daher sogar zwei Nebeneffente hat: er setzt &amp;lt;tt&amp;gt;lauf&amp;lt;/tt&amp;gt; auf&amp;amp;nbsp;1 und &amp;lt;tt&amp;gt;summe&amp;lt;/tt&amp;gt; auf&amp;amp;nbsp;0.&lt;br /&gt;
&lt;br /&gt;
Das Äquivalent als while-Schleife:&lt;br /&gt;
&lt;br /&gt;
 int lauf  = 1;                 {{comment|Anfangswerte}}&lt;br /&gt;
 int summe = 0;&lt;br /&gt;
 &lt;br /&gt;
 while (lauf &amp;lt;= 10)             {{comment|Bedingung}}&lt;br /&gt;
 {&lt;br /&gt;
    summe += lauf;&lt;br /&gt;
    lauf  += 2;                 {{comment|Inkrement}}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel wird &amp;lt;tt&amp;gt;summe&amp;lt;/tt&amp;gt; in jedem Schleifendurchlauf um die Laufvariable &amp;lt;tt&amp;gt;lauf&amp;lt;/tt&amp;gt; erhöht. Da &amp;lt;tt&amp;gt;lauf&amp;lt;/tt&amp;gt; nacheinander die ungeraden Werte von&amp;amp;nbsp;1 bis&amp;amp;nbsp;10 annimmt, ist in &amp;lt;tt&amp;gt;summe&amp;lt;/tt&amp;gt; nach der Schleife die Summe der ungeraden Zahlen von&amp;amp;nbsp;1 bis kleinergleich 10 gespeichert, also der Wert&amp;amp;nbsp;25. &amp;lt;tt&amp;gt;lauf&amp;lt;/tt&amp;gt; hat nach der Schleife den Wert&amp;amp;nbsp;11.&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
&amp;lt;tt&amp;gt;lauf = 1&amp;lt;/tt&amp;gt; bedeutet, dass der Variablen &amp;lt;tt&amp;gt;lauf&amp;lt;/tt&amp;gt; vor dem ersten Schleifendurchlauf der Wert&amp;amp;nbsp;1 zugewiesen wird. &lt;br /&gt;
&amp;lt;tt&amp;gt;lauf &amp;lt;= 10&amp;lt;/tt&amp;gt; ist die Schleifenbedingung; ist sie nicht erfüllt, wird die Schleife beendet. &lt;br /&gt;
&amp;lt;tt&amp;gt;lauf += 2&amp;lt;/tt&amp;gt; bedeutet, dass &amp;lt;tt&amp;gt;lauf&amp;lt;/tt&amp;gt; nach jedem Durchlauf um&amp;amp;nbsp;2 erhöht wird.&lt;br /&gt;
&lt;br /&gt;
===continue-Anweisung===&lt;br /&gt;
Innerhalb einer Schleife darf die &amp;lt;tt&amp;gt;continue&amp;lt;/tt&amp;gt;-Instruktion stehen. Sie bewirkt, daß die nachfolgenden Anweisungen übersprungen werden und mit dem nächsten Schleifendurchlauf fortgesetzt wird &amp;amp;ndash; vorausgesetzt die Schleifenbedingung ist noch erfüllt. Ein &amp;lt;tt&amp;gt;continue&amp;lt;/tt&amp;gt; darf natürlich auch innerhalb eines &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; etc. stehen, wenn dieses innerhalb einer Schleife steht.&lt;br /&gt;
&lt;br /&gt;
==break-Anweisung==&lt;br /&gt;
Innerhalb einer Schleife oder eines &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; darf die &amp;lt;tt&amp;gt;break&amp;lt;/tt&amp;gt;-Instruktion stehen. Sie bewirkt, daß die Schleifen-/Switch-Anweisung sofort verlassen wird und das Programm dahinter weiter macht. Bei mehrfach geschachtelten Schleifen wird nur die innere verlassen. Ein &amp;lt;tt&amp;gt;break&amp;lt;/tt&amp;gt; darf natürlich auch innerhalb eines &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; stehen, wenn dieses innerhalb einer Schleife/Switch-Anweisung steht.&lt;br /&gt;
&lt;br /&gt;
==goto-Anweisung==&lt;br /&gt;
&lt;br /&gt;
Innerhalb ein und derselben Funktion kann mit &amp;lt;tt&amp;gt;goto&amp;lt;/tt&amp;gt; an eine andere Stelle gesprungen werden. Dazu gibt man hinter dem &amp;lt;tt&amp;gt;goto&amp;lt;/tt&amp;gt; einen Bezeichner an, der dadurch als Label fungiert:&lt;br /&gt;
&lt;br /&gt;
'''Syntax:'''&lt;br /&gt;
 goto {{Bezeichner}};&lt;br /&gt;
Die Bezeichner selbst steht irgendwo in der Funktion und wird dadurch zur Sprungmarke (Label), daß er von einem Doppelpunkt (und mindestens einer C-Anweisung, die auch leer sein darf) gefolgt wird.&lt;br /&gt;
&lt;br /&gt;
Das Beispiel durchsucht das 2-dimensionale &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;-Array &amp;lt;tt&amp;gt;feld&amp;lt;/tt&amp;gt; mit den &amp;lt;tt&amp;gt;SIZE_X &amp;amp;times; SIZE_Y&amp;lt;/tt&amp;gt; Werten nach dem Wert&amp;amp;nbsp;&amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt;. Wird er gefunden, dann wird die 2-fach geschachtelte Suchschleife verlassen.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
 int x, y;&lt;br /&gt;
 &lt;br /&gt;
 for (x=0; x &amp;lt; SIZE_X; x++)&lt;br /&gt;
    for (y=0; y &amp;lt; SIZE_Y; y++)&lt;br /&gt;
       if (feld[x][y] == 0)&lt;br /&gt;
          goto done;&lt;br /&gt;
 {{Label|done:}};&lt;br /&gt;
&lt;br /&gt;
Der folgende Code hat die gleiche Funktion, arbeitet jedoch ohne &amp;lt;tt&amp;gt;goto&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 int x, y;&lt;br /&gt;
 int found = 0; {{comment|FALSE}}&lt;br /&gt;
 &lt;br /&gt;
 for (x=0; x &amp;lt; SIZE_X &amp;amp;&amp;amp; !found; x++)&lt;br /&gt;
    for (y=0; y &amp;lt; SIZE_Y &amp;amp;&amp;amp; !found; y++)&lt;br /&gt;
       found = (0 == feld[x][y]);&lt;br /&gt;
Der Nachteil der &amp;lt;tt&amp;gt;goto&amp;lt;/tt&amp;gt;-losen Variante ist, daß man eine Variable, die merkt, ob das Suchziel gefunden wurde, mitschleppen und in ''jedem'' Schleifendurchlauf abtesten muss. Dies bedeutet einen höheren Programmier- und Laufzeitaufwand und ist nicht so klar formuliert wie das &amp;lt;tt&amp;gt;goto&amp;lt;/tt&amp;gt;-Beispiel.&lt;br /&gt;
&lt;br /&gt;
Gleichwohl sei angemerkt, daß die Verwendung von &amp;lt;tt&amp;gt;goto&amp;lt;/tt&amp;gt; einem gewissen Dogmatismus unterliegt, der sich wie folgt subsummieren liesse:&lt;br /&gt;
:''goto ist böse und sollte keinesfalls verwendet werden! Wer es dennoch tut, offenbart dadurch seinen schlechten Geschmach sowie mangelhafte C-Kenntnis.'' &amp;lt;div align=&amp;quot;right&amp;quot;&amp;gt;http://www.roboternetz.de/phpBB2/images/smiles/icon_wink.gif&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Funktionen=&lt;br /&gt;
Stell Dir vor, Du hast eine Code-Folge, die mehrmals im Programm vorkommt, z.B. eine mathematische Formel. Anstatt dieses Codestück mehrmals zu schreiben &amp;amp;ndash; was Dich Zeit beim Erstellen des Programms und Speicherplatz im ausführbaren Programm kostet &amp;amp;ndash; kannst Du den Code-Abschnitt in eine Funktion schreiben und diese von jeder Stelle des Programms aus verwenden. Die Hauptgründe, um Funktionen zu verwenden, sind:&lt;br /&gt;
;Wiederverwendung von Code: Mehrfach verwendete Codestücke müssen nicht mehrfach implementiert werden. Oft unterscheiden sich die Codesequenzen nur in Kleinigkeiten, die man der Funktion über Parameter mitteilen kann.&lt;br /&gt;
;Übersichtlichkeit: Ein gut gegliedertes C-Programm implementiert klar umrissene Aufgaben in einer Funktion, auch wenn diese Funktion nur einmal im Code aufgerufen wird! Dadurch bleibt der Code um die Aufrufstelle besser verständlich, und man kann auf verschiedenen &amp;quot;Ebenen&amp;quot; denken. Eine Funktion wie &amp;quot;Datei öffnen&amp;quot; kann recht komplex sein. Auf höherer Ebene interessieren die Innereien nicht mehr, man möchte sich um andere Dinge kümmern und will den Code an der Stelle garnicht sehen...&lt;br /&gt;
;Rekursive Funktionen: Eine Funktion kann sich auch selbst aufrufen. In dem Falle nennt man die Funktion ''rekursiv''. Zwar lässt sich das, was eine rekursive Funktion tut, auch mit anderen Mitteln formulieren, die keine rekursiven Funktionen brauchen, aber oft ist der rekursive Weg knackiger und klarer formulierbar als eine nicht-rekursiven Ansatz, auch wenn es etwas mehr Resourcen verbraucht.&lt;br /&gt;
;Modulare Programmierung: Funktionen können anhand ihres Aufgabenbereichs auf verschiedene C-Quellen &amp;amp;ndash; sogenannte ''Module'' &amp;amp;ndash; verteilt werden. Funktionen, die etwas mit dem USB-Bus anstellen, werden in einem anderen Modul sein als mathematische Funktionen. Dies erhöht die Übersichtlichkeit und vereinfacht die Entwicklung im Team.&lt;br /&gt;
;Bibliotheken: Standard-Funktionen wie das hier oft auftauchende &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt; sind in Bibliotheken gespeichert. Wenn das eigene Programm übersetzt wird, dann müssen nicht mehr alle Standard-Funktionen übersetzt werden, sondern werden nur noch aus der Bibliothek gelesen und ihr Code zum Programm dazugelinkt. Die Bibliotheks-Funktionen wurden schon zu einem früheren Zeitpunkt compiliert und liegen in dieser compilerten Form in der Bibliothek. Das spart mächtig Entwicklungszeit. Man kann auch selbst solche Bibliotheken erstellen und in diversen Projekten wiederverwenden.&lt;br /&gt;
;Generische Programmierung: In C ist es möglich, einer Funktion eine andere Funktion zu übergeben. (Damit ist nicht gemeint, ihr deren ''Rückgabewert'' zu übergeben (was auch ginge), sondern ''die Funktion selbst'' wird als Parameter übergeben und kann aufgerufen werden.) Ein typisches Beispiel dafür sind Sortieralgorithmen. Einem Sortieralgorithmus kann es egal sein, ''was'' er sortiert. Er muss lediglich wissen, ''wie'' er das Zeug zu sortieren hat: aufsteigend, absteigend, als Zahl, in lexikographischer Ordnung, nach der Quersumme, Körper nach Oberfläche, Durchmesser, Gewicht oder Volumen... Diese Vergleichsfunktion, die für zwei Objekte entscheidet, welches davon &amp;quot;kleiner&amp;quot; ist, kann man dem Sortierer übergeben. Will er zwei Werte vergleichen, dann muss er nur die Vergleichsfunktion aufrufen, ohne zu wissen, was diese tut. Damit kann der Sortieralgorithmus unanhängig von den Objekten gehalten werden, mit denen er hantieren soll.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Definition==&lt;br /&gt;
&lt;br /&gt;
In der ''Definition'' der Funktion wird gesagt, welche Werte sie liefern kann, wie sie heisst (Bezeichner) und wieviele und welche Parameter sie hat. Danach folgt ihre Implementierung:&lt;br /&gt;
&lt;br /&gt;
'''Syntax:'''&lt;br /&gt;
 {{Type}} {{Bezeichner}} ({{Parameterliste}})&lt;br /&gt;
 {&lt;br /&gt;
    {{Deklaration}}&lt;br /&gt;
    {{Deklaration}}&lt;br /&gt;
    ...&lt;br /&gt;
 &lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
Für Funktionen, die keinen Wert zurückliefern, gibt es den speziellen Typ &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;, der besagt, daß die Funktion nichts zurückgibt. Die einfachste denkbare Funktion ist eine solch void-Funktion. Sie bekommt keine Parameter, gibt nicht zurück und ihr Body ist leer:&lt;br /&gt;
 void dummy()&lt;br /&gt;
 {&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==return-Anweisung==&lt;br /&gt;
An jeder Stelle des Programmflusses einer Funktion kann diese mit &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; beendet werden.&lt;br /&gt;
&lt;br /&gt;
'''bei void-Funktionen:'''&lt;br /&gt;
 return;&lt;br /&gt;
'''Funktionen mit Rückgabe-Wert:'''&lt;br /&gt;
 return {{Ausdruck|}};&lt;br /&gt;
Die zweite Variante gibt an, welcher Wert zurückgegeben wird.&lt;br /&gt;
 int main (int argc, char * argv[])&lt;br /&gt;
 {&lt;br /&gt;
    if (argc &amp;lt; 2)&lt;br /&gt;
       return -1;&lt;br /&gt;
 &lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
Falls die letzte Anweisung einer void-Funktion ein &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; ist, kann es auch weggelassen werden wie oben bei der Funktion &amp;lt;tt&amp;gt;dummy&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Aufruf==&lt;br /&gt;
Um die Funktion aufzurufen gibt man ihren Namen an, gefolgt von den durch Komma getrennten Argumenten in runden Klammern wie im Beispiel unten das&lt;br /&gt;
 quadrat (5) &lt;br /&gt;
Da &amp;lt;tt&amp;gt;quadrat&amp;lt;/tt&amp;gt; einen Wert liefert, kann man damit weiter rechnen wie mit einem normalen Ausdruck:&lt;br /&gt;
 if (quadrat (a) + quadrat (b) == quadrat (c))&lt;br /&gt;
    c = quadrat (quadrat (a)); {{comment|c &amp;amp;#61; a hoch 4}}&lt;br /&gt;
&lt;br /&gt;
;Ein Hinweis am Rande: Der Name einer Funktion ohne die beiden runden Klammern ist der Pointer/Zeiger auf ihren Anfang. Damit kann ein Funktionsname überall dort verwendet werden, wo Pointer/Zeiger zulässig sind. Insbesondere kann er als Argument einer weiteren Funktion dienen. Siehe auch [[#Zeiger auf Funktionen|Zeiger auf Funktionen]].&lt;br /&gt;
&lt;br /&gt;
==Rekursive Funktionen==&lt;br /&gt;
Eine Funktion die sich selbst &amp;amp;ndash; möglicheweise auch über andere Zwischenfunktionen &amp;amp;ndash; wieder selbst aufruft, wird als ''rekursive Funktion'' bezeichnet. In der Definition ist nichts besonderes zu beachten. Ist die Verschachtelungstiefe im laufenden Programm zu tief, dann gibt das natürlich Probleme, aber das gilt bei tief verschachtelten 'normalen' Funktionen ebenso...&lt;br /&gt;
&lt;br /&gt;
Das Beispiel berechnet den Größten Gemeinsamen Teiler zweier Zahlen &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 int ggT (int a, int b)&lt;br /&gt;
 {&lt;br /&gt;
     if (0 == a)&lt;br /&gt;
        return b;&lt;br /&gt;
 &lt;br /&gt;
    return ggT (b % a, a);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Beispiel==&lt;br /&gt;
&lt;br /&gt;
Ein komplettes kleines Programm:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int quadrat (int param1)&lt;br /&gt;
{&lt;br /&gt;
  int zahl;&lt;br /&gt;
  zahl = param1 * param1;&lt;br /&gt;
  return zahl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main ()&lt;br /&gt;
{&lt;br /&gt;
  int zahl, ergebnis;&lt;br /&gt;
  &lt;br /&gt;
  printf (&amp;quot;Bitte Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf  (&amp;quot;%d&amp;quot;, &amp;amp;zahl);&lt;br /&gt;
  &lt;br /&gt;
  ergebnis = quadrat (zahl);&lt;br /&gt;
  &lt;br /&gt;
  printf (&amp;quot;%d hoch 2 = %d\n&amp;quot;, zahl, ergebnis);&lt;br /&gt;
  printf (&amp;quot;%d hoch 2 = %d\n&amp;quot;, 5, quadrat (5));&lt;br /&gt;
  &lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Unterprogramm kann an jeder beliebigen Stelle innerhalb eines Programmes stehen, aber nur ausserhalb von Blöcken. Geschachtelte Unterprogramme sind in Standard-C nicht möglich. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen |&lt;br /&gt;
'''Merke:''' Auch wenn eine Funktion keine Parameter hat, müssen beim Aufruf die Klammern angeben werden:&lt;br /&gt;
 dummy();&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Prototypen==&lt;br /&gt;
Wie oben erwähnt, kann ein Unterprogramm an jeder beliebigen Stelle im Programm stehen. Damit ist jedoch eine Bedingung verknüpft: Das Unterprogramm muß in der Datei oberhalb des ersten Aufrufes definiert worden sein. Wenn Sie ein Unterprogramm in Zeile 10 zum ersten mal aufrufen, müssen Sie die Deklaration davor erledigt haben. Verstanden?&lt;br /&gt;
Um dies zu erreichen, gibt es zwei Möglichkeiten: &lt;br /&gt;
&lt;br /&gt;
Entweder Sie schreiben alle Unterprogramme vor &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt; in die Datei. Dies muß jedoch wiederum so geschehen, dass Funktionen zum Zeitpunkt ihres Aufrufes bereits bekannt sind! &lt;br /&gt;
Wo dies nicht möglich ist (z.B. sich gegenseitig aufrufende Unterprogramme), oder wenn Sie das stört, müssen Sie Prototypen verwenden. &lt;br /&gt;
Wie definiert man nun Prototypen? Sie kopieren einfach die erste Zeile des Unterprogrammes (z.B. &amp;quot;&amp;lt;tt&amp;gt;void ausgeben (int zahl)&amp;lt;/tt&amp;gt;&amp;quot;), fügen einen Strichpunkt&amp;amp;nbsp;&amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt;an und fügen es an einer geeigneten Stelle ein (so, dass alle Aufrufe später in der Datei kommen). &lt;br /&gt;
Solche Definitionen stehen gewöhnlich am Anfang der Quelldatei oder in einer Header-Datei, die eingebunden wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void ausgeben (int zahl);  /* Der Prototyp */&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
   ausgeben (12);&lt;br /&gt;
   &lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ausgeben (int zahl)   /* Die eigentliche Prozedur */&lt;br /&gt;
{&lt;br /&gt;
  printf (&amp;quot;Ausgabe: %d\n&amp;quot;, zahl);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Parameterübergabe==&lt;br /&gt;
&lt;br /&gt;
Alle Werte, die an Prozeduren und Funktionen übergeben werden, werden grundsätzlich '''kopiert'''.&lt;br /&gt;
Das hat folgende Auswirkungen:&lt;br /&gt;
&lt;br /&gt;
# Änderungen an einem Parameter in einer Funktion erscheinen ''nicht'' beim Aufrufer!&lt;br /&gt;
# Möchte man, dass eine Funktion einen Wert trotzdem dauerhaft ändern soll, so muss die Adresse des Wertes via [[#Zeiger|Zeiger]] übergeben werden.&lt;br /&gt;
# Werden [[#Strukturen|Strukturen]] übergeben, so wird von ihnen eine Kopie erstellt, was bei großen Strukturen viel Zeit und Arbeitsspeicher kostet. Deshalb wird häufig nur die Adresse von Strukturen übergeben, da die Adresse viel schneller und platzsparender als die Struktur selbst kopiert werden kann.&lt;br /&gt;
&lt;br /&gt;
'''Beispiele:'''&lt;br /&gt;
 void erhoehe (int x)&lt;br /&gt;
 {&lt;br /&gt;
    x = x + 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main (void)&lt;br /&gt;
 {&lt;br /&gt;
    int a = 0;&lt;br /&gt;
    erhoehe(a);&lt;br /&gt;
    {{comment|a ist immer noch 0}}&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Beim Aufruf von &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; wird eine Kopie des Wertes von &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; (im Beispiel also 0) erstellt und der Prozedur als Parameter &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; übergeben. Weil dann die Prozedur &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; die Kopie verändert, hat dies keine Auswirkung auf das Original &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; im Hauptprogramm.&lt;br /&gt;
&lt;br /&gt;
 void erhoehe (int *x)&lt;br /&gt;
 {&lt;br /&gt;
    {{comment|erhoehe den Wert an der Adresse x um eins}}&lt;br /&gt;
    *x = *x + 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main(void)&lt;br /&gt;
 {&lt;br /&gt;
    int a = 0;&lt;br /&gt;
    erhoehe (&amp;amp;a);&lt;br /&gt;
    {{comment|a ist jetzt 1}}&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Jetzt wird im Hauptprogramm mittels [[#Adress-Operator und Dereferenzierung|Adress-Operator]] &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;lt;/tt&amp;gt; die Speicheradresse von &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; bestimmt. Dann wird eine ''Kopie der Adresse'' an das Unterprogramm &amp;lt;tt&amp;gt;erhoehe&amp;lt;/tt&amp;gt; übergeben. Jetzt kennt das Unterprogramm die&lt;br /&gt;
Adresse des Originals &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; und kann direkt mit dem Inhalts-Operator&amp;amp;nbsp;&amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; auf den Wert an dieser Adresse zugreifen.&lt;br /&gt;
&lt;br /&gt;
'''Besonderheit bei Feldern'''&lt;br /&gt;
&lt;br /&gt;
Bei der Übergabe von [[#Felder|Feldern]] gibt es eine Besonderheit. Schreibt man nämlich den Namen eines Feldes, so ist das nichts anderes als die '''Speicheradresse des ersten Elements'''.&lt;br /&gt;
Bei der Übergabe eines Feldes wird also eine Kopie der Startadresse übergeben. Somit kann das Unterprogramm auf den Originaldaten arbeiten und diese verändern.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
 void erhoehe (int x[])&lt;br /&gt;
 {&lt;br /&gt;
    x[0] = x[0] + 1;&lt;br /&gt;
    x[1] = x[1] + 3;&lt;br /&gt;
    x[2] = x[2] + 5;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main(int argc, char **argv)&lt;br /&gt;
 {&lt;br /&gt;
   int a[] = {10, 20, 30};&lt;br /&gt;
   &lt;br /&gt;
   erhoehe (a);&lt;br /&gt;
   {{comment|a hat jetzt folgenden Inhalte: 11, 23, 35}}&lt;br /&gt;
   &lt;br /&gt;
   return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Dass die Übergabe einer Adresse erfolgt, sieht man an folgendem Beispiel, das von der Funktionsweise '''absolut identisch''' mit dem vorhergehenden ist:&lt;br /&gt;
&lt;br /&gt;
 {{comment|Bei Parametern gibt es keinen Unterschied zwischen Zeiger und Feld}}&lt;br /&gt;
 void erhoehe (int *x)&lt;br /&gt;
 {&lt;br /&gt;
    x[0] = x[0] + 1;&lt;br /&gt;
    x[1] = x[1] + 3;&lt;br /&gt;
    x[2] = x[2] + 5;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main(int argc, char **argv)&lt;br /&gt;
 {&lt;br /&gt;
    int a[] = {10, 20, 30};&lt;br /&gt;
   &lt;br /&gt;
    erhoehe (a);&lt;br /&gt;
 &lt;br /&gt;
    {{comment|a hat jetzt folgenden Inhalt: 11, 23, 35}}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
{{FarbigerRahmen |&lt;br /&gt;
Die Länge des Feldes wird nicht automatisch übergeben. Dafür ist ggf. ein zusätzlicher Parameter notwendig.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Inlining==&lt;br /&gt;
&lt;br /&gt;
In C gibt es die Möglichkeit, eine Funktion als ''inline''-Funktion zu definieren.&lt;br /&gt;
Für eine inline-Funktion wird üblicher Weise kein Code erzeugt, der beim Aufruf der Funktion angesprungen wird, sondern an der Stelle des Aufrufs wird eine Kopie der inline-Funktion eingefügt.&lt;br /&gt;
&lt;br /&gt;
Vom Effekt her ist eine inline-Funktion also ähnlich wie ein Makro. Allerdings wird das Einfügen des Codes nicht vom Präprozessor übernommen, sondern vom eigentlichen C-Compiler. Damit der Compiler in der Lage ist, eine Funktion zu inlinen, muss ihm der Code zur Verfügung stehen, da er ansonsten natürlich keinen Code einfügen kann.&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort ist ''inline'':&lt;br /&gt;
 {{ccomment|Deklariere ''increment'' als inline-Funktion}}&lt;br /&gt;
 static inline int increment (int);&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|Implementierung von ''increment''}}&lt;br /&gt;
 int increment (int i)&lt;br /&gt;
 {&lt;br /&gt;
    return i+1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 {{ccomment|Aufruf von ''increment'' wie eine normale Funktion}}&lt;br /&gt;
 int foo (int n)&lt;br /&gt;
 {&lt;br /&gt;
    if (n &amp;lt; MAX_INT)&lt;br /&gt;
       n = increment (n);&lt;br /&gt;
 &lt;br /&gt;
    return n;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Inline-Funktionen werden verwendet, wenn der Funktionscode recht klein ist und ein Funktionsaufruf schon so aufwändig ist wie das, was die Funktion zu erledigen hat. Im Beispiel wird der gleiche Code erzeugt, wie wenn &amp;lt;tt&amp;gt;n = n + 1&amp;lt;/tt&amp;gt; im Aufrufer stünde, was deutlich schneller ist als ein Funktionsaufruf mit Register-Sicherung, Parameterübergabe, Wertrückgabe, etc.&lt;br /&gt;
&lt;br /&gt;
==Variable Argumentanzahl==&lt;br /&gt;
&lt;br /&gt;
In C ist es möglich, einer Funktion eine variable Anzahl an Argumenten zu übergeben. Solche Funktionen haben eine Anzahl benamter Argumente wie &amp;quot;normale&amp;quot; Funktionen auch, jedoch folgt nach dem letzten benamten Argument eine beliebige Anzahl weiterer Argumente.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel für eine solche Funktion ist das Bekannte &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;, für das zB folgende Aufrufe möglich sind:&lt;br /&gt;
 printf (&amp;quot;Hallo&amp;quot;);&lt;br /&gt;
 printf (&amp;quot;%c&amp;quot;, c);&lt;br /&gt;
 printf (&amp;quot;%s %d&amp;quot;, einString, 15);&lt;br /&gt;
 printf (&amp;quot;%d %d %d&amp;quot;, zahl1, zahl2, zahl3);&lt;br /&gt;
&lt;br /&gt;
Einer solchen Funktion muss die Anzahl der Argumente mitgeleilt werden, die ihr übergeben werden. Sies könnte dadurch geschehen, daß man ihr die Argumentanzahl explizit übergibt. Bei &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt; wird die Anzahl der Übergabeparameter im Formatstring transportiert, ebenso wie die Typen der Übergebenen Variablen, denn die Funktion muss wissen, wie die übergebenen Werte zu interpretieren sind. Bei &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt; geschieht dies wiederum mittls des Format-Strings.&lt;br /&gt;
&lt;br /&gt;
Der Prototyp einer varargs-Funktion sieht aus wie folgt, wobei die drei Pünktchen wörtlich zu nehmen sind und nicht etwa als abkürzende Schreibweise für die Parameterliste! &lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdarg.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 extern void fprintf (FILE * file, const char * format, ...);&lt;br /&gt;
 extern void printf  (const char * format, ...);&lt;br /&gt;
 extern void fprintf_va (FILE * file, const char * format, va_list args);&lt;br /&gt;
&lt;br /&gt;
Die Funktion &amp;lt;tt&amp;gt;fprintf&amp;lt;/tt&amp;gt; soll eine Ausgabe zum File (Stream) &amp;lt;tt&amp;gt;file&amp;lt;/tt&amp;gt; erledigen und ansonsten genauso funktionieren wie das altbekannte &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;. Es ist also anzustreben, in &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt; nur die File-Version aufzurufen um eine Doppel-Implementierung der Funktionalität zu vermeiden. Hierzu dient die Funktion &amp;lt;tt&amp;gt;fprintf_va&amp;lt;/tt&amp;gt;, die von &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt; bzw. &amp;lt;tt&amp;gt;fprintf&amp;lt;/tt&amp;gt; einen File-Pointer, den Format-String sowie die Argumente erhält:&lt;br /&gt;
&lt;br /&gt;
 void fprintf (FILE * file, const char * format, ...)&lt;br /&gt;
 {&lt;br /&gt;
 	{{ccomment|Die Argumentliste 'args'}}&lt;br /&gt;
 	va_list args;&lt;br /&gt;
 	{{ccomment|Die variablen Argument beginnen nach 'format' }}&lt;br /&gt;
 	va_start (args, format);&lt;br /&gt;
 	{{ccomment|Die eigentliche Arbeit erledigt 'fprintf_va' }}&lt;br /&gt;
 	fprintf_va (file, format, args);&lt;br /&gt;
 	{{ccomment|fertig }}&lt;br /&gt;
 	va_end (args);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Fast genauso sieht unser &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt; aus:&lt;br /&gt;
&lt;br /&gt;
 void printf (const char * format, ...)&lt;br /&gt;
 {&lt;br /&gt;
 	{{ccomment|Die Argumentliste 'args'}}&lt;br /&gt;
 	va_list args;&lt;br /&gt;
 	{{ccomment|Die variablen Argument beginnen nach 'format' }}&lt;br /&gt;
 	va_start (args, format);&lt;br /&gt;
 	{{ccomment|Die eigentliche Arbeit erledigt 'fprintf_va' }}&lt;br /&gt;
 	fprintf_va (stdout, format, args);&lt;br /&gt;
 	{{ccomment|fertig }}&lt;br /&gt;
 	va_end (args);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Was zu tun bleibt, ist die Implementioerung der eigentlichen Funktionalität in &amp;lt;tt&amp;gt;fprintf_va&amp;lt;/tt&amp;gt;. Diese durchfostet den Format-String und bei jedem %-Ausdruck wird ein weiteres Argument eingelesen und an eine passende Ausgabefunktion delegiert. Hier wird der Einfachheit halber nur &amp;lt;tt&amp;gt;%c&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;%s&amp;lt;/tt&amp;gt; implementiert:&lt;br /&gt;
&lt;br /&gt;
 static void fprintf_va (FILE * file, const char * fmt, va_list args)&lt;br /&gt;
 {&lt;br /&gt;
     char c;&lt;br /&gt;
 &lt;br /&gt;
     {{ccomment|Nächstes Zeichen des Formatstrings lesen und String-Ende abtesten }}&lt;br /&gt;
     while (c = *fmt++, c != '\0')&lt;br /&gt;
     {&lt;br /&gt;
         {{ccomment|Das Format-Zeichen }}&lt;br /&gt;
         if ('%' == c)&lt;br /&gt;
         {&lt;br /&gt;
             {{ccomment|Weiterlesen: das Zeichen nach dem % }}&lt;br /&gt;
             c = fmt++;&lt;br /&gt;
 &lt;br /&gt;
             {{ccomment|%% --&amp;gt; ein % ausgeben }}&lt;br /&gt;
             if ('%' == c)    fputc ('%', file);&lt;br /&gt;
             {{ccomment|%c --&amp;gt; Character ausgeben }}&lt;br /&gt;
             else if ('c' == c)    fputc (va_arg (args, int), file);&lt;br /&gt;
             {{ccomment|%s --&amp;gt; String ausgeben }}&lt;br /&gt;
             else if ('s' == c)    fputs (va_arg (args, char*), file);&lt;br /&gt;
             {{ccomment|Unbekannts %-Format }}&lt;br /&gt;
             else fputs (&amp;quot;???&amp;quot;, file);&lt;br /&gt;
 &lt;br /&gt;
             {{ccomment|Falls ein % am String-Ende steht }}&lt;br /&gt;
             if ('\0' == c)  return;&lt;br /&gt;
 &lt;br /&gt;
             continue;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         {{ccomment|Für Win32: Zeilenumbruch ist carriage return + line feed }}&lt;br /&gt;
         if ('\n' == c)&lt;br /&gt;
             putc ('\r');&lt;br /&gt;
 &lt;br /&gt;
         {{ccomment|Zeichen ausgenen }}&lt;br /&gt;
         putc (c);&lt;br /&gt;
     } {{ccomment|while }}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Funktionen indirekt aufrufen ==&lt;br /&gt;
Siehe [[#Zeiger auf Funktionen|Zeiger auf Funktionen]]&lt;br /&gt;
&lt;br /&gt;
=Zeiger II=&lt;br /&gt;
&lt;br /&gt;
Zeiger haben wir bereits weiter oben kennen gelernt. Zeiger sind ein zentrales Konzept in C und sollen hier etwas eingehender behandelt werden.&lt;br /&gt;
&lt;br /&gt;
==Zeiger-Arithmetik==&lt;br /&gt;
In C kann man den Wert eines Zeigers verändern. Betrachten wir dazu die Funktion &amp;lt;tt&amp;gt;suche_0&amp;lt;/tt&amp;gt;, die einen Zeiger auf einen &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt; erhält. Die Funktion soll ab der gegebenen Adresse nach dem ersten long-Wert suchen, der 0 ist, und dessen Adresse zurückgeben:&lt;br /&gt;
 long * suche_0 (long * addr)&lt;br /&gt;
 {&lt;br /&gt;
    while (*addr != 0)&lt;br /&gt;
       addr = addr + 1;&lt;br /&gt;
 &lt;br /&gt;
    return addr;&lt;br /&gt;
 }&lt;br /&gt;
In der Bedingung der while-Schleife wird der Inhalt an der Speicherstelle &amp;lt;tt&amp;gt;addr&amp;lt;/tt&amp;gt; auf 0 getestet. Ist der Wert 0, dann wird die Schleife beendet und die Adresse zurückgeliefert. Ist der Wert ungleich 0, dann wird &amp;lt;tt&amp;gt;addr&amp;lt;/tt&amp;gt; auf den nächste long gesetzt, &amp;lt;tt&amp;gt;addr&amp;lt;/tt&amp;gt; also um 4 Bytes weitergezählt. &amp;lt;tt&amp;gt;addr&amp;lt;/tt&amp;gt; ist ja ein Zeiger auf &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;, und ein &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt; ist 4 Bytes lang.&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung von&lt;br /&gt;
 address + n&lt;br /&gt;
ist also, die Adresse um das &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt;-fache der Größe des Typs, auf den &amp;lt;tt&amp;gt;address&amp;lt;/tt&amp;gt; zeigt, zu erhöhen. Dabei ist &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; eine ganze Zahl und darf auch negativ sein.&lt;br /&gt;
&lt;br /&gt;
Hier noch ein Beispiel einer Funktion, die nach einer Person mit einer bestimmten ID sucht (für die Definition von &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt; siehe [[#Strukturen|Strukturen]]). Der Parameter &amp;lt;tt&amp;gt;person&amp;lt;/tt&amp;gt; ist dabei ein Array von Strukturen. Eine Person mit der gesuchten ID muss existieren, ansonsten hat die Suchfunktion kein definiertes Verhalten.&lt;br /&gt;
 {{comment|Sucht nach einer Person mit der ID person_id}}&lt;br /&gt;
 struct Person * &lt;br /&gt;
 suche_person_id (struct Person * person, int person_id)&lt;br /&gt;
 {&lt;br /&gt;
    while (person-&amp;gt;id != person_id)&lt;br /&gt;
       person++;&lt;br /&gt;
 &lt;br /&gt;
    return person;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:1em; padding:1em; border:solid 2px #FF0040;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Vorlage:FarbigerRahmen funzt hier net --&amp;gt;&lt;br /&gt;
Beachte, daß es nicht sinnvoll ist, zwei Zeiger zu addieren oder zu multiplizieren. Ausserdem ist das &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt; der Zeiger-Arithmetik nicht kommutativ. Eine Zeiger auf &amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;, der an Adresse 1 im Speicher zeigt, wird man schreiben als&lt;br /&gt;
 (long *) 1&lt;br /&gt;
Addiert man darauf eine ganze Zahl, dann haben die entstehenden Ausdrücke unterschiedliche Werte:&lt;br /&gt;
 (long *) 1 + 2    {{comment|zeigt zu Adresse 9}}&lt;br /&gt;
 (long *) 2 + 1    {{comment|zeigt zu Adresse 6}}&lt;br /&gt;
 (long *) (1 + 2)  {{comment|zeigt zu Adresse 3}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==void-Pointer==&lt;br /&gt;
Eine besondere Art von Zeiger ist der void-Pointer&lt;br /&gt;
 void * addr;&lt;br /&gt;
Ein void-Pointer ist ein &amp;quot;Zeiger auf irgendwas&amp;quot;, dementsprechend kann er nicht dereferenziert werden, Anwenden von &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; auf einen solchen Zeiger gibt also einen Fehler. Ausserdem ist es nicht möglich, mit einem void-Pointer Zeigerarithmetik zu machen, weil er nicht auf eine definierte Art von Objekt zeigt. Der Vorteil eines void-Pointers ist, daß er jede Art von Zeiger aufnehmen kann.&lt;br /&gt;
&lt;br /&gt;
Dazu betrachten wir die Funktion &amp;lt;tt&amp;gt;send_buf&amp;lt;/tt&amp;gt;, die eine Adresse erhält und ab dieser Adresse &amp;lt;tt&amp;gt;num&amp;lt;/tt&amp;gt; Bytes versenden soll. Wir könnten die Funktion so schreiben:&lt;br /&gt;
 void send_buf (unsigned char * buf, unsigned int num)&lt;br /&gt;
 {&lt;br /&gt;
   ...&lt;br /&gt;
Das ist jedoch hässlich, wenn wir damit etwas anderes verschicken wollen als &amp;lt;tt&amp;gt; unsigned char&amp;lt;/tt&amp;gt;, etwa eine Struktur wie &amp;lt;tt&amp;gt;hubert&amp;lt;/tt&amp;gt; (vom Typ &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt;):&lt;br /&gt;
 send_buf ((unsigned char*) &amp;amp; hubert, sizeof (struct Person));&lt;br /&gt;
Ohne den Cast der Adresse von &amp;lt;tt&amp;gt;hubert&amp;lt;/tt&amp;gt; zu einem Zeiger auf &amp;lt;tt&amp;gt;unsigned char&amp;lt;/tt&amp;gt; bekommt man eine Warnung oder gar einen Compilerfehler.&lt;br /&gt;
Dieses Zeiger gecaste ist mühsam und hässlich, es muss bei jedem Aufruf der Funktion explizit hingeschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Besser ist es, den ersten Parameter der Funktion als void-Pointer zu definieren und den Cast in der Funktion zu machen:&lt;br /&gt;
 void send_buf (void * vbuf, unsigned int num)&lt;br /&gt;
 {&lt;br /&gt;
   unsigned char *buf = (unsigned char*) vbuf;&lt;br /&gt;
   ...&lt;br /&gt;
Durch den Cast in der Funktion kann auf den Inhalt des Zeigers zugegriffen werden. Man muss nur festlegen, ''wie'' man zugreifen will, nämlich als &amp;lt;tt&amp;gt;unsigned char&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Der Aufruf kann jetzt ohne Pointer-Cast erfolgen: &lt;br /&gt;
 send_buf (&amp;amp; hubert, sizeof (struct Person));&lt;br /&gt;
&lt;br /&gt;
==Null-Pointer==&lt;br /&gt;
==Zeiger als Parameter==&lt;br /&gt;
Wenn Sie ein Unterprogramm aufrufen, können Sie diesem Parameter übergeben, aber keine Werte zurückgekommen (außer den Funktionswert bei Funktionen). Dies hat einen guten Grund: beim Aufruf werden nicht die aufgerufenen Parameter benutzt, sondern es werden deren Werte in neue Variablen kopiert. Diese Variablen werden am Ende des Unterprogrammes &amp;quot;zerstört&amp;quot;, ohne ihre Werte an die aufrufenden Parameter zu übergeben. Jede Veränderung eines Parameters hat daher keine Auswirkung auf den Parameter.&lt;br /&gt;
&lt;br /&gt;
Doch was ist, wenn Sie Parameter in Unterprogrammen verändern möchten? Ganz einfach, Sie verwenden Zeiger. Der C-Compiler legt dann immer noch Kopien an. In dieser Kopie steht aber kein Wert, sondern die Adresse einer Varaiblen. Und auf diese können Sie dann zugreifen. Denken Sie nur an &amp;lt;tt&amp;gt;scanf&amp;lt;/tt&amp;gt; &amp;amp;ndash; da übergeben Sie ja auch die Adresse einer Variablen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void erhoehe (int *zeiger)&lt;br /&gt;
{&lt;br /&gt;
  *zeiger = 1 + *zeiger;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main ()&lt;br /&gt;
{&lt;br /&gt;
  int zahl;&lt;br /&gt;
  &lt;br /&gt;
  printf (&amp;quot;Zahl eingeben: &amp;quot;);&lt;br /&gt;
  scanf  (&amp;quot;%d&amp;quot;, &amp;amp;zahl);&lt;br /&gt;
  erhoehe (&amp;amp;zahl);&lt;br /&gt;
  printf (&amp;quot;\nDie erhoehte Zahl lautet: %d\n&amp;quot;, zahl);&lt;br /&gt;
  &lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeiger auf Funktionen==&lt;br /&gt;
&lt;br /&gt;
Stell dir vor, du willst einen Sortieralgorithmus wie Bubble-Sort oder Quick-Sort oder wie sie alle heissen implementieren. Für den Sortieralgorithmus ist eigentlich egal, ''was'' er zu sortieren hat. Ihm ist es egal, ob er Zahlen aufwärts sortieren soll oder Strings in lexikographischer Reihenfolge, ob Objekte nach Größe oder Gewicht, Personen nach Alter oder Adressen nach Postleitzahl. Das einzige, was der Algorithmus wissen muss, ist ''wie'' er zwei Objekte zu vergleichen hat und wann eines davon &amp;quot;kleiner&amp;quot; (im Sinne der Ordnung, nach der sortiert werden soll) ist. &lt;br /&gt;
&lt;br /&gt;
Eine einfache Sortierfunktion, die nur zwei Zahlen sortiert, könnte man also so schreiben: &lt;br /&gt;
 {{comment|Sortiert ein Array von 2 int-Zeigern nach den Inhalten &lt;br /&gt;
  * an den Zeiger-Adressen}}&lt;br /&gt;
 void sort2_a (int * p[])&lt;br /&gt;
 {&lt;br /&gt;
    {{comment|Inhalte vergleichen...}}&lt;br /&gt;
    if (*p[0] &amp;gt; *p[1])&lt;br /&gt;
    {&lt;br /&gt;
       {{comment|... und ggf. Dreieckstausch der 2 Zeiger}}&lt;br /&gt;
       int * p0 = p[0];&lt;br /&gt;
       p[0] = p[1];&lt;br /&gt;
       p[1] = p0;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
Die Funktion bekommt ein Array der Länge&amp;amp;nbsp;2. In diesem Array stehen Zeiger auf die zu sortierenden Zahlen. Ein Array mit Zeigern zu verwenden und nicht ein Array von &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; scheint recht umständlich, und das ist es hier auch. Aber stell dir vor, du willst Strukturen wie &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt; sortieren. Das Tauschen zweier Strukturen würde bedeuten, ihre kompletten Inhalte umzukopieren! Das wäre sehr aufwändig. Viel einfacher ist das Kopieren, wenn nur die Adressen zu kopieren sind.&lt;br /&gt;
&lt;br /&gt;
Der Aufruf von &amp;lt;tt&amp;gt;sort2_a&amp;lt;/tt&amp;gt; könnte dann so aussehen:&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 void sortiere (int a, int b)&lt;br /&gt;
 {&lt;br /&gt;
    {{comment|p[] enthält 2 int-Zeiger: die Adressen von a und b}}&lt;br /&gt;
    int * p[2];&lt;br /&gt;
    p[0] = &amp;amp;a; &lt;br /&gt;
    p[1] = &amp;amp;b; &lt;br /&gt;
 &lt;br /&gt;
    {{comment|Sortiere die Zeiger}} &lt;br /&gt;
    sort2_a (p);&lt;br /&gt;
 &lt;br /&gt;
    printf (&amp;quot;Sortiert: %d, %d\n&amp;quot;, *p[0], *p[1]);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für den nächsten Schritt überlegen wir uns, daß das Array in &amp;lt;tt&amp;gt;sort2_a&amp;lt;/tt&amp;gt; ebensogut void-Pointer enthalten kann. Die einzige Stelle, an der wir auf die endgültigen int-Objekte zugreifen, ist der Vergleich. Diesen Vergleich lagern wir in die Funktion &amp;lt;tt&amp;gt;compare_int&amp;lt;/tt&amp;gt; aus:&lt;br /&gt;
 {{comment|Bekommt zwei void-Pointer und vergleicht die Inhalte.&lt;br /&gt;
  * Liefert 0 bei Gleichheit,&lt;br /&gt;
  * -1 wenn der erste Wert kleiner ist als der zweite und&lt;br /&gt;
  * 1  wenn der erste Wert größer ist als der zweite}}&lt;br /&gt;
 int compare_int (void * p0, void * p1)&lt;br /&gt;
 {&lt;br /&gt;
    {{comment|Um über die Zeiger zugreifen zu können müssen wir diese&lt;br /&gt;
     * erst zu int-Zeigern casten}}&lt;br /&gt;
    int a0 = * (int*) p0;&lt;br /&gt;
    int a1 = * (int*) p1;&lt;br /&gt;
 &lt;br /&gt;
    if (a0 &amp;gt; a1)  return  1;&lt;br /&gt;
    if (a0 &amp;lt; a1)  return -1;&lt;br /&gt;
 &lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void sort2_b (void * p[])&lt;br /&gt;
 {&lt;br /&gt;
    if (compare_int (p[0], p[1]) &amp;gt; 0)&lt;br /&gt;
    {&lt;br /&gt;
       void * p0 = p[0];&lt;br /&gt;
       p[0] = p[1];&lt;br /&gt;
       p[1] = p0;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
Ein Aufruf von &amp;lt;tt&amp;gt;sort2_b&amp;lt;/tt&amp;gt; sieht dann genauso aus wie ein Aufruf von &amp;lt;tt&amp;gt;sort2_a&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Im nächsten Schritt definieren wir uns den neuen Datentyp &amp;lt;tt&amp;gt;comparator_t&amp;lt;/tt&amp;gt;. Dieser ist ein Zeiger auf eine Funktion, die zwei void-Pointer erhält und einen &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; zurückliefert, also analog arbeitet zu &amp;lt;tt&amp;gt;compare_int&amp;lt;/tt&amp;gt; von oben. &lt;br /&gt;
&lt;br /&gt;
Unsere Sortierfunktion bekommt nun neben dem zu sortierenden Zeiger-Array auch eine Vergleichsfunktion &amp;lt;tt&amp;gt;compare&amp;lt;/tt&amp;gt; mitgeliefert, die sie aufruft, wenn sie zwei Objekte vergleichen will&lt;br /&gt;
 {{comment|comparator_t sind Zeiger auf Funktionen, die 2 void-Pointer&lt;br /&gt;
  * erhalten und einen int zurückliefern}}&lt;br /&gt;
 typedef int (*comparator_t) (void*, void*);&lt;br /&gt;
 &lt;br /&gt;
 {{comment|Der Sortierer bekommt einen Funktionszeiger auf den Vergleicher.&lt;br /&gt;
  * Der Aufruf vom compare geht so als wäre es eine &amp;quot;normale&amp;quot; Funktion&lt;br /&gt;
  * (ist es im Endeffekt ja auch)}}&lt;br /&gt;
 void sort2_c (comparator_t compare, void * p[])&lt;br /&gt;
 {&lt;br /&gt;
    if (compare (p[0], p[1]) &amp;gt; 0)&lt;br /&gt;
    {&lt;br /&gt;
       void * p0 = p[0];&lt;br /&gt;
       p[0] = p[1];&lt;br /&gt;
       p[1] = p0;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
Bei einem Aufruf von &amp;lt;tt&amp;gt;sort2_c&amp;lt;/tt&amp;gt; muss man dann einen Komparator mit angeben. In einem Beispiel analog zu &amp;lt;tt&amp;gt;sort2_a&amp;lt;/tt&amp;gt; von oben ist das:&lt;br /&gt;
 sort2_c (compare_int, p);&lt;br /&gt;
Um zwei Strings lexikographisch zu sortieren nehmen wie die Standard-Funktion &amp;lt;tt&amp;gt;strcmp&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 void foo()&lt;br /&gt;
 {&lt;br /&gt;
    char * worte[] = { &amp;quot;Wort1&amp;quot;, &amp;quot;Wort2&amp;quot; };&lt;br /&gt;
 &lt;br /&gt;
    sort2_c ((comparator_t) strcmp, (void**) worte);&lt;br /&gt;
 }&lt;br /&gt;
Die Casts sind hier erforderlich. Alternativ könnte man &amp;lt;tt&amp;gt;sort2_c&amp;lt;/tt&amp;gt; mit reinen void-Pointern versorgen und diese dann dort umcasten.&lt;br /&gt;
&lt;br /&gt;
===Syntax===&lt;br /&gt;
&lt;br /&gt;
Die Syntax zur Definition/Deklaration von Funktionszeigern ist etwas verzwackt. Zur Verdeutlichung ein paar Beispiele. Dabei legt das linke &amp;lt;tt&amp;gt;&amp;lt;Type&amp;gt;&amp;lt;/tt&amp;gt; jeweils den Return-Typ fest.&lt;br /&gt;
 {{comment|definiert einen neuen Funktionszeiger-Typ}}&lt;br /&gt;
 typedef {{type}} (*{{bezeichner}}) ({{type}}, {{type}}, ...);&lt;br /&gt;
 &lt;br /&gt;
 {{comment|deklariert eine Variable als Funktionszeiger}}&lt;br /&gt;
 {{type}} (*{{bezeichner}}) ({{type}}, {{type}}, ...);&lt;br /&gt;
 &lt;br /&gt;
 {{comment|deklariert ein Array von Funktionszeigern (mit Initializer)}}&lt;br /&gt;
 {{type}} (*{{bezeichner}}[]) ({{type}}, {{type}}, ...) = { wert1, wert2, ... };&lt;br /&gt;
 &lt;br /&gt;
 {{comment|Castet Bezeichner zu einem Funktionspointer}}&lt;br /&gt;
 ({{type}}(*)({{type}}, {{type}}, ...)) {{bezeichner}}&lt;br /&gt;
 &lt;br /&gt;
 {{comment|Castet Bezeichner zu einem Funktionspointer und ruft die Funktion auf}}&lt;br /&gt;
 (({{type}}(*)({{type}}, {{type}}, ...)) {{bezeichner}}) (arg1, arg2, ...);&lt;br /&gt;
&lt;br /&gt;
=Standard-Funktionen=&lt;br /&gt;
&lt;br /&gt;
==String-Funktionen==&lt;br /&gt;
&lt;br /&gt;
===strcpy===&lt;br /&gt;
Bei vielen Compilern können sie einem String nicht direkt einen Wert (Text) zuweisen. Dazu müssen Sie dann die Prozedur strcpy() benutzen. Diese erwartet als ersten Parameter den Namen einer String-Variablen (ohne eckige Klammern) und als zweiten Parameter den eines (anderen) Strings. Letzterer kann auch ein in doppelten Hochkommas (&amp;quot;) eingeschlossener Text sein. Die Funktion fügt am Ende automatisch ein 0-Zeichen ein. Um diese Funktion nutzen zu können, müssen Sie die Datei string.h includieren! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  char stri1[21], eingabe[21];&lt;br /&gt;
&lt;br /&gt;
  strcpy (stri1, &amp;quot;hallo&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Der 1. String: %s\n&amp;quot;, stri1);&lt;br /&gt;
  printf (&amp;quot;Bitte geben Sie maximal 20 Zeichen ein: &amp;quot;);&lt;br /&gt;
  scanf  (&amp;quot;%s&amp;quot;, eingabe);&lt;br /&gt;
  strcpy (stri1, eingabe);&lt;br /&gt;
  printf (&amp;quot;\n%s = %s&amp;quot;, stri1, eingabe);&lt;br /&gt;
  &lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Hinweis:''' &lt;br /&gt;
Da ein String, wie jedes Feld, eigentlich ein Zeiger ist, dürfen Sie kein &amp;lt;tt&amp;gt;&amp;amp;amp;&amp;lt;/tt&amp;gt; bei &amp;lt;tt&amp;gt;scanf&amp;lt;/tt&amp;gt; angeben!&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:''' &lt;br /&gt;
Es werden zwei gleich große Strings definiert: &amp;lt;tt&amp;gt;stri1&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;eingabe&amp;lt;/tt&amp;gt;, mit je 20 &amp;quot;nutzbaren&amp;quot; Zeichen. &lt;br /&gt;
In &amp;lt;tt&amp;gt;stri1&amp;lt;/tt&amp;gt; wird die Zeichenkette &amp;lt;tt&amp;gt;&amp;quot;hallo&amp;quot;&amp;lt;/tt&amp;gt; hineinkopiert. Das 0-Zeichen am Ende wird automatisch angefügt. &lt;br /&gt;
Der String wird ausgegeben. Als neues &amp;quot;Sonderzeichen&amp;quot; kommt &amp;lt;tt&amp;gt;%s&amp;lt;/tt&amp;gt; ins Spiel. Es hat die gleiche Aufgabe wie &amp;lt;tt&amp;gt;%d&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;%c&amp;lt;/tt&amp;gt;, nur für Strings. &lt;br /&gt;
Sie werden gebeten, einen String einzugeben. &lt;br /&gt;
Dieser String wird danach in die Variable &amp;lt;tt&amp;gt;stri1&amp;lt;/tt&amp;gt; kopiert. &lt;br /&gt;
Beide Strings, die ja nun die gleiche Zeichenkette enthalten, werden ausgegeben.&lt;br /&gt;
&lt;br /&gt;
===strlen===&lt;br /&gt;
Die Funktion &amp;lt;tt&amp;gt;strlen&amp;lt;/tt&amp;gt;, die als Parameter eine String-Variable erwartet, liefert die Länge dieses Strings zurück. Sie werden jetzt vermutlich sagen: &amp;quot;Das ist doch klar, wie lang der String ist. Ich habe es ja bei der Deklaratin angegeben&amp;quot;. Das stimmt schon, aber denken Sie noch einmal an die null-terminierten Strings. Das 0-Zeichen steht am Ende des Strings (am Ende der gültigen Zeichenfolge), aber nicht unbedingt am Ende des reservierten Speicherplatzes. Haben Sie eine Variable &amp;quot;char Variable[21];&amp;quot;, und ihr den Wert &amp;quot;hallo&amp;quot; zugewiesen, dann steht das null-Zeichen in Variable[5]. Der &amp;quot;gültige&amp;quot; String ist also 5 Zeichen (0-4) lang. Und genau das (5) würde strlen zurück liefern. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
  char stri[21];&lt;br /&gt;
  &lt;br /&gt;
  strcpy (stri, &amp;quot;hallo&amp;quot;);&lt;br /&gt;
  printf (&amp;quot;Der String ist %d Zeichen lang&amp;quot;, strlen (stri));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion wird vor allem gebraucht, wenn Sie direkt auf den String zugreifen, mittels &amp;lt;tt&amp;gt;stri[0]&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;stri[1]&amp;lt;/tt&amp;gt;, etc.&lt;br /&gt;
&lt;br /&gt;
==Ein- und Ausgabe-Funktionen==&lt;br /&gt;
&lt;br /&gt;
===Bildschirm-Ausgabe===&lt;br /&gt;
Bisher war das Tutorial trotz aller Beispiele reine Theorie. Sie konnten zwar Programme schreiben, aber die Funktion nicht testen. Hier lernen Sie nun, wie Sie etwas am Bildschirm ausgeben.&lt;br /&gt;
&lt;br /&gt;
Die dazu notwendige Funktione heisst &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt; (das '&amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt;' ist kein Fehler!). Diese Anweisung gibt die ihr übergebenen Parameter auf das Standard-Ausgabegerät aus, in der Regel also auf den Bildschirm. Sie kann beliebig viele Parameter übernehmen. Es müssen jedoch Standard-Datentypen (z.B. &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt;...) sein! &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (void)&lt;br /&gt;
{&lt;br /&gt;
    int zahl1 = 12;&lt;br /&gt;
    char zeichen1 = 'A';&lt;br /&gt;
    &lt;br /&gt;
    printf (&amp;quot;Das ist Text, und er wird als solcher ausgegeben. \n&amp;quot;);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen 'zahl1' ist: %d \n&amp;quot;, zahl1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen 'zeichen1' ist: %c \n&amp;quot;, zeichen1);&lt;br /&gt;
    printf (&amp;quot;Der Wert der Variablen 'zeichen1' ist: %d \n&amp;quot;, zeichen1);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;-Befehl gibt Text aus. Das Zeichen am Ende (&amp;lt;tt&amp;gt;\n&amp;lt;/tt&amp;gt;) bedeutet &amp;quot;New Line&amp;quot;, es bewegt den Cursor an den Anfang der nächsten Zeile. &lt;br /&gt;
&lt;br /&gt;
Der zweite &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;-Befehl gibt auch Text aus, am Ende befindet sich wieder das &amp;lt;tt&amp;gt;\n&amp;lt;/tt&amp;gt;, um einen Zeilenvorschub zu erreichen. Das &amp;lt;tt&amp;gt;%d&amp;lt;/tt&amp;gt; wird vom Compiler durch den ersten Parameter ersetzt, der nach dem Text angegeben wird. In diesem Fall wird &amp;lt;tt&amp;gt;%d&amp;lt;/tt&amp;gt; also durch den Wert der Variablen &amp;lt;tt&amp;gt;zahl1&amp;lt;/tt&amp;gt; ersetzt. Das &amp;lt;tt&amp;gt;d&amp;lt;/tt&amp;gt; im &amp;lt;tt&amp;gt;%d&amp;lt;/tt&amp;gt; bedeutet &amp;quot;Dezimalzahl&amp;quot;, der Computer gibt also eine ganze Zahl aus. &lt;br /&gt;
&lt;br /&gt;
In der dritten Ausgabe wird ein Zeichen ausgegeben. Diesmal bedeutet &amp;lt;tt&amp;gt;%c&amp;lt;/tt&amp;gt; &amp;quot;char&amp;quot; (Zeichen). Es wird also &amp;lt;tt&amp;gt;%c&amp;lt;/tt&amp;gt; durch ein &amp;lt;tt&amp;gt;A&amp;lt;/tt&amp;gt; ersetzt, denn die Variable &amp;lt;tt&amp;gt;zeichen1&amp;lt;/tt&amp;gt; wird als Character interpretiert. &lt;br /&gt;
&lt;br /&gt;
Die letzte Ausgabe interpretiert den Inhalt von &amp;lt;tt&amp;gt;zeichen1&amp;lt;/tt&amp;gt; als Zahl, und gibt dager den ASCII-Wert von &amp;lt;tt&amp;gt;A&amp;lt;/tt&amp;gt;, also 65 aus. Das ist ein typisches Beispiel für das mögliche unterschiedliche Interpretieren einer  Variablen!&lt;br /&gt;
&lt;br /&gt;
===Tastatur-Eingabe===&lt;br /&gt;
&lt;br /&gt;
Um ein &amp;quot;gscheites&amp;quot; Programm schreiben zu können, muß man wissen, wie der Benutzer über die Tastatur Befehle eingeben kann. Die dafür notwendigen Funktionen stelle ich in diesem Kapitel vor.&lt;br /&gt;
Die wichtigste Funktion ist &amp;lt;tt&amp;gt;scanf&amp;lt;/tt&amp;gt;. Er liest Daten von der Tastatur. Die Syntax entspricht derer von &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int  zahl1;&lt;br /&gt;
char zeichen1;&lt;br /&gt;
&lt;br /&gt;
printf (&amp;quot;Bitte geben Sie eine Zahl ein: &amp;quot;);&lt;br /&gt;
scanf  (&amp;quot;%d&amp;quot;, &amp;amp;zahl1);&lt;br /&gt;
printf (&amp;quot;Geben Sie einen Zeichen ein: &amp;quot;);&lt;br /&gt;
scanf  (&amp;quot;%c&amp;quot;, &amp;amp;zeichen1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Programm gibt eine Eingabeaufforderung aus. Dann erwartet es vom Benutzer, daß er eine Zahl eingibt, die mit [ENTER] bestätigt wird. Dieser Wert wird in &amp;lt;tt&amp;gt;zahl1&amp;lt;/tt&amp;gt; abgespeichert. Danach erfolgt wiederum eine Aufforderung zur Eingabe, diesmal eines einzelnen Zeichens. Dieses kann man nun eingeben und ebenfalls mit [ENTER] bestätigen.&lt;br /&gt;
&lt;br /&gt;
Macht man keine dem Datentyp der erwarteten Variable entsprechende Eingabe, dann bricht das Programm mit einer Fehlermeldung ab (wenn man z.B. &amp;quot;1_T2&amp;quot; eingibt, wenn eine Zahl erwartet wird)!&lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;tt&amp;gt;&amp;amp;&amp;lt;/tt&amp;gt; vor den Parametern ist notwendig. Warum, das erfahren Sie im Kapitel &amp;quot;Unterprogramme&amp;quot;. Für die Profis eine Kurz-Erklärung: Das Unterprogramm &amp;lt;tt&amp;gt;scanf&amp;lt;/tt&amp;gt; bekommt zwar einen Wert übergeben, kann aber keinen zurückliefern (&amp;quot;call by value&amp;quot;). Daher wird kein Wert, sondern ein Zeiger auf eine Variable übergeben. Mit dem &amp;amp; Zeichen bekommen Sie die Adresse einer Variablen (&amp;quot;call by reference&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=Parameter von &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;=&lt;br /&gt;
Das Unterprogramm &amp;quot;&amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;&amp;quot; kann, wie jede andere Funktion, Parameter besitzen. Doch keine selbst gewählten, sondern nur bestimmte. Doch warum braucht main Parameter? Denken Sie einmal an alle Betriebssystembefehle:&lt;br /&gt;
&amp;lt;tt&amp;gt;dir *.exe &amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;copy *.* a:&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;ls -la &amp;lt;/tt&amp;gt;. All diese Befehle sind aus zwei Teilen aufgebaut: Befehl und Parameter. Und genau diese Parameter können Sie mit den &amp;lt;tt&amp;gt;main&amp;lt;/tt&amp;gt;-Parametern abfragen. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main (int argc, char *argv[], char* environ[])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei &amp;quot;&amp;lt;tt&amp;gt;argc&amp;lt;/tt&amp;gt;&amp;quot; handelt es sich um eine normale int-Variable (engl. &amp;quot;''argument count''&amp;quot;, &amp;quot;Parameter-Zähler&amp;quot;). In ihr steht die Anzahl der übergebenen Parameter. Die Parameter selbst folgen im zweiten Argument, das als Array von Strings übergeben wird. Das dritte Argument ist ein Array mit den Umgebungsvariablen. Seine Länge wird nicht explizit übergeben; nach dem letzten Element steht ein Null-String, also ein String der Länge&amp;amp;nbsp;0. In dieser Array befindet sich auch der Inhalt der Umgebungsvariablen &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, die den Suchpfad für ausführbare Programme enthält.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[], char * environ[])&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  printf (&amp;quot;Es wurden %d Parameter angegeben&amp;quot;, argc);&lt;br /&gt;
&lt;br /&gt;
  for (i=0; i &amp;lt; argc; i++) &lt;br /&gt;
     printf (&amp;quot;Parameter %d: %s\n&amp;quot;, i, argv[i]);&lt;br /&gt;
&lt;br /&gt;
  for (i = 0; environ[i] != NULL; ++i) &lt;br /&gt;
     printf (&amp;quot;environ[%d] = %s\n&amp;quot;, i, environ[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Erklärung: Bei der ersten Ausgabe wird ausgegeben, wie viele Parameter insgesammt angegeben wurden. Dabei gibt immer mindestens einen Parameter, nämlich &amp;lt;tt&amp;gt;argc[0]&amp;lt;/tt&amp;gt;. Dort steht der Name der aufgerufenen Datei selbst. Außerdem ist das letzte gültige Feldelement &amp;amp;ndash; wie in C üblich &amp;amp;ndash; das Element &amp;lt;tt&amp;gt;argv[argc-1]&amp;lt;/tt&amp;gt;. In der for-Schleife werden alle Parameter, inklusive ihrer Nummer, ausgegeben. Experimentieren Sie mit den Parametern, um das System zu vertehen!&lt;br /&gt;
&lt;br /&gt;
=Kurzreferenz=&lt;br /&gt;
==Syntax-Bausteine==&lt;br /&gt;
&lt;br /&gt;
Die Erklärung des Aufbaus von C-Befehlen erfolgt neben einfachen Beispielen auch durch ihren prinzipellen Aufbau. In diesen Syntax-Beschreibungen finden sich immer wieder die gleichen Bausteine, die hier näher erklärt werden sollen. Falls Dir solch ein Syntax-Baustein begegnet, kannst Du ihn anklicken und kommst dann zu seiner Erläuterung. &lt;br /&gt;
&lt;br /&gt;
In den Beispielen selbst gehören auch die spitzen Klammern zu dem Baustein (was daran zu erkennen ist, daß auch die Klammern eingefärbt sind). Die Klammern dürfen in einem konkreten C-Programm daher nicht eingetippt werden.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;tt&amp;gt;&amp;lt;Bezeichner&amp;gt;&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Bezeichner in C dienen dazu, Variablen zu identifizieren und ihnen sprechende Namen zu geben, um die Quelle lesbarer zu machen. Man braucht Bezeichner auch, um selbstdefinierte Datentypen zu benennen und zum Benennen von Struct- und Union-Komponenten sowie als Namen für Funktionen und Sprungmarken (Labels).&lt;br /&gt;
&lt;br /&gt;
Bezeichner dürfen aus den Kleinbuchstaben &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;...&amp;lt;tt&amp;gt;z&amp;lt;/tt&amp;gt;, den Großbuchstaben &amp;lt;tt&amp;gt;A&amp;lt;/tt&amp;gt;...&amp;lt;tt&amp;gt;Z&amp;lt;/tt&amp;gt;, dem Unterstrich&amp;amp;nbsp;&amp;lt;tt&amp;gt;_&amp;lt;/tt&amp;gt; und den Ziffern &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt;...&amp;lt;tt&amp;gt;9&amp;lt;/tt&amp;gt; aufgebaut werden, wobei an erster Stelle jedoch keine Ziffer stehen darf.&lt;br /&gt;
&lt;br /&gt;
Es wird zwischen Groß- und Kleinschreibung unterschieden.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;tt&amp;gt;&amp;lt;Ausdruck&amp;gt;&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Ein Ausdruck in C ist ein Konstrukt, das einen Wert hat. Ob dieser Wert eine ganze Zahl ist, eine Kommazahl oder ein Zeiger, etc. ist dabei egal. Die einfachsten Ausdrücke sind Konstanten wie&lt;br /&gt;
 2&lt;br /&gt;
oder Variablen wie&lt;br /&gt;
 ein_zahl&lt;br /&gt;
Mehrere Ausdrücke können durch [[#Liste der Operatoren|Operatoren]] zu komplexeren Ausdrücken kombiniert werden, etwa&lt;br /&gt;
 eine_zahl + andere_zahl == 2&lt;br /&gt;
oder &lt;br /&gt;
 eine_zahl = 2&lt;br /&gt;
Letzterer hat den Wert&amp;amp;nbsp;&amp;lt;tt&amp;gt;2&amp;lt;/tt&amp;gt; und den Nebeneffekt, daß er diesen Wert an &amp;lt;tt&amp;gt;eine_zahl&amp;lt;/tt&amp;gt; zuweist.&lt;br /&gt;
&lt;br /&gt;
Auch der Aufruf einer Funktion, die einen Rückgabewert liefert, ist ein Ausdruck:&lt;br /&gt;
 sin (1.2)&lt;br /&gt;
und kann zum Aufbau komplexerer Ausdrüche verwendet werden.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;tt&amp;gt;&amp;lt;Bedingung&amp;gt;&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Eine Bedingung ist ein Ausdruck, bei der nur interessiert, ob dieser zu&amp;amp;nbsp;0 (unwahr) auswertet oder zu ungleich&amp;amp;nbsp;0 (wahr). Solche Ausdrücke findet man in if-Anweisungen, in Schleifenbedingungen und bedingten Zuweisungen&lt;br /&gt;
 (ein_wert &amp;lt; 2) || (ein_wert &amp;gt; 40)&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;tt&amp;gt;&amp;lt;Lvalue&amp;gt;&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Ein Lvalue ist ein Ausdruck, dem etwas zugewiesen werden kann. Der Name ''Lvalue'' kommt aus dem Englischen. Das ''L'' steht abkürzend für left. Ein Lvalue ist damit ein Ausdruck, der auf der linken Seite eine Zuweisung in C stehen darf. Das &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; in den folgenden Beispiel-Ausdrücken muss ein Lvalue sein:&lt;br /&gt;
 x = y-1&lt;br /&gt;
&lt;br /&gt;
 x++&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;tt&amp;gt;&amp;lt;Konstante&amp;gt;&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Eine Konstante ist ein Ausdruck, dessen Wert dem Compiler bekannt ist. Beispiele für Konstanten sind etwa&lt;br /&gt;
 7&lt;br /&gt;
 'B'&lt;br /&gt;
 -13.98e12&lt;br /&gt;
 1+(2*3)&lt;br /&gt;
und die Werte von [[#Enum|Enum]]s. &lt;br /&gt;
&lt;br /&gt;
Das &amp;lt;tt&amp;gt;Pi&amp;lt;/tt&amp;gt; aus dem folgenden Codestück definiert jedoch keine Konstante in diesem Sinne&lt;br /&gt;
 const double Pi = 3.14159256;&lt;br /&gt;
denn in einem anderen Quellmodul könnte durch die Deklaration&lt;br /&gt;
 extern const double Pi;&lt;br /&gt;
das Symbol &amp;lt;tt&amp;gt;Pi&amp;lt;/tt&amp;gt; bekannt sein, ohne daß sein Wert bekannt ist!&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;tt&amp;gt;&amp;lt;Adresse&amp;gt;&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Eine Adresse ist ein Ausdruck, der einen Speicherort (physikalisch oder virtuell) halten kann. Adressen erhält man dadurch, daß man einem Bezeichner den Adress-Operator&amp;amp;nbsp;&amp;lt;tt&amp;gt;&amp;amp;&amp;lt;/tt&amp;gt;voranstellt, Adressen durch Arithmetik berechnet oder Zahlen zu Adressen castet. Folgende Ausdrücke sind Adressen (eine sinnvolle Deklaration der auftretenden Variablen vorausgesetzt)&lt;br /&gt;
 &amp;amp; eine_zahl&lt;br /&gt;
 &amp;amp; ein_array[10]&lt;br /&gt;
 &amp;amp; ein_struct&lt;br /&gt;
 &amp;amp; ein_struct.komponente&lt;br /&gt;
 (int *) 0x1234&lt;br /&gt;
 (int *) eine_zahl&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;tt&amp;gt;&amp;lt;Deklaration&amp;gt;&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;tt&amp;gt;&amp;lt;Anweisung&amp;gt;&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Anweisungen sind gewissermassen die Atome (oder Moleküle?), aus denen ein C-Programm besteht. Jedes C-Programm ist eine Abfolge von Deklarationen und Anweisungen. Einfache Anweisungen erhält man, in dem man einen Ausdruck nimmt und einen Strichpunkt dahinter schreibt:&lt;br /&gt;
 {{Ausdruck|}};&lt;br /&gt;
wie in&lt;br /&gt;
 x = x+1;&lt;br /&gt;
&lt;br /&gt;
Andere Anweisungen sind die unten aufgeführten Schleifen und die if- sowie die switch-Anweisung.&lt;br /&gt;
&lt;br /&gt;
Mehrere Deklarationen und Anweisungen können zu einem Block zusammengefasst werden. Dieser Block stellt dann wieder eine einzelne Anweisung dar und kann genau so gehandhabt werden!&lt;br /&gt;
 {&lt;br /&gt;
    {{Deklaration}}&lt;br /&gt;
    {{Deklaration}}&lt;br /&gt;
    ...&lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
In diesem Sinne ist auch z.B. die Syntax der if-Anweisung zu verstehen&lt;br /&gt;
 if ({{Bedingung}})&lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
besagt, daß der abhängig ausgeführte Code eine einzelne Anweisung sein darf oder eben ein kompletter Block oder die Verschachtelung mehrerer Blöcke etc.&lt;br /&gt;
&lt;br /&gt;
Eine Anweisung kann auch &amp;quot;leer&amp;quot; sein, also nichts tun. Diese Anweisungen sind der leere Block&lt;br /&gt;
 {&lt;br /&gt;
 }&lt;br /&gt;
und der Strichpunkt&lt;br /&gt;
 ;&lt;br /&gt;
die man gelegentlich in Schleifen findet:&lt;br /&gt;
 while (!timeout())&lt;br /&gt;
    {}&lt;br /&gt;
oder hinter Sprungmarken, die sonst direkt vor einer schliessenden Blockklammer stünden:&lt;br /&gt;
 {&lt;br /&gt;
    ...&lt;br /&gt;
    goto ein_label;&lt;br /&gt;
    ...&lt;br /&gt;
    {{Label|ein_label}}:;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Nicht jede Anweisung ist an jeder Stelle eines C-Programms erlaubt, so darf ein &amp;lt;tt&amp;gt;continue&amp;lt;/tt&amp;gt; nut innerhalb einer Schleife stehen. Gleiches gilt für &amp;lt;tt&amp;gt;break&amp;lt;/tt&amp;gt;, das aber auch innerhalb eines &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; vorkommen darf.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;tt&amp;gt;&amp;lt;Type&amp;gt;&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
Dies steht für einen Datentyp. Es kann ein elementarer Typ sein wie &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt;, ein Zeiger darauf wie &amp;lt;tt&amp;gt;char*&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;void*&amp;lt;/tt&amp;gt;, und auch Qualifier enthalten wie das &amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt; im Typ &amp;lt;tt&amp;gt;unsigned long long&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zu den Typen gehören auch zusammengesetzte Datentypen wie Strukturen und Unions, mit &amp;lt;tt&amp;gt;typedef&amp;lt;/tt&amp;gt; selbst definierte Typen und natürlich Zeiger darauf, wie aus dem Abschnitt [[#Datentypen|Datentypen]]:&lt;br /&gt;
* &amp;lt;tt&amp;gt;struct Person&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;struct Person *&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;data32_t&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;enum Farben&amp;lt;/tt&amp;gt;&lt;br /&gt;
und Zeiger auf Funktionen.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;tt&amp;gt;&amp;lt;Parameterliste&amp;gt;&amp;lt;/tt&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Die Parameterliste bei einer Funktionsdefinition gibt an, wieviel Übergabeparameter sie bekommt, wie diese heissen und welchen Typs diese sind. Der prinzipielle Aufbau ist&lt;br /&gt;
 {{Type}} {{Bezeichner}}, {{Type}} {{Bezeichner}}, ...&lt;br /&gt;
Falls die Funktion keine Parameter hat, dann ist die Parameterliste leer.&lt;br /&gt;
&lt;br /&gt;
Hier als Beispiel die zweiparameterige Funktion &amp;lt;tt&amp;gt;produkt&amp;lt;/tt&amp;gt;. Der erste Parameter heisst&amp;amp;nbsp;&amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; und ist ein &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt;. Der zweite namens&amp;amp;nbsp;&amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; ist vom Typ &amp;quot;Zeiger auf double&amp;quot;, der Inhalt &amp;lt;tt&amp;gt;*b&amp;lt;/tt&amp;gt; ist also auch ein double.&lt;br /&gt;
&lt;br /&gt;
'''Definition der Funktion:'''&lt;br /&gt;
 double produkt (double a, double *b)&lt;br /&gt;
 {&lt;br /&gt;
    return a * (*b);&lt;br /&gt;
 }&lt;br /&gt;
In älteren C-Quellen findet man noch eine andere Syntax für die Deklaration der Parameter, die aber heute praktisch nicht mehr verwendet wird:&lt;br /&gt;
'''alte Definition der Funktion:'''&lt;br /&gt;
 double produkt (a, b)&lt;br /&gt;
 double a, *b;&lt;br /&gt;
 {&lt;br /&gt;
    return a * (*b);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Um die Funktion bekannt zu machen, verwendet man eine Deklaration bzw. den Prototypen, der dem Compiler nur mitteilt, welche Parameter die Funktion bekommt und was sie zurückliefert. Für den Aufruf der Funktion muss der Compiler nur diesen Prototyp kennen, ''was'' die Funktion im Endeffekt macht und wie sie implementiert wurde ist egal, sie wird als BlackBox angesehen.&lt;br /&gt;
&lt;br /&gt;
'''Prototyp der Funktion:'''&lt;br /&gt;
 double produkt (double a, double *b);&lt;br /&gt;
Hier dürfen die Bezeichner auch fehlen:&lt;br /&gt;
 double produkt (double, double*);&lt;br /&gt;
&lt;br /&gt;
==if==&lt;br /&gt;
 if ({{Bedingung}})&lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
&lt;br /&gt;
==if-else==&lt;br /&gt;
 if ({{Bedingung}})&lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
 else&lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
&lt;br /&gt;
==for==&lt;br /&gt;
 for ({{Ausdruck|1}}; {{Bedingung}}; {{Ausdruck|2}})&lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
Eine for-Schleife entspricht folgendem Konstrukt. Dabei sind die drei Ausdrücke optional. Fehlt die Bedingung, dann wird diese als &amp;quot;wahr&amp;quot; angenommen. Die beiden anderen Ausdrücke wird man als Ausdrücke mit Nebeneffekt wählen wie z.B. &amp;lt;tt&amp;gt;x=0&amp;lt;/tt&amp;gt; oder &amp;lt;tt&amp;gt;x=x-2&amp;lt;/tt&amp;gt;.&lt;br /&gt;
 {&lt;br /&gt;
    {{Ausdruck|1}};&lt;br /&gt;
 &lt;br /&gt;
    {{Label|_loop}}:&lt;br /&gt;
    if ({{Bedingung}})&lt;br /&gt;
       {{Anweisung}}&lt;br /&gt;
    else&lt;br /&gt;
       goto _break;&lt;br /&gt;
 &lt;br /&gt;
    {{Label|_continue}}:&lt;br /&gt;
    {{Ausdruck|2}};&lt;br /&gt;
    goto _loop;&lt;br /&gt;
 &lt;br /&gt;
    {{Label|_break}}:;&lt;br /&gt;
 }&lt;br /&gt;
Die Labels &amp;lt;tt&amp;gt;_break&amp;lt;/tt&amp;gt; und &amp;lt;tt&amp;gt;_continue&amp;lt;/tt&amp;gt; entsprechen den Sprungzielen einer &amp;lt;tt&amp;gt;break&amp;lt;/tt&amp;gt; bzw. &amp;lt;tt&amp;gt;continue&amp;lt;/tt&amp;gt;-Anweisung innerhalb von &amp;lt;tt&amp;gt;&amp;lt;Anweisung&amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==do-while==&lt;br /&gt;
 do&lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
 while  ({{Bedingung}});&lt;br /&gt;
&lt;br /&gt;
==while==&lt;br /&gt;
 while  ({{Bedingung}})&lt;br /&gt;
    {{Anweisung}}&lt;br /&gt;
&lt;br /&gt;
==switch==&lt;br /&gt;
 switch  ({{Bedingung}})&lt;br /&gt;
 {&lt;br /&gt;
    case {{Konstante}}:&lt;br /&gt;
       {{Anweisung}}&lt;br /&gt;
       {{Anweisung}}&lt;br /&gt;
       ...&lt;br /&gt;
 &lt;br /&gt;
    case {{Konstante}}:&lt;br /&gt;
       {{Anweisung}}&lt;br /&gt;
       {{Anweisung}}&lt;br /&gt;
       ...&lt;br /&gt;
 &lt;br /&gt;
    ...&lt;br /&gt;
  &lt;br /&gt;
    default:&lt;br /&gt;
       {{Anweisung}}&lt;br /&gt;
       {{Anweisung}}&lt;br /&gt;
       ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=Liste der Schlüsselworte=&lt;br /&gt;
[[#Speicherklassen|&amp;lt;tt&amp;gt;auto&amp;lt;/tt&amp;gt;]], &lt;br /&gt;
[[#break-Anweisung|&amp;lt;tt&amp;gt;break&amp;lt;/tt&amp;gt;]], &lt;br /&gt;
[[#Elementare Datentypen|&amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt;]], &lt;br /&gt;
[[#Elementare Datentypen|&amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#switch-Anweisung|&amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#Konstanten|&amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#continue-Anweisung|&amp;lt;tt&amp;gt;continue&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#switch-Anweisung|&amp;lt;tt&amp;gt;default&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#do-while-Schleife|&amp;lt;tt&amp;gt;do&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#if-Anweisung|&amp;lt;tt&amp;gt;else&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#Enum|&amp;lt;tt&amp;gt;enum&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#Speicherklassen|&amp;lt;tt&amp;gt;extern&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#Elementare Datentypen|&amp;lt;tt&amp;gt;float&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#for-Schleife|&amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#goto-Anweisung|&amp;lt;tt&amp;gt;goto&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#Inlining|&amp;lt;tt&amp;gt;inline&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#if-Anweisung|&amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#Elementare Datentypen|&amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#Elementare Datentypen|&amp;lt;tt&amp;gt;long&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#return-Anweisung|&amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#Speicherklassen|&amp;lt;tt&amp;gt;register&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#Elementare Datentypen|&amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#Elementare Datentypen|&amp;lt;tt&amp;gt;signed&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#Liste der Operatoren|sizeof]],&lt;br /&gt;
[[#Speicherklassen|&amp;lt;tt&amp;gt;static&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#Strukturen|&amp;lt;tt&amp;gt;struct&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#switch-Anweisung|&amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#Eigene Datentypen|&amp;lt;tt&amp;gt;typedef&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#Unions|&amp;lt;tt&amp;gt;union&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#Elementare Datentypen|&amp;lt;tt&amp;gt;unsigned&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#Elementare Datentypen|&amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#Speicherklassen|&amp;lt;tt&amp;gt;volatile&amp;lt;/tt&amp;gt;]],&lt;br /&gt;
[[#while-Schleife|&amp;lt;tt&amp;gt;while&amp;lt;/tt&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
=Liste der Operatoren=&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund2}}&lt;br /&gt;
!| Operator || Bedeutung&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Arithmetische Operatoren&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| Dies sind die &amp;quot;normalen&amp;quot; arithmetischen Operationen, wie man sie aus der Schule kennt. Man kann damit und allen anderen Operatoren auch komplexere Ausdrücke aufbauen. Die Prioritäten sind so, wie man sie kennt, also &amp;quot;Punktrechnung vor Strichrechnung&amp;quot;. Will man dies ändern, dann mit den runden Klammern:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;1+2*3&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;/tt&amp;gt;&amp;amp;rarr; 7&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;(1+2)*3&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;/tt&amp;gt;&amp;amp;rarr; 9&amp;lt;br/&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}}&amp;amp;nbsp;+&amp;amp;nbsp;{{Ausdruck|}}&amp;lt;/tt&amp;gt; || Addition&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}} - {{Ausdruck|}}&amp;lt;/tt&amp;gt; || Subtraktion&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}} * {{Ausdruck|}}&amp;lt;/tt&amp;gt; || Multiplikation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}} / {{Ausdruck|}}&amp;lt;/tt&amp;gt; || Division&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}} % {{Ausdruck|}}&amp;lt;/tt&amp;gt; || Rest der Division (modulo)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;- {{Ausdruck|}}&amp;lt;/tt&amp;gt; || Vorzeichenumkehr, Zweier-Komplement&lt;br /&gt;
&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Logische Operatoren und Vergleiche&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|Die logischen und die vergleichenden Operatoren liefern als Ergebnis den Wert&amp;amp;nbsp;&amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; (wahr) oder einen Wert ungleich&amp;amp;nbsp;&amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; (falsch, um genau zu sein den Wert &amp;lt;tt&amp;gt;!0&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Man kann das Ergebnis zwar einer Variablen zuweisen, in aller Regel wird man solche Ausdrücke jedoch in Bedingungen zu &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; oder in Abbruch-Bedingungen von Schleifen finden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}} &amp;amp;&amp;amp; {{Ausdruck|}}&amp;lt;/tt&amp;gt; || logisches AND: beides wahr (ungleich 0)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}} &amp;amp;#124;&amp;amp;#124; {{Ausdruck|}}&amp;lt;/tt&amp;gt; || logisches OR: mind. eines ist wahr (ungleich 0)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;! {{Ausdruck|}}&amp;lt;/tt&amp;gt; || logisches NOT (0 &amp;amp;harr; ungleich 0)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}} == {{Ausdruck|}}&amp;lt;/tt&amp;gt; || ist gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}} != {{Ausdruck|}}&amp;lt;/tt&amp;gt; || ist nicht gleich&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}} &amp;amp;lt; {{Ausdruck|}}&amp;lt;/tt&amp;gt;  || ist kleiner &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}} &amp;amp;lt;= {{Ausdruck|}}&amp;lt;/tt&amp;gt; || ist kleiner oder gleich &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}} &amp;amp;gt; {{Ausdruck|}}&amp;lt;/tt&amp;gt;  || ist größer &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}} &amp;amp;gt;= {{Ausdruck|}}&amp;lt;/tt&amp;gt; || ist größer oder gleich &lt;br /&gt;
&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Bitweise Operatoren&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;~ {{Ausdruck|}}&amp;lt;/tt&amp;gt; || bitweise NOT (Einser-Komplement)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}} &amp;amp; {{Ausdruck|}}&amp;lt;/tt&amp;gt; || bitweise AND&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}} &amp;amp;#124; {{Ausdruck|}}&amp;lt;/tt&amp;gt; || bitweise ODER&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}} ^ {{Ausdruck|}}&amp;lt;/tt&amp;gt; ||bitweise XOR&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Shift-Operatoren&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}} &amp;lt;&amp;lt; {{Ausdruck|}}&amp;lt;/tt&amp;gt; || Bits nach links schieben&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Ausdruck|}} &amp;gt;&amp;gt; {{Ausdruck|}}&amp;lt;/tt&amp;gt; || Bits nach rechts schieben&lt;br /&gt;
&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Typen&lt;br /&gt;
|- &lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|Ein Cast in C kann dazu verwendet werden, den Typ eines Ausdruckes zu ändern oder den Ausdruck mit einer bestimmten Genauigkeit zu berechnen. Wird z.B. eine Berechnung standardmässig in 16 Bit ausgeführt, dann kann man mit einem Cast &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;(long) &amp;amp;middot;&amp;amp;middot;&amp;amp;middot;&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
ausdrücken, daß die Berechnung in 32 Bit erfolgen soll. Des weiteren kann man Zeiger und ganze Zahlen und Gleitkommazahlen ineinander umwandeln.&lt;br /&gt;
&lt;br /&gt;
Casts können ''nicht'' dazu verwendet werden, um z.B. eine Zahl in einen String zu konvertieren, der diese Zahl darstellt! Dafür gibt es spezielle Funktionen wie &amp;lt;tt&amp;gt;itoa&amp;lt;/tt&amp;gt;!&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;({{Type}}) {{Ausdruck|}}&amp;lt;/tt&amp;gt; || Cast, Typwandlung&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &amp;lt;tt&amp;gt;sizeof ({{Type}})&amp;lt;/tt&amp;gt; || Eine Konstante, deren Wert die Größe (in Bytes) des Typs ist. &amp;lt;tt&amp;gt;sizeof&amp;lt;/tt&amp;gt; ist auch auf Objekte anwendbar wie &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;, Arrays bekannter Größe, Strukturen und Unions,  Array-, Struktur- und Union-Komponenten, Pointer, etc. Beispiel:&amp;lt;br/&amp;gt;&lt;br /&gt;
 int i, sum=0, array[] = { 1, -13, 4, 0, sizeof (int*) };&lt;br /&gt;
 &lt;br /&gt;
 for (i=0; i&amp;lt; sizeof (array) / sizeof (array[0]); i++)&lt;br /&gt;
    sum += array[i];&lt;br /&gt;
Alle Elemente des Arrays werden aufaddiert, ohne daß deren Anzahl explizit in der Schleife genannt ist.&lt;br /&gt;
&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Zeiger und Adressen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;* {{Adresse}}&amp;lt;/tt&amp;gt; || der Inhalt an Adresse&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp; {{Lvalue}}&amp;lt;/tt&amp;gt; || Adresse von&lt;br /&gt;
&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Strukturen, Unions, Arrays&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{blau|&amp;lt;Struct&amp;gt;}}.{{Bezeichner}}&amp;lt;/tt&amp;gt; || Komponente einer Struktur/Union&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{blau|&amp;lt;Zeiger-auf-Struct&amp;gt;}} -&amp;gt; {{Bezeichner}}&amp;lt;/tt&amp;gt; || Komponente einer Struktur/Union, deren Adresse man hat&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Adresse}}&amp;amp;#91;{{Ausdruck|}}&amp;amp;#93;&amp;lt;/tt&amp;gt; || Array-Element&lt;br /&gt;
&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Bedingte Auswertung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;({{Bedingung}}) ? {{Ausdruck|}} : {{Ausdruck|}}&amp;lt;/tt&amp;gt; || Auswahl des Wertes abhängig von der Bedingung&lt;br /&gt;
&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Zuweisung und Operatoren mit Nebeneffekt&lt;br /&gt;
|- &lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|Die Unterschiede der post- und pre-Varianten der Increment/Decrement kommen in Konstrukten wie &amp;lt;tt&amp;gt;x = *p++&amp;lt;/tt&amp;gt; zum tragen:&lt;br /&gt;
&amp;lt;tt&amp;gt;x = *p++;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;/tt&amp;gt;&amp;amp;rarr; &amp;lt;tt&amp;gt; x = *p; p = p+1;&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;x = *++p;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;/tt&amp;gt;&amp;amp;rarr; &amp;lt;tt&amp;gt; p = p+1; x = *p;&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;x = (*p)++;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;/tt&amp;gt;&amp;amp;rarr; &amp;lt;tt&amp;gt; x = *p; *p = (*p)+1;&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;x = ++(*p);&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;/tt&amp;gt;&amp;amp;rarr; &amp;lt;tt&amp;gt; *p = (*p)+1; x = *p;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Lvalue}} = {{Ausdruck|}}&amp;lt;/tt&amp;gt; || Zuweisung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;++ {{Lvalue}}&amp;lt;/tt&amp;gt; || Pre-Increment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;-- {{Lvalue}}&amp;lt;/tt&amp;gt; || Pre-Decrement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Lvalue}} ++&amp;lt;/tt&amp;gt; || Post-Increment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Lvalue}} --&amp;lt;/tt&amp;gt; || Post-Decrement&lt;br /&gt;
&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Kurzschreibweisen&lt;br /&gt;
|- &lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;| Für ganz Faule gibt es anstatt&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;a = a @ b&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
für viele Operatoren (hier dargestellt durch ein&amp;amp;nbsp;&amp;lt;tt&amp;gt;@&amp;lt;/tt&amp;gt;) die abkürzende Schreibweise&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;a @= b&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Lvalue}} += {{Ausdruck|}}&amp;lt;/tt&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Lvalue}} -= {{Ausdruck|}}&amp;lt;/tt&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Lvalue}} *= {{Ausdruck|}}&amp;lt;/tt&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Lvalue}} /= {{Ausdruck|}}&amp;lt;/tt&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Lvalue}} %= {{Ausdruck|}}&amp;lt;/tt&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Lvalue}} ^= {{Ausdruck|}}&amp;lt;/tt&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Lvalue}} &amp;amp;= {{Ausdruck|}}&amp;lt;/tt&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Lvalue}} &amp;amp;#124; {{Ausdruck|}}&amp;lt;/tt&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Lvalue}} &amp;lt;&amp;lt;= {{Ausdruck|}}&amp;lt;/tt&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;{{Lvalue}} &amp;gt;&amp;gt;= {{Ausdruck|}}&amp;lt;/tt&amp;gt; || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Autoren=&lt;br /&gt;
* Plasma&lt;br /&gt;
* Bernd&lt;br /&gt;
* [[Benutzer:SprinterSB|SprinterSB]]&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
* Kernighan und Ritchie&lt;br /&gt;
* Christian Wirth, C-Tutorial&lt;br /&gt;
* Prof. Dr. J. Dankert Ausführungen&lt;br /&gt;
* W. Alex, Einführung in C/C++&lt;br /&gt;
* Peter Baeumle-Courth, ANSI-C im Überblick&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
* [[C-Tutorial/Interrupt-Programmierung]]&lt;br /&gt;
* [[avr-gcc]]&lt;br /&gt;
* [[Compiler]]&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
* [[Fallstricke bei der C-Programmierung]]&lt;br /&gt;
* [[Code::Blocks]]&lt;br /&gt;
* [[Installationsanleitung_von_avrlib]]&lt;br /&gt;
&lt;br /&gt;
=Weblinks=&lt;br /&gt;
* [http://www.uni-bayreuth.de/departments/math/~rbaier/lectures/c_ss2002/html/html.html C-Tutorial Uni Bayreuth]&lt;br /&gt;
* [http://wwwuser.gwdg.de/~kboehm/ebook/inhalt.html C-Programmieren unter Linux]&lt;br /&gt;
* [http://www.gdv.uni-hannover.de/documentation.php Skripte zum Selbststudium: C, C++, Java, etc]&lt;br /&gt;
* [http://info.baeumle.com/ansic.html Einführung in ANSI-C]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Quellcode C|!]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Grundlagen]]&lt;/div&gt;</summary>
		<author><name>RobotProgger</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Diskussion:Code::Blocks&amp;diff=15820</id>
		<title>Diskussion:Code::Blocks</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Diskussion:Code::Blocks&amp;diff=15820"/>
				<updated>2009-12-13T12:46:45Z</updated>
		
		<summary type="html">&lt;p&gt;RobotProgger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Löschdiskussion ==&lt;br /&gt;
'''Behalten'''. Da Dev-CPP nicht mehr weiterentwickelt wird, sollte man diesen Artikel unbedingt behalten und erweitern! Ich werde ihn mir vorknöpfen. --[[Benutzer:RobotProgger|RobotProgger]] 13:46, 13. Dez 2009 (CET)--&lt;/div&gt;</summary>
		<author><name>RobotProgger</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Dev-Cpp_IDE&amp;diff=15819</id>
		<title>Dev-Cpp IDE</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Dev-Cpp_IDE&amp;diff=15819"/>
				<updated>2009-12-13T12:45:14Z</updated>
		
		<summary type="html">&lt;p&gt;RobotProgger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;margin:1em; padding:1em; border:solid 2px #FF0040;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Vorlage:FarbigerRahmen funzt hier net --&amp;gt;&lt;br /&gt;
Zitat aus Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Die letzten Arbeiten an Dev-C++ wurden im März 2005 veröffentlicht. An dem Status der letzten zugänglichen Beta-Version hat sich seitdem nichts verändert, man geht deshalb davon aus, dass die Arbeiten an diesem Projekt eingestellt wurden.&amp;quot; (Stand 12/2009) --[[Benutzer:RobotProgger|RobotProgger]] 13:45, 13. Dez 2009 (CET)----&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Irgendwann beginnt jeder der Mikrocontroller wie die AVRs in C/C++ programmiert sich Gedanken zu machen, ob es nicht eine komfortable IDE gibt, die das Programmers Notepad  von [[WinAVR]] ersetzt. Es gibt eine entsprechende IDE die unter der GPL steht und damit kostenlos ist: Dev-Cpp.&amp;lt;br&amp;gt;&lt;br /&gt;
Dieser kleine Artikel soll in kurzen Sätzen erläutern, wie man sich die IDE  so einrichtet, dass man wie gewohnt nur mit mehr Komfort arbeiten kann. Außerdem soll er auch eine kleine Einführung in Dev-Cpp sein.&lt;br /&gt;
&lt;br /&gt;
== Was ist eine IDE? ==&lt;br /&gt;
IDE steht für integrierte Entwicklungsumgebung. Sie fassen viele Programmierwerkzeuge zusammen (wie z.B. einen Compiler, einen komfortablen Texteditor, Versionsverwaltung, et cetera). Dadurch entfallen viele lästige Aufgaben, weil diese die IDE übernimmt.&lt;br /&gt;
&lt;br /&gt;
== Dev-Cpp ==&lt;br /&gt;
Dev-Cpp ist eine C/C++ Entwicklungsumgebung die unter der GPL steht und damit kostenlos im Web zu haben ist (siehe Weblinks).&lt;br /&gt;
&lt;br /&gt;
=== Einrichten ===&lt;br /&gt;
Nach erfolgreicher Installation sollte die IDE ohne Probleme starten. Neben der IDE muss auch noch [[WinAVR]] installiert sein.&amp;lt;br&amp;gt;&lt;br /&gt;
Um nun Dev-Cpp einzurichten geht man so vor.&amp;lt;br&amp;gt;&lt;br /&gt;
* Klicke auf ''Werkzeuge » Compiler Optionen''.&lt;br /&gt;
[[Bild:DevCpp_Werkzeuge.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Als nächstes ein neues Compiler Set anlegen. Gebt ihm einen beliebigen Namen wie z.B. avr-gcc. Ihr könnt ihn später auch noch umbenennen. Wenn man weitere Projekte anlegt, kann man dann einfach dieses Set auswählen.&lt;br /&gt;
[[Bild:DevCpp_Compiler_neu.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Dann im gleichen Fenster auf den Reiter ''Programme'' klicken und dort alles entsprechend dem Bild unten ändern (die Zeilen die geändert werden müssen sind blau hinterlegt). Dann den Dialog über ''OK'' schließen.&lt;br /&gt;
[[Bild:DevCpp_Compiler_avrgcc.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Zum Schluss musst Dev-Cpp noch so eingestellt werden, dass es euer Makefile (am besten mit MFile erzeugen) verwendet. Erstellt dazu erst ein neues Projekt über ''Datei » Neu » Projekt...''.&lt;br /&gt;
[[Bild:DevCpp_NeuesProjekt.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
* Klickt nun auf ''Projekt » Projekt Optionen'' und im Fenster dann auf den Reiter Make. Dort setzt ihr den Haken vor ''Nutze eigenes Makefile (kein Makefile generieren)'' und wählt dann euer Makefile aus indem ihr auf den Button rechts klickt. Hier ist eine kleine Tücke zu beachten. Damit Dev-Cpp das Makefile verwendet, muss dieses in dem gleichen Verzeichnis wie die Projektdatei liegen, sonst nimmt Dev-Cpp das Makefile nicht an!&lt;br /&gt;
[[Bild:DevCpp_Make.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
Das war es dann auch schon.&amp;lt;br&amp;gt;&lt;br /&gt;
Nun eine kleine Einführung in Dev-Cpp.&lt;br /&gt;
&lt;br /&gt;
=== Eine kleine Einführung ===&lt;br /&gt;
Möchte man mit Dev-Cpp arbeiten, so muss am zuerst einmal ein neues Projekt erstellen, indem man auf ''Datei » Neu » Projekt...'' klickt. Dort wählt man Projekttyp Console Application, wählt unten rechts die entsprechende Programmiersprache aus und gibt einen Projektnamen ein.&amp;lt;br&amp;gt;&lt;br /&gt;
Nun speichert man das Projekt und dann kann es auch schon fast losgehen. Als letzes muss das Projekt (wie oben beschrieben) noch kurz auf den avr-gcc und eigenes Makfile eingestellt werden. Siehe dazu die Beschreibung oben.&amp;lt;br&amp;gt;&lt;br /&gt;
Neue Dateien kann man dem Projekt über ''Projekt » Zum Projekt hinzufügen'' hinzufügen, oder über ''Projekt » Neue Datei'' überhaupt eine neue Datei erstellen.&amp;lt;br&amp;gt;&lt;br /&gt;
Links oben unter dem Reiter '''Projekt''' findet man alle Projekte. Unter dem Reiter '''Klassen''' findet man zum jeweiligen Projekt die Klassen und deren Methoden oder nur C-Funktionen.&amp;lt;br&amp;gt;&lt;br /&gt;
Außerdem findet man unter den Reitern am unteren Bildschirmrand wichtige Ausgaben.&lt;br /&gt;
&lt;br /&gt;
==== Codevervollständigung ====&lt;br /&gt;
Dev-Cpp bietet eine Codevervollständigung an. Wenn man immer die gleichen langen Funktionsnamen eingeben muss, ist diese ein großer Vorteil. Man gibt einfach ein paar Anfangsbuchstaben des Funktionsname ein und drückt dann Strg + Enter und schon popt ein Popup auf, in dem man zwischen den möglichen Funktionen wählen kann.&lt;br /&gt;
&lt;br /&gt;
==== Werzeuge ====&lt;br /&gt;
Unter Dev-Cpp ist es möglich ähnlich dem ProgrammersNotepad von [[WinAVR]] eigene Werkzeuge einzubinden (also z.B. Programme, die mit speziellen Parametern aufgerufen werden sollen).&amp;lt;br&amp;gt;&lt;br /&gt;
Unter ''Werkzeuge » Konfiguriere Werkzeuge'' kann man sich seine eigenen Werkzeuge kreieren und diese ändern. Diese kann man dann im Menü ''Werkzeuge'' aufrufen.&lt;br /&gt;
[[Bild:DevCpp_Eigene_Werkzeuge.png|Dev-Cpp]]&lt;br /&gt;
&lt;br /&gt;
==== Konfiguration ====&lt;br /&gt;
Dev-Cpp lässt sich in vielen Bereichen weit konfigurieren.&amp;lt;br&amp;gt;&lt;br /&gt;
Den '''Editor''' konfiguriert man unter ''Werkzeuge » Editor Optionen''. Dort kann man z.B. einstellen, dass Zeilennummern angezeigt werden werden und man kann das Tabverhalten bestimmen (beides auf jeden Fall zu empfehlen).&amp;lt;br&amp;gt;&lt;br /&gt;
Die '''IDE''' an sich konfiguriert man unter ''Werkzeuge » Umgebungs Optionen''. Dort kann man z.B. die Sprache oder das Aussehen der IDE bestimmen.&amp;lt;br&amp;gt;&lt;br /&gt;
Der '''Compiler''' wird unter ''Werkzeuge » Compiler Optionen'' konfiguriert.&lt;br /&gt;
&lt;br /&gt;
==== Wichtige Tastenkürzel ====&lt;br /&gt;
Die wichtigsten Tastenkürzel auf einen Blick. Man kann die Tastenkürzel (auch Shortcuts genannt) unter ''Werzeuge » Konfiguriere Shortcuts'' ändern. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|- {{Hintergrund1}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Ausführen&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Datei&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot;| Suchen/Ersetzen&lt;br /&gt;
|-&lt;br /&gt;
 |Kompilieren&lt;br /&gt;
 |Strg + F9&lt;br /&gt;
 |Neu&lt;br /&gt;
 |Strg + N&lt;br /&gt;
 |Suchen&lt;br /&gt;
 |Strg + F&lt;br /&gt;
 |-&lt;br /&gt;
 |Ausführen&lt;br /&gt;
 |Strg + F10&lt;br /&gt;
 |Speichern&lt;br /&gt;
 |Strg + S&lt;br /&gt;
 |Ersetzen&lt;br /&gt;
 |Strg + R&lt;br /&gt;
 |-&lt;br /&gt;
 |Alles erneuern&lt;br /&gt;
 |Strg + F11&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |Gehe zu Zeile&lt;br /&gt;
 |Strg + G&lt;br /&gt;
 |-&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |&lt;br /&gt;
 |Gehe zu Funktion&lt;br /&gt;
 |Strg + Shift + G&lt;br /&gt;
 |}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere wichtige Tastenkürzel sind:&amp;lt;br&amp;gt;&lt;br /&gt;
* '''Strg + Pos1'''/'''Strg + Ende''': An den Anfang bzw. das Ende der Datei springen.&lt;br /&gt;
* '''Strg + Pfeiltasten oben/unten''': Scrollen, Cursur bleibt in Zeile stehen.&lt;br /&gt;
* '''Shift + Pfeiltasten links/rechts''': Einzelne Zeichen selektieren.&lt;br /&gt;
* '''Shift + Pos1'''/'''Shift + Ende''': Ganze Zeile selektieren.&lt;br /&gt;
&lt;br /&gt;
== Bemerkung ==&lt;br /&gt;
Es soll hier auch Rande erwähnt sein, dass es auch andere C/C++ IDEs gibt – u.a. CDT in Verbindung mit Eclipse. Allerdings ist die Konfiguration dieser IDE viel aufwändiger und ich habe es noch nicht geschafft sie zum laufen zu bringen. Wer Lust hat und weiß wie man CDT richtig einrichtet, kann ja hier einen Artikel verfassen. Außerdem habe ich auch von CodeBlocks gehört. Man sieht es gibt IDEs wie Sand am Meer.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* http://www.bloodshed.net/&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[WinAVR]]&lt;br /&gt;
* [[avr-gcc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
--[[Benutzer:Luma|Luma]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Microcontroller]]&lt;br /&gt;
[[Kategorie:Praxis]]&lt;br /&gt;
[[Kategorie:Software]]&lt;/div&gt;</summary>
		<author><name>RobotProgger</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Buchvorstellungen&amp;diff=14654</id>
		<title>Buchvorstellungen</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Buchvorstellungen&amp;diff=14654"/>
				<updated>2009-03-16T10:07:02Z</updated>
		
		<summary type="html">&lt;p&gt;RobotProgger: /* C Programmieren von Anfang an, Autor Helmut Erlenkötter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;http://www.roboternetz.de/wiki/uploads/Main/buchvorstellungen.jpg&lt;br /&gt;
&lt;br /&gt;
==Robotik-Bücher==&lt;br /&gt;
===Grundlagen der Robotertechnik, Autor Heinz W. Katzenmeier===&lt;br /&gt;
&lt;br /&gt;
Ein wirklich gutes Buch für echte Bastler. Am meisten werden sicherlich Roboter-Einsteiger von dem Buch profitieren, zumal auch Grundlagen wie Materialkunde, Bauformen, Einheiten-Tabellen und ein wenig Elektronik-Grundlagen angesprochen werden. Aber auch erfahrene Bastler werden eine ganze Menge Anregungen und Tipps in dem Buch finden. &lt;br /&gt;
&lt;br /&gt;
Der Themenschwerpunkt des Buches liegt eindeutig im Bereich Mechanik und Konstruktion. Hier findet man praktische Tips, z.B. wie man aus Silikonkitt Silikonringe für den Antrieb bastelt. Wer kommt schon auf die Idee, Silikon auf einer Wasseroberfläche aufzutragen, um Silikonringe herzustellen? &lt;br /&gt;
&lt;br /&gt;
Auch seltsame Roboter-Konstrukte, in Ball- oder Walzenform, werden beschrieben. Natürlich fehlen auch nicht die Krabbelkonstrukte mit mehreren Beinen und die herkömmlichen 3-Rad-Roboter. &lt;br /&gt;
Viele Roboterkonstruktionen kommen ganz ohne Elektronik aus, können jedoch trotzdem Hindernissen ausweichen. Dazu hat der Autor die seltsamsten Konstrukte und Mechaniken entworfen. Die Fotos sind leider alle in Schwarzweiss, ein bisschen mehr Farbe wäre wünschenswert. Aber die große Anzahl an verständlichen Zeichnungen machen während des Lesens die fehlenden Farbfotos wieder wett.&lt;br /&gt;
&lt;br /&gt;
Der Autor geht bei seinen Konstruktionen recht einfache und leicht nachzubauende Wege, was insbesondere Mechanik-Neulinge erfreuen dürfte. So wird z.B. bei einem Getriebe der Motor einfach mit Heißkleber an einer Achse befestigt. Oder ein bisschen Papier zwischen den Zahnrädern sorgt dafür, dass diese nicht zu straff ineinander greifen. ''Also jede Menge praktischer Tips.'' &lt;br /&gt;
&lt;br /&gt;
Einziger Mangel ist das Thema Elektronik. Außer einer Transistor-, Relais- oder Spannungsregler-Schaltung findet man kaum was in dem Buch. Ganz zu schweigen von Microcontrollern, diese wurde im Buch ganz ausgeklammert. &lt;br /&gt;
&lt;br /&gt;
Dennoch finde ich das Buch sehr lesenswert. Denn gerade mit Elektronik versierten Bastlern fehlen manchmal ein wenig Kenntnisse und Ideen zur Mechanik. Das Buch fördert einfach das Verständnis für die mechanischen Grundlagen. Es stellt einfache und funktionierende Systeme vor, welche die eigene Fantasie anregen und durch ein schnell eintretendes Erfolgserlebnis zu weiteren kreativen Versuchen inspirieren. Insbesondere in Verbindung mit einem Mikrocontroller können daraus interessante Sachen entstehen. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://images-eu.amazon.com/images/P/3895761478.03.MZZZZZZZ.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Autor: Heinz W. Katzenmeier &lt;br /&gt;
 231 Seiten &lt;br /&gt;
 Format 17 x 23,5 cm (kartoniert) &lt;br /&gt;
 € 34,80 (D) / € 35,80 (A) / sFr 59,90 &lt;br /&gt;
 ISBN 3-89576-147-8 &lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 18:04, 16. Nov 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reinigungsroboter selbst gebaut, Autor Heinz W. Katzenmeier===&lt;br /&gt;
&lt;br /&gt;
'''Klappentext:''' Robotertechnik ist in den letzten Jahren zunehmend in den Blick der Öffentlichkeit geraten. Nicht zuletzt aufgrund der immer häufiger werdenden Anwendungen im industriellen Bereich, im Spielzeugsektor und auch im Haushalt. Robotertechnik als Hobby ist besonders interessant und stellt eine außergewöhnliche Herausforderung dar, da dieses Hobby Fachgebiete wie Elektronik, Mechanik und Informatik verbindet. Es fördert daher in hohem Maße die Fähigkeit, vernetzt zu denken und komplexe, voneinander abhängige Sachverhalte zu erkennen.&lt;br /&gt;
&lt;br /&gt;
Roboter-Wettbewerbe – wie zum Beispiel die alljährlich ausgetragene Roboter-Fußball-Weltmeisterschaft – sind ein besonderes Highlight, übersteigen allerdings in den meisten Fällen die Möglichkeiten eines Hobbyisten bei weitem. Andererseits ist der Aufbau eines vorgefertigten Bausatzes oder gar der Betrieb eines fertigen Roboters keine echte Herausforderung und wird schnell langweilig, zumal diese Roboter in der Regel auch keine realen Aufgaben erfüllen können. Besonders beeindruckend ist es, wenn ein Roboter sich nicht nur mehr oder weniger geschickt umher bewegt, sondern dabei gleichzeitig noch das Zimmer reinigt.&lt;br /&gt;
&lt;br /&gt;
Dieses Buch stellt verschiedenste Möglichkeiten zum Selbstbau von Reinigungsrobotern vor; angefangen von einfachen mechanisch gesteuerten Wischrobotern bis hin zu komplexen, mikroprozessorgesteuerten Saugrobotern mit diversen Varianten der Hinderniserkennung. Dabei legt der Autor besonderen Wert auf die einfache und preiswerte Herstellung funktioneller Roboter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:buch_reinigungsroboter.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Persönliche Meinung nach dem Lesen: '''Wer so fasziniert von dem Bau des perfekten Reinigungsroboters / [[Staubsaugerroboter]] ist, freut sich natürlich besonders, wenn er diesen Titel liest. Besondere Bewunderung verdient der Autor und Verlag, dass sie es wagen für die doch recht begrenzte Interessentengruppe ein eigenes Buch aufzulegen. Und in der Tat, es ist ein Buch, das sich von der ersten bis zur letzten Seite mit der Konstruktion von Reinigungsrobotern beschäftigt. Also auf Seitenfüller oder Werbung für kommerzielle Staubsaugerprodukte, wie man das manchmal in solchen Werken vorgesetzt bekommt, wurde verzichtet. Dass der Autor was von Robotern versteht und selbst ein Bastler ist, das ist ja schon von seinem Werk &amp;quot;Grundlagen der Robotertechnik&amp;quot; bekannt. Auch in diesem Buch steht eindeutig die Mechanik und Saugtechnik im Vordergrund, die Elektronik wird nahezu komplett ausgespart. Dies ist aber nicht weiter schlimm, denn zur Elektronik gibt es ja hier im Wiki oder im Roboternetz schon reichlich an Infos und geeigneten [[:Kategorie:Projekte|RN-Board-Bauanleitungen]], die verwendet werden könnten. Die große Schwierigkeit ist immer die Mechanik, und hier kann der Autor mit seinen Skizzen und Bildern gute Anregungen geben. Die Beschreibungen sind sehr einfach gehalten und richten sich nicht an Ingeneure, sondern an Bastler mit herkömmlichemn Technik-Verständnis. Dabei verwendet der Autor Bauelemente, die einfach zu beschaffen sind. Manchmal hätte man sich allerdings hier und da eine etwas ausführlichere und etwas professionellere Darstellung gewünscht. Eine große Kritik geht vor allem an den Verlag; viele Bilder sind nicht nur sehr klein, sondern alle Bilder sind auch Schwarzweiss gedruckt, teils auch nicht gerade sehr scharf. Ein Buch, das Anregungen zum Basteln geben soll, lebt auch von Bildern, hier wäre es unbedingt angebracht gewesen größere Farbbilder hinein zu bringen, damit man auch Details erkennen kann. Da es ja nun auch nicht gerade ein billiges Taschenbuch ist, kann man die Schwarzweiss-Bilder in solch einem Werk nicht verstehen. &lt;br /&gt;
Trotz aller Begeisterung über das Buch muss man sagen, dass sich Bastler, die sich schon sehr viel mit dem Thema beschäftigt haben, nicht allzuviel Neues erfahren, insbesondere im Hinblick auf Nachbau. Allerdings ist es auch immer schön, wenn man merkt, dass eigene Erfahrungen auf so manchen Seiten auch von professioneller Seite bestätigt werden. Zudem sind im Buch sehr viele Formeln und Tabellen enthalten, die beim Bau eines Reinigungsroboters nützlich sein können. Wie man bestimmte Sachen, wie Saugleistung messen oder vergleichen kann, ohne ein Messlabor zu haben, wird natürlich auch dargestellt.&lt;br /&gt;
'''Fazit:'''Für jemanden, der sich mit dieser Materie beschäftigt, ein Buch, das man einfach haben muss, auch wenn die Bilder verbesserungswürdig sind. &lt;br /&gt;
--[[Benutzer:Frank|Frank]] 10:19, 27. Jun 2006 (CEST)&lt;br /&gt;
&lt;br /&gt;
 Autor: Heinz W. Katzenmeier &lt;br /&gt;
 Taschenbuch - 223 Seiten&lt;br /&gt;
 Bezug: Amazon&lt;br /&gt;
 Verlag: Elektor &lt;br /&gt;
 Erscheinungsdatum: 19. Juni 2006&lt;br /&gt;
 Auflage: 1&lt;br /&gt;
 € 34,80 (D) / € 35,80 (A) / sFr 59,9&lt;br /&gt;
 ISBN: 3895761664&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Robotergreifer, Autoren S. Hesse, G.J. Monkman, R. Steinmann, H. Schunk===&lt;br /&gt;
&lt;br /&gt;
Mit dem Greifer wird die Verbindung zwischen einem Objekt und der Maschine hergestellt. Greifertechnik gehört daher zum Kernwissen in der Handhabungs- und Robotertechnik. Dieses Buch macht den Leser mit den Grundlagen dieser Technik vertraut. Da viele Bücher zur Robotertechnik nur sehr begrenzte Aussagen zum Greifer machen, wird in diesem Werk erstmals eine umfassende Darstellung mit dem Charakter eines Nachschlagewerkes geboten. Das Buch enthält etwa 500 Strichzeichnungen zur Greifertechnik und -anwendung. Dabei legen die Autoren Wert auf eine möglichst vollständige Abhandlung aller wichtigen Aspekte: Prinzipien, Bauformen, Kinematik, Steuerung, Sensorik, Wechselvorrichtungen, Sicherheit und Anwendungen. &lt;br /&gt;
&lt;br /&gt;
Dieses Buch richtet sich nicht unbedingt an den Modellbauer oder Bastler erster kleiner autonomer Roboter, das merkt man schon ein wenig am Verkaufspreis. Wer sich aber eingehender auch mit Industrierobotern oder den mechanischen Grundkonzepten einer &amp;quot;Roboterhand&amp;quot; auseinandersetzen will oder muss, der findet in diesem Buch wirklich reichlich an Informationen. Vorbildlich ist wirklich die didaktische Aufbereitung des Werkes. Leicht verständliche Skizzen und Diagramme, fast auf jeder Seite, erleichtern den tiefen Einblick in diese doch ungeahnt vielseitige Materie.&lt;br /&gt;
&lt;br /&gt;
Beschrieben werden unter anderem die verschiedenen Greiferklassen, Bauformen, ein geschichtlicher Rückblick in Sachen Greifer, Greifersenorik, Handachsen und Kinematik und praktisch angewandte Greiferanwendungen.&lt;br /&gt;
&lt;br /&gt;
Über den Autor&lt;br /&gt;
Dr.-Ing. habil. Stefan Hesse ist Konstrukteur, hält Vorlesungen am FH Technikum Wien und ist seit vielen Jahren als Herausgeber, Autor bzw. Coautor selbstständig tätig. Prof. Gareth Monkman ist als Hochschullehrer an der FH Regensburg im Studiengang Elektrotechnik/Mechatronik tätig und durch viele Fachaufsätze und Vorträge international bekannt. Ralf Steinmann ist Leiter Vertrieb und Marketing Automation bei der SCHUNK GmbH &amp;amp; Co. KG, Obersulm. Dipl.-Wirtsch.-Ing. Henrik Schunk ist Geschäftsführer der SCHUNK Intec Inc., Raleigh-Morrisville (USA). &lt;br /&gt;
&lt;br /&gt;
 Erschienen im Hanser Verlag Januar 2005&lt;br /&gt;
 ISBN 3-446-22920-5&lt;br /&gt;
 Bezug. z.B. Amazon&lt;br /&gt;
 79 Euro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://images-eu.amazon.com/images/P/3446229205.03._BO01,224,223,220_PIsitb-dp-arrow,TopRight,22,-21_SH30_SCMZZZZZZZ_.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
===Embedded Robotics von Tilo Gockel, Rüdiger Dillmann===&lt;br /&gt;
&lt;br /&gt;
'''Klappentext (Buchrückseite)'''&lt;br /&gt;
Das Thema Robotik ist so aktuell wie niemals zuvor, das zeigen nicht nur modernste Industrieanwendungen, das zeigt auch die zunehmende Anzahl von Lehrveranstaltungen an Schulen und Hochschulen, von Forschungsprogrammen und Interessengemeinschaften. &lt;br /&gt;
&lt;br /&gt;
Leider wird der Zugang zu diesem Forschungsbereich nicht immer leicht gemacht. Wie kann man auch einfach und einprägsam solch komplexe Inhalte wie Drehzahlregelung, Lageregelung, Bahnplanung, Aktuatorik und Sensorik, Kognition im Allgemeinen und Bildverarbeitung im Besonderen vermitteln? Zusammen mit den Grundlagen zur zugehörigen Hardware und Programmierung? Und dies noch auf einem bezahlbaren und reproduzierbaren, transparenten Basissystem? Mit kostenfrei zugänglichen Software-Entwicklungswerkzeugen? &lt;br /&gt;
&lt;br /&gt;
Dass es möglich ist, zeigt vorliegendes Buch. &lt;br /&gt;
&lt;br /&gt;
Die Autorenschaft setzt sich zusammen aus Mitarbeitern des Institutes für Technische Informatik von Herrn Prof. Dr.-Ing. Rüdiger Dillmann (ITEC, Universität Karlsruhe (TH)), die in zahlreichen Forschungs- und Industrieprojekten umfangreiche Erfahrungen im Bereich Robotik sammeln konnten und auch in der Lehre über die Jahre hinweg gelernt haben, dieses Wissen weiterzugeben. &lt;br /&gt;
&lt;br /&gt;
Entstanden ist ein Buch, welches sowohl den interessierten Laien als auch den Fachmann anspricht. Die verwendete Mikrocontroller- und Mechanikplattform ermöglicht einen schnellen, robusten und kostengünstigen Aufbau der Experimente. Die zu Grunde liegende Methodik wird auf eine Art und Weise vermittelt, die eine Portierung auf komplexere Systeme einfach macht. &lt;br /&gt;
&lt;br /&gt;
Aus dem Inhalt: Im vorliegenden Buch behandelt werden u.a. Grundlagen zu Mikrocontrollern (Entwicklungs-Toolchain, serielle Kommunikation usw.), Aktuatoren, Sensoren (LDRs, PSDs, optische Maus, Digitalkamera ...), Drehzahl- und Lageregelung, Bahnplanung, reflexbasiertes Verhalten, Subsumptionsnetzwerke, Bildverarbeitung und Realtime-Multitasking. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
'''Persönliche Meinung nach dem Lesen:''' &lt;br /&gt;
Nach Lesen des Klappentextes hatte ich den Eindruck ein ideales Buch auch  für Robotik-Bastler zu bekommen. Leider wird das Buch diesem Bereich nur  zum Teil gerecht. Sehr gut gelungen sind die komplexeren Aufgabenstellungen, hier  zeigt sich das fundierte Wissen der Autoren (Gockel/Dillmann). &lt;br /&gt;
Besonders gefallen haben mir die Bereiche wie Regelungstechnik,  Drehzahlregelung, Servo-Ansteuerung, Bildverarbeitung,  Schnittstellenbeschreibung und einige mehr. Jedoch dem Untertitel Praxisbuch wird es nur gerecht, wenn man ein spezielles Board von Elektor mit einem 8051-Controller nutzt. Alle Beispiele beziehen sich auf dieses Board bzw. diesen Controller. Leider wird dieser Controllertyp im Hobbybereich nicht mehr so häufig verwendet, wodurch viele Informationen im Buche, wie Controllerbeschreibung, Compilerbeschreibung, Beispiele, Librarys etc. nur für Besitzer dieses Controllertyps von Interesse sein dürften. Auch der Bereich Mechanik wird praktisch kaum in dem Buch angesprochen. Sehr hilfreich sind zum Teil die Links, die in einzelnen Kapiteln zu finden sind, allerdings hat man hier den Eindruck, dass das Linkarchiv zum Teil etwas älter ist.&lt;br /&gt;
'''Fazit:''' Ein ideales Buch für Besitzer eines 8051-Controllers und ein hilfreiches Buch für fortgeschrittenere Bastler, die sich intensiver mit einzelnen Thematiken, wie Drehzahlregelung, Bildverarbeitung und anderen Schwerpunkten, beschäftigen. Weniger hilfreich ist es für Einsteiger, die mit anderen Controllern arbeiten, erste Experimente machen oder in Basic programmieren wollen.&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 18:07, 16. Nov 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Erschienen Elektor-Verlag &lt;br /&gt;
 Erscheinungsdatum: 2005&lt;br /&gt;
 ISBN 3895761559&lt;br /&gt;
 Bezug, z.B. Amazon&lt;br /&gt;
 39,80 Euro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://images-eu.amazon.com/images/P/3895761559.01.MZZZZZZZ.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Roboter Geschichte-Technik-Entwicklung, von Daniel Ichbiah===&lt;br /&gt;
'''Klappentext:''' Diener der Menschen&lt;br /&gt;
&lt;br /&gt;
Die 1980er waren das Jahrzehnt des Computers, die 1990er das des Internets, die erste Dekade des 21. Jahrhunderts wird die der Roboter sein. In den USA, Japan und Europa kommt die Entwicklung von Robotern für alle Lebensbereiche immer mehr in Schwung. Den Weg dazu bahnten Science-Fiction-Schriftsteller, Filmemacher und Erfinder von Video-Spielen. Innerhalb der privaten Haushalte - angefangen von Kinderspielzeugen bis hin zu Staubsaugern, die selbständig ihre Arbeit verrichten - haben sich Roboter sanft, aber nachhaltig durchgesetzt. In der Medizintechnik sind sie nicht mehr wegzudenken, wenn es darum geht, Mikro-Operationen durchzuführen. Und auf dem Mars sind es selbstverständlich Roboter, die Missionen ausführen, die für ihre menschlichen Erfinder unmöglich wären.&lt;br /&gt;
 &lt;br /&gt;
Dieses reich illustrierte Buch spannt den Bogen von der verborgenen Mechanik in altägyptischen Götterstatuen über die Automaten und Androiden in Literatur und Film bis hin zu den Robotern in Industrie und Forschung. Der Fachjournalist und Roboterexperte Daniel Ichbiah erzählt in vielen Beispielen von Geschichte, Technik und Einsatz dieser faszinierenden Kreationen, die vom uralten Wunsch des Menschen zeugen, sich das Leben zu erleichtern.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 Erschienen Knesebeck Verlag&lt;br /&gt;
 Flexicover, 19 x 23 cm, 544 Seiten&lt;br /&gt;
 Mit über 1.400 farbigen Abbildungen&lt;br /&gt;
 Preis 35,00 € &lt;br /&gt;
 ISBN 3896602764&lt;br /&gt;
 Erscheinungstermin April 2005&lt;br /&gt;
 Bezug u.a. Amazon &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://images-eu.amazon.com/images/P/3896602764.03.MZZZZZZZ.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:rnbuchvorstellungroboter.jpeg|thumb|600px|center|Einige EInblicke in das Buch]]&lt;br /&gt;
&lt;br /&gt;
'''Persönliche Meinung zum Buch:''' Kein Buch, das Robotikbastlern Fachwissen vermittelt, sondern vielmehr ein Buch, das sich einfach an interessierte Leser (auch Techniklaien) wendet. Eigentlich eine Art illustriertes Bilderbuch zum Thema Entwicklungen der Robotik. Beim ersten Blick erinnert das dreispaltige Layout mit den vielen Bildern ein wenig an ein gutes Lexikon. Zwar ist es kein Nachschlagewerk, aber auch nicht gerade ein Buch, das man von vorne bis hinten Seite für Seite durchliest, dafür sind die Themenbereiche dann doch zu unterschiedlich. Es werden Entwicklungen bei den Spiel-, Staubsauger-, Haushalts-, Medizin-, Raumfahrt-,  Meeresrobotern usw.  aufgezeigt. Es wird über Roboter in Literatur, Film und Spielen berichtet, halt über alles, was man mit dem Begriff Roboter verbinden kann oder über was schon mal in den Medien berichtet wurde. Dabei beeindrucken vorwiegend die großen seitenfüllenden Bilder, die in bester Qualität abgedruckt wurden. Wer den Bereich der Robotik schon ein wenig verfolgt hat, wird leider sehr viele Bilder und Themenbereiche von zahlreichen Presseveröffentlichungen kennen. Kurze Texte und Interviews zwischen den Bildern vermitteln den derzeitigen Stand und die Zukunftsperspektiven des jeweiligen Bereiches aus Sicht von Wissenschaftlern oder Unternehmen. &lt;br /&gt;
Alles in allem ein Buch, das für technisch begeisterte Leser gedacht ist, die einfach einen Rundumblick für den Bereich ROBOTIK in einem Buch gebündelt im Regal stehen haben wollen. Bastler und Modellbauer, die vielleicht tiefergehende Tips, Technikgrundlagen und anwendbares Wissen für ihr Hobby erwarten, werden hier sicher nicht fündig. Bestenfalls kann das eine oder andere Bild Anregungen liefern mit welchen Themen man sich etwas mehr beschäftigen könnte. Aber das war ja auch nicht das Ziel des Buches.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 23:35, 30. Nov 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Roboter selbst bauen von Ulli Sommer===&lt;br /&gt;
&lt;br /&gt;
'''Klappentext (Buchrückseite)'''&lt;br /&gt;
Roboter zu bauen wurde in den letzten Jahren immer populärer. Das liegt zum einen daran, dass Mikrocontroller und die zusätzliche Peripherie immer günstiger werden, aber auch an Schulen wird mehr in Richtung Mikrocontroller und Robotik unterrichtet.&lt;br /&gt;
&lt;br /&gt;
Dieses speziell für Praktiker geschriebene Buch bietet zahlreiche detaillierte Bauanleitungen inklusive Quellcode und Schaltplänen für den Einsteiger sowie für den fortgeschrittenen Roboter-Entwickler. Die Beispielprogramme sowie Schaltpläne können für eigene Entwicklungen übernommen werden und dienen somit als Bausteine für eigene Ideen. Besonderen Wert wurde bei den Anleitungen auf Nachbausicherheit gelegt, und selbstverständlich wurden alle Projekte vom Autor selbst aufgebaut und ausführlich getestet. Durch die zahlreichen Beispiele ist es immer ein gutes Nachschlagewerk, das nicht so schnell im Bücherregal landen wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Aus dem Inhalt:'''&lt;br /&gt;
- Ausflug in die Roboterwelt&lt;br /&gt;
- Planen eines Roboters&lt;br /&gt;
- Mechanische Bauteile und Materialien&lt;br /&gt;
- AVR Controller und BASCOM Basic&lt;br /&gt;
- PC zu BOT Interface per Funk (Die Roboter Steuerzentrale)&lt;br /&gt;
- Sensoren und Aktoren&lt;br /&gt;
- Fahrregler im Selbstbau&lt;br /&gt;
- Kamerasysteme&lt;br /&gt;
- Diverse Algorithmen&lt;br /&gt;
&lt;br /&gt;
'''Selbstbauprojekte:'''&lt;br /&gt;
GPS Navigationssystem, Tischroboter TR-1, Robo-Control mit ATmega32, Cybot-Pimp, Rasenmähroboter Grasshopper Phip, Induktionsschleifen-System, On Screen Display im Eigenbau, 12-V-Bleigellader, diverse I²C Erweiterungen für das Robo-Controlboard, Der große Experimenttierroboter THX-1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Auf CD-ROM:'''&lt;br /&gt;
* Kompletter Quellcode zum Buch&lt;br /&gt;
* Tools zur einfachen Roboterentwicklung&lt;br /&gt;
* Steuern vom PC aus mit dem PC to Bot Interface&lt;br /&gt;
* Datenblätter zu den verwendeten Bauteilen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
'''Lesermeinungen:''' &lt;br /&gt;
Jeder, der sich intensiv mit Elektronik beschäftigt, kommt irgendwann auf den Roboter. Ein paar einfache Modelle habe ich auch schon gebaut, aber meist war die Mechanik eher kümmerlich. Ganz anders bei Ulli Sommer. Er zeigt mit diesem Buch, wie es richtig gemacht wird! Letzte Woche hatte ich Besuch von einem Freund, der sich aktuell intensiv mit Robotern beschäftigt. Es sah das Buch auf meinem Schreibtisch liegen, griff es sich und las es quer. Seine Reaktion sagt es besser, als ich es könnte: Da steht ja wirklich alles drin, was aktuell machbar ist, alle wichtigen Sensoren, Motoren, Treiber sind beschreiben, kein Thema fehlt, das man beachten sollte, wenn man Roboter baut! Was mich persönlich besonders interessiert hat, sind neue Motortreiber, die über den üblichen ULN2803 hinausgehen. Und da findet sich eine Menge. Sehr gut gefällt mir auch, dass durchgehend AVR-Controller mit BASCOM verwendet werden. Und für die PC-Seite der Steuerung wird VB.NET eingesetzt. Alles in Allem: Über 300 Seiten, prall gefüllt mit wertvollem Fachwissen, ein echtes Standardwerk zur Robotertechnik!&lt;br /&gt;
&lt;br /&gt;
B.K.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
'''Meinungen zum Buch:'''&lt;br /&gt;
&lt;br /&gt;
This is a book in the German language. I received my copy today. When you can read German you are lucky! Why? Because this is a must have book! This book covers it all : Servo's, small motors, big motors, the AVR, small robots, advanced robots, even with GPS , and a real big Robot you can use for your own 'Star Wars movie'. There working/theory is explained, there are pictures and lots of cool projects. After you have read or browsed the book, you can only admit that i did not say too much about it! When it have finished the book completely I will give an update about the book. For those who can not read German, just hope that an English version will be released. Or ask the publisher.&lt;br /&gt;
&lt;br /&gt;
Mark Alberts&lt;br /&gt;
MCS&lt;br /&gt;
&lt;br /&gt;
Ein tolles Buch vor allem auch für Praktiker. Das Buch enthält zahlreiche Themen und Projekte die auch im Roboternetz immer wieder diskutiert werden. Beliebte Boards wie [[RN-Control]] und viele andere Robotikhardware.de-Komponenten werden erläutert und programmiert. Neben der Beschreibung zahlreicher Sensoren sind auch praktische [[Bascom]]-Beispielprogramme vorhanden. Wer sich im Roboternetz wohl fühlt wird auch dieses Buch mögen.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 13:41, 27. Mär 2008 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Erschienen Franzis-Verlag &lt;br /&gt;
 Erscheinungsdatum: Feb 2008&lt;br /&gt;
 ISBN  978-3-7723-4109-0&lt;br /&gt;
 Bezug. z.B. Robotikhardware.de, Conrad-Electronic, Franzis, Amazon&lt;br /&gt;
 49,95 Euro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://www.roboternetz.de/wissen/images/3/38/Vg4109-0-3D.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mikrocontroller-Bücher==&lt;br /&gt;
===Programmieren der AVR RISC Mikrocontroller mit BASCOM-AVR, Autor Claus Kühnel===&lt;br /&gt;
Das beliebte AVR Bascom-Buch von Claus Kühnel ist nun in einer völlig überarbeiteten und erweiterten Auflage erschienen. Ganze 376 Seiten umfasst dieses wirklich umfangreiche Werk. &lt;br /&gt;
Das Buch wurde nun auch um die neueren AVR –Typen AVR-Tiny und AVR-Mega erweitert. Also es wird nicht nur die Entwicklungsumgebung des Bascom Basic Compilers erläutert, sondern auch die Möglichkeiten der einzelen AVR-Controller. Dazu findet man zahlreiche Beispiele und ganz Applikationen im Buch. Angesprochen werden die Installation der IDE, der eingebauten Simulator, eingebaute Entwicklungstools wie LCD-Designer, Terminal-Emulator, Libary Manager als auch einige AVR-Starterkits. Bei den Starterkits ist das noch recht neue rn-Control leider noch nicht dabei, dennoch lassen sich die meisten Dinge auch auf rn-control übertragen und dort nachvollziehen.&lt;br /&gt;
 &lt;br /&gt;
Im Buch werden auch wichtige Schnittstellen wie SPI, USART, SPI (Hard- und Software), I2C-Bus (Hard- und Software), 1-Wire-Bus uvm. erläutert. Auch dazu findet man Programme, die einem beim Umsetzen in die Praxis helfen. Aber auch der Anschluss und die Programmierung externer Hardware, Motoren, DOT-Matrix-Anzeigen, LEDs, Matrix-Tastaturen und PC-AT-Tastaturen werden erläutert. &lt;br /&gt;
&lt;br /&gt;
Ein wirklich sehr gelungenes Buch! &lt;br /&gt;
&lt;br /&gt;
[[Bild:Buch_kuehnelbascom.png|center]]&lt;br /&gt;
&lt;br /&gt;
Auch wenn einige Kapitel des Buches nicht unbedingt für Anfänger geeignet sind, so bleiben wegen des Umfangs immer noch genügend interessante Seiten übrig. Mein bisheriges Lieblingsbuch!&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 18:18, 16. Nov 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
 Autor: Claus Kühnel &lt;br /&gt;
 376 Seiten &lt;br /&gt;
 ISBN 3-907857-04-68 &lt;br /&gt;
 Preis EUR 34,95 &lt;br /&gt;
 Bezugsquelle. u.A. Amazon,robotikhardware.de&lt;br /&gt;
&lt;br /&gt;
===AVR-Mikrocontroller Lehrbuch, Autor Roland Walter===&lt;br /&gt;
&lt;br /&gt;
Warum schwer, wenn es auch einfach geht? - Das Buch führt leicht verständlich in die Welt der AVR-Mikrocontroller ein. Systematisch, Schritt für Schritt, mit der Hochsprache Basic und vielen gut kommentierten Beispiel-Listings. Was auch erwähnt werden muß: Der Stoff ist dicht und das Buch verzichtet auf &amp;quot;Seitenschinderei&amp;quot;. &lt;br /&gt;
Als Programmiersprache wird der sehr effiziente Bascom-AVR-Basic-Compiler verwendet, der auch in einer kostenlosen Version erhältlich ist. Es wurde darauf geachtet, daß die Beispiel-Listings auch für C-Programmierer leicht verständlich sind. Darüber hinaus ist im Buch eine kurze Einführung zu C (AVR-GCC) von Wolfgang Neudert enthalten. &lt;br /&gt;
Als Grundlage dient der AVR-Typ ATmega8. Dieser preiswerte AVR ist durch seine umfangreiche Ausstattung gut geeignet, um als Beispiel für die gesamte AVR-Serie dienen zu können. Am Ende soll der Leser in der Lage sein, sich andere AVR-Typen selbst erschließen zu können. &lt;br /&gt;
Für die AVR-Experimente wurde ein einfaches und übersichtliches Experimentierboard entworfen und es werden verschiedene Fertig- und Selbstbau-Programmieradapter vorgestellt. Das Experimentierboard kann als Bauteilesatz mit Platine fertig gekauft oder selbst aufgebaut werden. &lt;br /&gt;
Das Buch hat 224 Seiten, drurchgängig Farbdruck. Zum Buch gehört eine CD-ROM mit der nötigen Software, den Beispielprogrammen und den Datenblättern. &lt;br /&gt;
&lt;br /&gt;
Bestellung: Das Buch kann über die Webseite www.rowalt.de oder www.robotikhardware.de bestellt werden sowie über ausgewählte Elektronik-Händler. Bestellungen über den normalen Buchhandel sind bislang nicht möglich sein. &lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 18:20, 16. Nov 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://www.rowalt.de/mc/avr/avrbuch/coverb.png&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===AVR-RISC Mikrocontroller, Autor Wolfgang Trampert===&lt;br /&gt;
&lt;br /&gt;
Der Leser soll durch dieses Buch in die Lage versetzt werden, eigene Schaltungen mit diesen in fortschrittlicher RISC-Architektur entwickelten AVR-Controllern zu entwerfen, aufzubauen und zu testen.&lt;br /&gt;
Ein Programmiergerät für den Download selbst erstellter Programme in das Flash-EPROM des Controllers wird ebenso vorgestellt, wie eine Vielzahl von Anwendungsbeispielen für diese AVR Controllergeneration. Auf der dem Buch beiliegenden CD-ROM werden neben einem voll funktionsfähigen Assembler und einem Simulator für den Test eigener Programme alle Quell-Codes der vorgestellten Anwendungsbeispiele mitgeliefert und können vom Leser unmittelbar in eigene Projekte übernommen werden. Das Buch wendet sich an Entwickler, Ingenieure, Auszubildende, Studenten und Dozenten sowie an engagierte Hobbyelektroniker, kurz gesagt an alle, die diese neue Generation von Single-Chip-Controllern kennen und verstehen lernen wollen&lt;br /&gt;
&lt;br /&gt;
Aus dem Inhalt: CPU; Zeitgeber, Zähler; Watchdog Timer; Asynchrone Datenübertragung über die Ein-/Ausgabe-Ports; Befehlsvorrat; Das AVR-Studio; AVR-Controller; AVR-Applikation; C-Datenblätter Angaben zum CD-Inhalt: Vollversion des AVR-Assemblers, Vollversion des AVR- Studios, Der Sourcecode aller Programme, Datenblätter aller AVR-Controller, AVR- Applikationen, C-Datenblätter &lt;br /&gt;
&lt;br /&gt;
Das Buch eignet sich sehr gut auch als Nachschlagewerk und zur Vertiefung  bestimmter Techniken. So wird beispielsweise der I2C-Bus in kaum einem anderen Buch so ausführlich, genau und verständlich erläutert wie in diesem Buch.  Da sich ein Großteil der Seiten sehr ausfühlich das  AVR Assembler Entwicklungssystem sowie die einzelnen Assemblerbefehlen befasst, dürfte das Buch für für Assembler-Einsteiger von besonderem Nutzen sein.&lt;br /&gt;
&lt;br /&gt;
Ein Manko des Buches ist, dass die neue AVR MEGA-Controllerserie (z.B auch der Mega32 von rn-control) noch nicht konkret im Buch angesprochen wird. Konkret werden vorwiegend kleinere AVR Controller behandelt, welche heute eigentlich nur noch in geringer Zahl zum Einsatz kommen dürften, zumindest bei Hobby-Bastlern. Auch die oft eingesetzten Entwicklungssysteme GCC C-Compiler und Bascom-Basic werden leider noch nicht in dem Buch angesprochen. Dennoch ist das Buch wegen verschiedener Hardware-Grundlagen als Nachschlagewerk unbedingt empfehlenswert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://images-eu.amazon.com/images/P/3772354769.03.MZZZZZZZ.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Gebundene Ausgabe 462 Seiten&lt;br /&gt;
 Franzis Verlag&lt;br /&gt;
 ISBN 3772354769&lt;br /&gt;
 Bezug: Buchhandel / Amazon.de&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===BASCOM-AVR – Sprachbefehle, Autor Mario Meissner===&lt;br /&gt;
Dieses Buch stammt vom Autor Mario Meissner, welcher bereits ein anderes Bascom-Buch geschrieben hat. In diesem Werk beschäftigt er sich ausschließlich mit der Beschreibung aller Bascom-Basic-Befehle. Damit ergänzt das Buch hervorragend alle bisher erschienen Bascom-Bücher, die vorwiegend ausgewählte Möglichkeiten der Controller und bestimmte Aspekte der Programmiersprache behandeln. &lt;br /&gt;
Dass auch eine umfassende Befehlsbeschreibung noch notwendig war, zeigt schon der enorme Umfang des Buches. Es ist ein Wälzer von über 530 Seiten entstanden!!! Allein das zeigt, welche Möglichkeiten in dieser zum Teil noch unterschätzen Programmiersprache stecken. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://www.shop.robotikhardware.de/shop/catalog/images/imagecache/meisbuch3.jpeg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das neue Buch umfasst im wesentlichen den kompletten Inhalt der hervorragenden englischsprachigen Dokumentation, welche sonst nur als Help-File mitgeliefert wird. Das Ganze ist auch ähnlich übersichtlich gegliedert: &lt;br /&gt;
&lt;br /&gt;
* Befehl&lt;br /&gt;
* Parameter&lt;br /&gt;
* Erläuterung&lt;br /&gt;
* Verzweigungen zu ähnlichen Befehlen&lt;br /&gt;
* Democode&lt;br /&gt;
&lt;br /&gt;
Auch wenn große Teile des Buches sehr ähnlich dem englischen Help-File sind, so bietet das Buch selbst für Leser mit guten englisch Kenntnissen eine echte Hilfe. Denn wer liest schon eine Help-Datei so gigantischen Ausmaßes wirklich seitenweise durch?  Dies führt dazu, dass man über die Existenz vieler Befehle einfach gar nicht informiert ist.&lt;br /&gt;
Ein gedrucktes Buch dagegen ermuntert doch immer ein wenig zum Blättern. Ich bin sicher, dass der Leser noch zahlreiche Befehle findet, die er schon längst hätte brauchen können, aber von deren Existenz er einfach nichts wusste. Auch mir ist es so gegangen, obwohl ich schon einige Bücher zu Bascom gelesen habe und auch recht oft die Help-Datei zu Rate ziehe.&lt;br /&gt;
Besonders angenehm ist, dass auch die Kommentarzeilen innerhalb der zahlreichen Beispiele nicht in englisch sondern in deutsch gehalten sind. Zudem sind auch neuste Bascom Zusatz-Libarys bereits in dem Buch aufgeführt.&lt;br /&gt;
&lt;br /&gt;
Alles in allem ist ein wirklich gutes Referenzwerk zum Nachschlagen entstanden. Es eignet sich keinesfalls nur für Einsteiger sondern ohne Zweifel auch für erfahrene Programmierer. Ideal also auch für Roboter-Bastler, die sich für AVR-Boards, wie zum Beispiel Eigenentwicklungen, [[RN-Control]], RNBFRA-Board und andere entschieden haben. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Autor: Marius Meissner &lt;br /&gt;
 Auflage , 8/2004 &lt;br /&gt;
 Deutsch , ca. 538 Seiten &lt;br /&gt;
 broschiert , inkl. 1 CD &lt;br /&gt;
 ISBN: nicht vorhanden &lt;br /&gt;
 Preis: 41,73 Euro inkl. Mwst.&lt;br /&gt;
 Bestellung nur über: &lt;br /&gt;
 Autor Mario Meissner http://bascom-avr.de/Buch.aspx?ID=2&lt;br /&gt;
 oder http://robotikhardware.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Softwareentwicklung in C für Mikroprozessoren und Mikrocontroller, Autor Jörg Wiegelmann===&lt;br /&gt;
&lt;br /&gt;
Dieses Buch bietet eine allgemeine, praxisorientierte Einführung sowie einen Praxisteil. Der allgemeine Teil ist möglichst werkzeug- und prozessorunabhängig aufgebaut. Er enthält und beschreibt mit zahlreichen praxisbezogenen Tipps alle notwendigen Grundlagen, Werkzeuge und Informationen wie Einführung in C, Compiler, Linker, Library, Make, C-Programmierung für Embedded-Systeme, Quellcode, Tools und Entwicklungsumgebung, Systemdesign und objektorientierte Programmierung. Neben neuen Abschnitten zu Softwarekomplexität und Dokumentation sind zahlreiche Detailverbesserungen und Erweiterungen eingeflossen.&lt;br /&gt;
&lt;br /&gt;
Im Praxisteil wird das theoretisch dargestellte Wissen in einer kompletten, aktualisierten Fallstudie veranschaulicht und vertieft. Die Werkzeuge und der Prozessor der Fallstudie sind so ausgewählt, dass eine Umsetzung mit möglichst geringem Aufwand erfolgen kann.&lt;br /&gt;
&lt;br /&gt;
Wer eigene Projekte in C für Embedded-Systeme entwickeln möchte, findet somit in diesem Buch alles Notwendige.&lt;br /&gt;
&lt;br /&gt;
Die beiliegende CD-ROM enthält eine Vielzahl von aktuellen, nützlichen Programmen für die Praxis in der Softwareentwicklung wie Gnu-C-Compiler, Software und Beschreibung zum Selbstbau eines Low-Cost-Programmiergerätes, Software zur Verwaltung, Komplexitätsanalyse und Dokumentation von Quellcode, eine Softwareentwicklungsumgebung und die im Buch behandelte Fallstudie als kompletten Quellcode. Alle beigefügten Programme sind Vollversionen und in ihrem Einsatz nicht beschränkt. &lt;br /&gt;
&lt;br /&gt;
 Broschiert - 309 Seiten - Hüthig &lt;br /&gt;
 Erscheinungsdatum: September 2004&lt;br /&gt;
 ISBN: 3778529439&lt;br /&gt;
 39,80 Euro&lt;br /&gt;
 Bezug: z.B. Amazon.de&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://images-eu.amazon.com/images/P/3778529439.03.MZZZZZZZ.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Messen,Steuern und Regeln mit ARM-Microcontrollern, Autor Klaus-Dieter Walter===&lt;br /&gt;
'''Klappentext:''' Messen, Steuern und Regeln mit ARM-Mikrocontrollern Mikrocontroller sind in der Elektronik heute allgegenwärtig. Meist unbemerkt versehen diese programmierbaren, integrierten Bausteine ihren Dienst. Ob in einer Waschmaschine, einem Handy oder in der ABS-Bremsanlage eines Autos -immer sind Mikrocontroller am Werk. ARM ist die Bezeichnung für eine 32-bit-Mikrocontroller-Architektur. Namensgebend ist die englische Firma ARM Limited. Diese Firma produziert selbst keine Mikrocontroller, vertreibt aber Lizenzen an Lizenznehmer, die ARM-basierte Mikrocontroller entwickeln, fertigen und vermarkten. ARM Mikrocontroller bieten beachtliche Leistungsmerkmale zu einen günstigen Preis, weshalb sich diese Leistungsklasse sehr rasant verbreitet hat. ARM-Mikrocontroller bilden das Herz vieler eingebetteter Systeme (Embedded Systems). Dieses Buch bietet eine Einführung in die wichtigsten Merkmale und Besonderheiten der ARM-Architektur. Anhand verschiedener ARM Mikrocontroller- und ARM-Modul-Beispiele werden die umfangreichen Peripheriefunktionen und deren Einsatz für MSR-Aufgabenstellungen erläutert. Im Zusammenhang mit dezentralen MSR-Anwendungen sind ARM Mikrocontroller besonders für Vernetzungsaufgaben geeignet. Aus diesem Grund bietet das Buch eine Einführung in Ethernet-basierte TCP/IP-Netzwerke und die ARM-Integration in solche Netze. Dabei kommen auch Embedded-Betriebssysteme wie z. B. Linux zur Sprache&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://images-eu.amazon.com/images/P/3772340172.03.MZZZZZZZ.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Persönliche Lesermeinung:''' Ein sehr hilfreiches und gelungenes Buch wenn schon etwas Microcontroller-Erfahrung besitzt und zum Beispiel von reinen Risc- Microcontrollern auf einen [[Microcontroller]] der ARM-Architektur umsteigt. Schon nach dem Anlesen merkt man das der Autor wirklich was von der Materie versteht und sich dort richtig Zuhause fühlt. Perfekt wird unter anderem der Unterschied und der Zusammenhang der Architekturen und Microcontollerarten ([[Arm|ARM]], RISC, CISC, MSR) erläutert. Übersichtliche und endlich mal verständliche Diagramme helfen hier sehr. Natürlich wird auch Erläutert welche Entwicklungssystem, Betriebssysteme (z.B. wird auf Linux eingegangen) der ARM Baureihe verwendet werden können. Ein weiterer Schwerpunkt sind die verschiedenen MSR Schnittstellen wie [[UART]], SPI, [[I2C]], CAN, USB Ethernet und weitere. &lt;br /&gt;
Fazit: Obwohl das Buch nicht ganz neu ist, scheint es mir eine gutes Einführungswerk für diese doch recht schwere Materie zu sein, insbesondere wenn man auch schon mit kleineren 8 Bit Microcontrollern ([[Avr]]/Pic) gearbeitet hat.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 21:02, 7. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
 Gebundene Ausgabe mit 379 Seiten&lt;br /&gt;
 Erschienen im Franzis -Verlag September 2004&lt;br /&gt;
 ISBN: 3772340172&lt;br /&gt;
 Preis 39,95 Euro&lt;br /&gt;
 Bezug: Buchhandel, Amazon etc.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Das große PIC-Mikro Handbuch, Autor Anne und Manfred König===&lt;br /&gt;
'''Klappentext:'''Die Autoren haben viele Jahre Erfahrung mit industriellen PIC-Mikro-Projekten. Sie behandeln das Thema aus der Sicht ihres Entwickler-Alltags. Dazu gehört auch die ganze Peripherie, also alles was um die PIC-Mikrocontroller herum von Bedeutung ist. Dazu zählen z.B. analoge Peripheriebausteine und die Entwicklungsumgebung, bestehend aus MPLAB inklusiv der Debugger und den Demoboards. &lt;br /&gt;
Dieses Buch richtet sich an Interessenten, die bereits erste Erfahrungen mit PIC-Mikrocontrollern gesammelt haben. Der Schwerpunkt liegt auf den neuen Entwicklungen der letzten Jahre. Dazu gehört natürlich in erster Linie die PIC18 Generation, die mit dem 16 Bit-Kern nicht nur höheren Programmierkomfort beinhaltet, sondern vor allem eine Fülle neuer technischer Möglichkeiten &lt;br /&gt;
bietet. Aber auch von den PICs mit 14 bzw. 12 Bit-Kern gibt es viel Neues zu berichten. &lt;br /&gt;
&lt;br /&gt;
Aus dem Inhalt:&lt;br /&gt;
*Serielle Kommunikation&lt;br /&gt;
*PIC18&lt;br /&gt;
*Powermanagment&lt;br /&gt;
*Die neuen PIC10F und rfPIC&lt;br /&gt;
*PIC in Assembler programmieren&lt;br /&gt;
*Entwicklungssystem MPLAB 6.XX&lt;br /&gt;
*Der In-circuit-Debugger und Programmer ICD2 &lt;br /&gt;
*Demoboards und Peripheriebausteine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://images-eu.amazon.com/images/P/3772359957.03.MZZZZZZZ.jpg&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Persönliche Lesermeinung:'''Ich habe mir das Buch besorgt um auch mal einen Einblick in die PIC-Welt zu bekommen. Beurteilen kann ich das Buch nur als PIC-Einsteiger, da ich eigentlich vorwiegend mit [[AVR]]-Controllern arbeite. Das Buch ist gut strukturiert und geht sehr gut auf die einzelnen Features, Eigenschaften und Architekturen der PIC-Controller ein. Dabei wird auch schon die derzeit neue PIC18 Serie berücksichtigt. Register werden oft in Verbindung mit kleinen Assembler-Beispielen und anschaulichen Tabellen erläutert. Schade ist nur, das wohl keine Basic Entwicklungsumgebung auf der CD vorhanden ist. Dem Assemblerfreund dürfte jedoch das enthaltene MLAB Entwicklungssystem alles notwendige mitbringen.  Etwas schade ist, das auf die Pic-Typen mit USB Schnittstelle nur relativ kurz eingegangen wird.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Frank|Frank]] 16:05, 9. Dez 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
 Gebundene Ausgabe mit 312 Seiten&lt;br /&gt;
 Erschienen im Franzis-Verlag Februar 2005&lt;br /&gt;
 Auflage: 1&lt;br /&gt;
 ISBN: 3772359957&lt;br /&gt;
 Preis: 39,95 Euro&lt;br /&gt;
 Bezug: Buchhandel, Amazon etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Elektronikbücher ==&lt;br /&gt;
=== Elektronik-Fibel, Patrik Schnabel ===&lt;br /&gt;
'''Lesermeinung von [[Benutzer:LUMA|Luma]]:''' Das Buch gibt einen Überblick über elektronische Grundlagen, Bauteile, Schaltungstechnik, Messtechnik und Digitaltechnik. Der Leser meint also, ein kompaktes Buch über Elektronik und alles was dazugehört in der Hand zu halten. Leider sind viele Kapitel viel zu oberflächlich und das Layout wurde wohl mit dem miserablen Programm, dem Layout leider fremd ist, einer bekannten Softwareschmiede geschaffen. Anders kann man sich das, an vielen Stellen, katastrophale Layout nicht erklären. Ein weiterer Kritikpunkt sind die miserablen Grafiken. Ansonsten ist das Buch ganz gut geeignet zum Nachschlagen geeignet. Ich empfehle das Buch allen, die sich in Elektronik noch nicht so gut auskennen und ein kompaktes Buch zum Nachschlagen suchen (also nicht nur Elektronikbastlern sondern auch Schülern). Als Alternative bietet sich die Website des Autors (siehe unten) an. Dort gibt es das ELKO in dem man sehr viele Informationen zum Thema finden kann.&lt;br /&gt;
&lt;br /&gt;
[[Benutzer:LUMA|Luma]]&lt;br /&gt;
&lt;br /&gt;
 Autor: Patrick Schnabel  Webseite: http://www.elektronik-fibel.de&lt;br /&gt;
 245 Seiten, broschiert&lt;br /&gt;
 ISBN 3-83114-59-03&lt;br /&gt;
 Preis EUR 15,50&lt;br /&gt;
 Bezugsquellen: Amazon, ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
http://www.elektronik-fibel.de/uploads/elektronik-fibel/cover.gif&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmiersprachen==&lt;br /&gt;
&lt;br /&gt;
===C Programmieren von Anfang an, Autor Helmut Erlenkötter===&lt;br /&gt;
Dieses Buch von Helmut Erlenkötter finde ich, ist sehr zu empfehlen.&lt;br /&gt;
Es bietet einen guten Einstieg in die Programmierung mit C für Ein- und Umsteiger.&lt;br /&gt;
Es ist meiner Meinung nach gut für 'blutige' Anfänger geeignet, denn es erklärt sehr genau, was passiert, und wo man aufpassen muss.&lt;br /&gt;
&lt;br /&gt;
Nach jedem Kapitel werden Aufgaben gestellt, um das erworbene Wissen zu testen.&lt;br /&gt;
&lt;br /&gt;
Es gibt viele Codebeispiele, bzw. die ganze Programmierung wird anhand von Codebeispielen erklärt.&lt;br /&gt;
Jeder Schritt in einem Listing wird gesondert erklärt, was die Übersicht des Buches und der Listings enorm erhöht.&lt;br /&gt;
&lt;br /&gt;
'''Die Kapitel:'''&lt;br /&gt;
&lt;br /&gt;
# Prolog&lt;br /&gt;
# Erste Schritte&lt;br /&gt;
# Mit Zahlen arbeiten&lt;br /&gt;
# Entscheidungen treffen&lt;br /&gt;
# Wiederhohlen von Programmteilen&lt;br /&gt;
# Funktionen definieren&lt;br /&gt;
# Felder und Zeichenketten&lt;br /&gt;
# Variablen und Konstanten&lt;br /&gt;
# Der Präprozessor&lt;br /&gt;
# Pointer&lt;br /&gt;
# Kommandozeilenparameter&lt;br /&gt;
# Dateien benutzen&lt;br /&gt;
# Fehler kontrollieren&lt;br /&gt;
# Komplexe Dateitypen&lt;br /&gt;
# Programmiertechniken&lt;br /&gt;
# C und Objekte&lt;br /&gt;
# Anhang&lt;br /&gt;
&lt;br /&gt;
Eine komplette ASCII-Tabelle befindet sich im Anhang.&lt;br /&gt;
&lt;br /&gt;
Das Buch verfügt über einen großen und ausführlichen Glossar.&lt;br /&gt;
&lt;br /&gt;
Sterne: * * * * *&lt;br /&gt;
&lt;br /&gt;
'-by tobimc-'&lt;br /&gt;
&lt;br /&gt;
 by Helmut Erlenkötter&lt;br /&gt;
 RORORO, ISBN 3-499-60074-9&lt;br /&gt;
 Broschiert, 9,90€ (D)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Bild:Buch-C.jpg]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===C++, Objektorientiertes Programmieren von Anfang an, Autor Helmut Erlenkötter===&lt;br /&gt;
&lt;br /&gt;
Auch dieses Buch bietet sich für Ein- und Umsteiger an, da auch hier wieder von Anfang an auf die Eigenarten dieser Programmiersprache eingegangen wird. Zu Beginn werden die Unterschiede zwischen C und C++ aufgeführt und dann geht es auch schon sofort los. Wie in all seinen Büchern, geht der Autor sehr schön systematisch vor. Es werden immer wieder Beispiele genannt, die den behandelten Stoff aufnehmen. Er weist auf eventuelle Fehler hin, die gemacht werden können und spricht jede Änderung oder Neuerung sofort durch. Am Ende eines jeden Kapitels gibt es Aufgaben zu lösen. Alle Lösungen für diese Aufgaben finden sich am Ende des Buches. Und auch hier hat der Autor wieder eine Menge an zusätzlichen Daten in das Glossar gepackt und eine ASCII-Tabelle fehlt auch hier nicht.&lt;br /&gt;
&lt;br /&gt;
Als weiterführendes Buch, nach &amp;quot;C programmieren von Anfang an&amp;quot; auf jedenfall zu empfehlen.&lt;br /&gt;
&lt;br /&gt;
 von Helmut Erlenkötter&lt;br /&gt;
 ISBN 3-499-60077-3&lt;br /&gt;
 Broschiert, 10,50 € (D)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[Bild:Buch-c--.jpg]]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Metallbearbeitung==&lt;br /&gt;
===Fachkunde Metall===&lt;br /&gt;
&lt;br /&gt;
Das nahezu 600 Seiten starke Buch macht gleich beim Aufschlagen einen guten Eindruck. Keine langen Vorworte und Danksagungen, sondern auf Seite 3 eine grobe Übersicht der relevanten Themen.&lt;br /&gt;
&lt;br /&gt;
#Längenprüftechnik&lt;br /&gt;
#Fertigungstechnik&lt;br /&gt;
#Werkstofftechnik&lt;br /&gt;
#Maschinen und Gerätetechnik&lt;br /&gt;
#Automatisierungstechnik&lt;br /&gt;
#Informationstechnik&lt;br /&gt;
#Elektrotechnik&lt;br /&gt;
&lt;br /&gt;
Der groben Übersicht folgt ein detailliertes Inhaltsverzeichnis. Am Ende des Buches befindet sich ein Stichwortverzeichnis.&lt;br /&gt;
&lt;br /&gt;
[[Bild:fachkundemetall.jpg|center]]&lt;br /&gt;
&lt;br /&gt;
1) Längenprüftechnik:&lt;br /&gt;
&lt;br /&gt;
Über Größen und Einheiten gelangt der Leser zu den Grundlagen der Messtechnik. Besonders gut gefiel mir hier die reich bebilderte Darstellung der möglichen Messfehler. Dies kommt gerade dem Anfänger zu Gute.&lt;br /&gt;
Vorgestellt werden neben den gängigen Messmitteln wie Stahlmaßstab, Messschieber (landläufig als Schieblehre bekannt), Bügelmessschraube (Mikrometer) und Messuhr (zum Ausrichten auf Dreh- und Fräsmaschinen) auch weiterführende Messmittel bis hin zu pneumatischen, induktiven und optischen Messverfahren.&lt;br /&gt;
Für ambitionierte Roboterbauer folgen noch weitere Kapitel in den Bereichen Oberflächenprüfung &lt;br /&gt;
Toleranzen und Passungen, Form und Lageprüfung&lt;br /&gt;
&lt;br /&gt;
2) Fertigungstechnik:&lt;br /&gt;
&lt;br /&gt;
Hier sind besonders die Kapitel a) Umformen und b) spanende Fertigung erwähnenswert.&lt;br /&gt;
Umformen (Verhalten der Werkstoffe und Biegeumformen) zu erwähnen.&lt;br /&gt;
Jeder, der schon mal ein Werkstück gebogen hat und nach dem Biegevorgang feststellte, dass die Maße nicht stimmten findet hier Abhilfe. &lt;br /&gt;
Der größte Block in diesem Abschnitt ist zweifellos die spanende Fertigung. &lt;br /&gt;
Darunter versteht man ganz profan alle Fertigungsverfahren, bei denen Späne anfallen.&lt;br /&gt;
Ausgehend von den Grundlagen der spanenden Fertigung, der Werkzeugschneide, Schneidstoffe und Kühlschmierstoffe  werden die für den Hobby-Roboterbauer unumgänglichen Themen: Sägen, Bohren, Senken  behandelt. &lt;br /&gt;
Hier hätte ich mir noch einen weiteren Block, der das Thema „Feilen“ behandelt, gewünscht. Gerade der Hobby-Roboterbauer ist in der Formgebung oft auf dieses Verfahren angewiesen.&lt;br /&gt;
Für den ambitionierten Roboterbauer werden selbstverständlich auch die Themen:&lt;br /&gt;
Reiben, Drehen, Fräsen, Schleifen sowie Vorrichtungen und Spannelemente reich bebildert abgehandelt.&lt;br /&gt;
Ein weiterer großer Block den kein Roboterbauer umgehen kann ist der des Fügens. Wie kommen meine Teile zueinander und welche Verfahren wende ich an? Schrauben, Pressen, Schnappen, Kleben, Löten, Schweißen? Diese Fragen werden dort geklärt. &lt;br /&gt;
&lt;br /&gt;
3) Werkstofftechnik:&lt;br /&gt;
&lt;br /&gt;
Wie ein roter Faden zieht sich auch in diesem Kapitel die saubere Gliederung durch das umfassende Thema. Angefangen von der Übersicht der Werk- und Hilfsstoffe über die Auswahl und Eigenschaften der Werkstoffe zum inneren Aufbau der Metalle.&lt;br /&gt;
Besonders interessant ist auch für den Hobby-Roboterbauer die Frage, mit welchem Werkstoff arbeite ich?&lt;br /&gt;
Diese Frage wird entsprechend den Klassifizierungen der Werkstoffe behandelt. Einen Stahl mit der Kennung „45 Cr Mo V 6-7“ kann man nach dem Studium der Kapitel zuordnen.&lt;br /&gt;
Leider ist das Kapitel der Nichteisenmetalle etwas kurz gehalten. Aluminium (als Leichtmetall) ist unter den Roboterbauern ein sehr beliebter Stoff. So wird zwar erwähnt, dass man Aluminium, ähnlich wie Stahl, härten kann, eine Beschreibung des Verfahrens fehlt aber.&lt;br /&gt;
Der Leser bekommt aber einen Überblick über die Nichteisenmetalle. Nach dem Studium der entsprechenden Seiten kommt beispielsweise kein Roboterbauer auf den Gedanken eine Gleitlagerung aus Aluminium-Aluminium zu bauen.&lt;br /&gt;
Die Themen: Sinterwerkstoffe, Keramische Werkstoffe, Wärmebehandlung der Stähle (ggf. auch für den Roboterbauer interessant), Werkstoffprüfung (Zugfestigkeit, Härte, Metallurgie usw.) werden ebenfalls besprochen.&lt;br /&gt;
&lt;br /&gt;
Des weiteren findet sich ein eigenes Kapitel zur Korrosion und Korrosionsschutz in diesem Abschnitt. &lt;br /&gt;
Auf sechs Seiten wird beschrieben, wie es zur Korrosion kommt (incl. elektrochemischer Spannungsreihe). Korrosionsschutzmaßnahmen bis hin zu Fremdstromanoden (sog. Opferanoden) werden angesprochen. &lt;br /&gt;
&lt;br /&gt;
Mit dem Themenkomplex der Kunststoffe geht es weiter. Ausgehend von „Eigenschaften und Verwendung“ über die Aufklärung bezüglich Thermoplaste, Duroplaste und Elastomere bis hin zur Formgebung findet man einiges an Informationen. Insbesondere im Bereich der Weiterverarbeitung findet der Leser einige, auf die Industrie zugeschnittene Verfahren. Manches lässt sich aber, mit Kreativität, auch zu Hause durchführen.&lt;br /&gt;
&lt;br /&gt;
Das Kapitel schließt mit den beiden Themen &lt;br /&gt;
Verbundwerkstoffe und, auch für uns wichtig, der Umweltproblematik der Werkstoffe.&lt;br /&gt;
&lt;br /&gt;
4) Maschinen und Gerätetechnik:&lt;br /&gt;
&lt;br /&gt;
Über die Einteilung der Maschinen (z.B: Kraftmaschinen, Arbeitsmaschinen usw.) und den Funktionseinheiten der Maschinen (welche exemplarisch an Beispielen wie CNC Werkzeugmaschine, Kraftfahrzeug, Klimaanlage besprochen werden), bis hin zu Sicherungseinrichtungen, sowie Bedienung und Instandhaltung gelangt man zu den für uns ebenfalls wichtigen Themen der: &lt;br /&gt;
Beanspruchung und Festigkeit. Die einzelnen Beanspruchungsfälle werden anhand von: Schraubverbindungen, Stiftverbindungen, Nietverbindungen und Welle-Nabe-Verbindungen besprochen.&lt;br /&gt;
Weiterhin werden auch Reibung und Schmierstoffe, Gleit und Wälzlager, Führungen, Dichtungen und Federn abgehandelt.&lt;br /&gt;
Nach durcharbeiten des Themenkomplexes kennt der Roboterbauer Begriffe wie statische Belastung und die drei Formen der dynamischen Belastung.&lt;br /&gt;
Zug-, Druck-, Abscher-, Biege-, Verdreh- (Torsions-), oder auch zusammengesetzte Beanspruchung werden exemplarisch und bebildert erläutert.&lt;br /&gt;
&lt;br /&gt;
Weitere Themen sind die  Schraubverbindung (Gewindearten, Einteilung, Verwendung), Schraubensicherung (sehr wichtig bei dynamischen Belastungen im Roboterbau), Stiftverbindungen (Zylinderstifte, Kegelstifte, Kerbstifte)&lt;br /&gt;
Nietverbindungen, Welle-Nabe-Verbindungen (formschlüssige, sowie kraftschlüssige)&lt;br /&gt;
Der große Komplex der Gleit- und Wälzlager, Führungen, Dichtungen und Federn wird hier sehr gut in Wort und Bild dargestellt.&lt;br /&gt;
&lt;br /&gt;
Auf all diese Themen im einzelnen einzugehen würde den Rahmen dieser Besprechung bei weitem sprengen. Es ist für jeden Roboterbauer (auch ohne Drehmaschine mit Fräseinrichtung) ein lesenswertes Thema. Für die, welche eine kleine Drehmaschine und/oder Fräse ihr Eigen nennen geradezu ein Muss!&lt;br /&gt;
Weitere Themen in diesem Kapitel sind: Funktionseinheiten zur Energieübertragung (Wellen, Achsen, Kupplungen, Riementriebe, Kettentriebe, Zahnriementriebe, sowie Elektromotoren, für den Industriebedarf und Getriebe – Linearantriebe)&lt;br /&gt;
Die verbleibenden Abschnitte in diesem Kapitel (Montagetechnik und Fertigungseinrichtungen) orientieren sich weitestgehend an industrielle Bedürfnissen.&lt;br /&gt;
&lt;br /&gt;
Zwischenfazit zu diesem Kapitel:&lt;br /&gt;
Ein, mit 108 Seiten sehr gut und kompakt abgehandelter Themenkomplex, der insbesondere für den Roboterbau sehr viele grundlegende Informationen im Bereich Mechanik vermittelt. Auch der Leser, welcher nicht über eine komplett ausgerüstete Metall-Werkstatt verfügt findet hier Anregungen, die oft mit einfachen Mitteln zu besseren Ergebnissen führen kann.&lt;br /&gt;
&lt;br /&gt;
Auch der Laie wird nach dem Studium dieses Kapitel wissen, ob er ein metrisches Normalgewinde oder Feingewinde oder sogar ein Trapezgewinde einsetzen muss. Nehme ich ein Gleitlager oder Wälzlager. Benutze ich eine einfache Flachführung, Führung mit Kugelumlaufspindel oder ein Wälzführung mit Laufrollen. Möglichkeiten zum spannen von Riemen, Aufbau von Ketten Zahnrädern und Getrieben werden ebenfalls dargestellt.&lt;br /&gt;
Die Themen sind reich bebildert und mit zumindest einführenden Texten behandelt. Berechnungsbeispiele findet der Leser exemplarisch, aber nicht durchgängig. Dies macht auch Sinn, da ansonsten das Buch mit seinen nahezu 600 Seiten gesprengt würde. Die Berechnungen findet man in einem eigenen Mathe-Buch in Kombination mit dem Tabellenbuch. Beide werde ich zu einem späteren Zeitpunkt besprechen.&lt;br /&gt;
&lt;br /&gt;
5) Automatisierungstechnik&lt;br /&gt;
&lt;br /&gt;
Gerade der Roboter-Bauer ist besonders an der Automatisierungstechnik interessiert. Dieser Komplex wird in dem vorliegenden Buch auf ca. 80 Seiten behandelt. &lt;br /&gt;
Anhand von bebilderten Beispielen wird vieles in den Grundlagen gut dargestellt. Des weiteren bietet dieses Thema einen Einblick in die Pneumatik und Hydraulik. Logische Verknüpfungen, SPS und CNC – Steuerungen werden angeschnitten. Für einen Einstieg in die Thematik ist dieses Buch, auch aufgrund seiner Begriffsdefinitionen gut geeignet. Mikrocontroller-Programmierung, oder gar beispielhafte Lösungen im Bereich der Mikrocontroller findet man in einem Fachbuch der Metallkunde natürlich nicht&lt;br /&gt;
Das Thema der CNC-Maschinen incl. der Programmierung ist dann ausführlicher behandelt (26 Seiten). Wer also plant, sich eine kleine CNC- Fräse zuzulegen oder um(selbst)- zu bauen, findet in diesem Kapitel einiges an Informationen rund um die CNC-Maschine.&lt;br /&gt;
&lt;br /&gt;
6) Informationstechnik&lt;br /&gt;
&lt;br /&gt;
Das Kapitel Informationstechnik wird in die Bereiche Technische Kommunikation und Grundlagen der Computertechnik eingeteilt.&lt;br /&gt;
Hier findet man nur einen kleinen Abriss der ansonsten sehr umfangreichen Themen. Das Thema Technische Kommunikation  ist zwar wichtig, aber dafür gibt es spezielle Bücher. &lt;br /&gt;
Zum Thema Computertechnik stelle ich die These auf, dass die Mehrzahl der Forum-User mehr darüber wissen, als in dem Buch beschrieben ist.&lt;br /&gt;
&lt;br /&gt;
7) Elektrotechnik&lt;br /&gt;
&lt;br /&gt;
Das Buch endet mit dem Thema Elektrotechnik.&lt;br /&gt;
Die Themen Spannung, Strom, Wiederstand (und deren Schaltungen), sowie Stromarten, Leistung und Arbeit, Überstrom-Schutzeinrichtungen und Fehler an elektrischen Anlagen und Schutzmaßnahmen, werden gerade für den Laien sehr gut und einführend beschrieben.&lt;br /&gt;
&lt;br /&gt;
Die mitgelieferte CD ist überschrieben mit: „Bilder und Tabellen – interaktiv“.&lt;br /&gt;
Und damit ist die CD auch schon nahezu beschrieben.&lt;br /&gt;
Erwähnenswert wäre noch die Möglichkeit einzelne Ergänzungen in Form von bebilderten Abfragen (Schema: richtiger Begriff) vorzunehmen. Dies ermöglicht ein gewisses Training im Umgang mit den Fachtermini.&lt;br /&gt;
&lt;br /&gt;
Die großen Möglichkeiten eines interaktiven Mediums zum Buch wurden hier zwar im Ansatz realisiert, aber bei weitem nicht voll genutzt. Möglich wäre z.B: ein Lexikon der Fachbegriffe, welche bei entsprechender Eingabe auf den Artikel in den Büchern (Fachkunde, Fachrechnen, Tabellenbuch) verweist, sowie eine kurze Darstellung auf dem Monitor (ggf. mit Grafik/Foto). Des weiteren könnte man eine online-Schnittstelle zu Wikipedia einrichten.&lt;br /&gt;
Der Ansatz der CD ist sicherlich gut, aber das Potenzial der Medien (CD-Rechner-Intenet) ist bei weitem nicht ausgereizt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fazit:&lt;br /&gt;
&lt;br /&gt;
Obwohl das Buch in erster Linie auf die Arbeit in der industriellen Fertigung zugeschnitten ist, bringt es auch dem ambitionierten Hobby-Bastler einen reichen Zugewinn. &lt;br /&gt;
Ein wirklich lohnenswertes Buch für alle, die mit Metallen (und anderen Werkstoffen) oder Maschinen arbeiten und sich nicht scheuen, Zeit in die Durcharbeitung der für sie relevanten Themen zu investieren.&lt;br /&gt;
Die reiche Bebilderung (ein Bild sagt mehr als tausend Worte!), sowie die prägnante Beschreibung machen ein lernen mit diesem Buch sehr effektiv. Auch den Preis halte ich für mehr als gerechtfertigt. &lt;br /&gt;
&lt;br /&gt;
[[Benutzer:Klingon77|Klingon77]] 20. Feb 2007 (CET)&lt;br /&gt;
 &lt;br /&gt;
 Fachkunde Metall&lt;br /&gt;
 Europa Verlag&lt;br /&gt;
 Auflage: 54&lt;br /&gt;
 Europa Verlags NR: 10129&lt;br /&gt;
 ISBN 3-8085-1154-0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 [[Kategorie:Microcontroller]]&lt;br /&gt;
 [[Kategorie:Software]]&lt;br /&gt;
 [[Kategorie:Grundlagen]]&lt;br /&gt;
 [[Kategorie:Robotikeinstieg]]&lt;br /&gt;
 [[Kategorie:Elektronik]]&lt;/div&gt;</summary>
		<author><name>RobotProgger</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Wunschthemen&amp;diff=13352</id>
		<title>Wunschthemen</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Wunschthemen&amp;diff=13352"/>
				<updated>2008-03-30T17:07:31Z</updated>
		
		<summary type="html">&lt;p&gt;RobotProgger: /* Meine Wunschthemen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite kann '''jeder''' Themen nennen, die er sich in diesem Wiki wünschen würde. Die Seite dient Usern, die gerne was schreiben möchten, als Anregung. Hat jemand ein entsprechendes Thema erstellt, kann er es auch aus dieser Liste wieder streichen. &lt;br /&gt;
&lt;br /&gt;
==Meine Wunschthemen==&lt;br /&gt;
&lt;br /&gt;
'''Allgemeines'''&lt;br /&gt;
* Spracherkennung&lt;br /&gt;
* [[Schaltung AVR-Digitizer]] um Videobild mit AVR zu digitalisieren und auszuwerten oder per Funk zu übertragen&lt;br /&gt;
* Ausführliche Bedienhinweise für Euroflex-Saugroboter Monster Intelligente F1&lt;br /&gt;
* Künstliche Neuronale Netze&lt;br /&gt;
* Roboter-Filme&lt;br /&gt;
* [[Formula Flowcode Buggy]]&lt;br /&gt;
* Wie ist eine Grundschaltung für einen Roboter aufgebaut, dh. wie werden Motoren mit AVR's angesteuert, wie Sensoren ausgelesen? etc.&lt;br /&gt;
&lt;br /&gt;
'''Programmierung'''&lt;br /&gt;
* Enwickeln eines universellen Programms, das ein Programmablaufdiagram (PDA) direkt in ausführbaren Code für ein bestimmter Prozessor (Maschinensprache) wandelt&lt;br /&gt;
* [[Network_Controller/PC_Praxis#Network_Controller.2FPC_RS232_mit_Windows|Ansprechen der RS232 Schnittstelle mit gängigen Programmiersprachen]]&lt;br /&gt;
* Pda und PPC steuerung über CF und MMC slot&lt;br /&gt;
* [[GCC]] Einführung mit Beispielen (welche Beispiele? Benutzung von GCC? (Optionen, ...)?, Programmbeispiele (also [[C-Tutorial]])?), für spezielle Maschinen oder Derivate? ANSI-C? Was fehlt in den [[:Kategorie:Quellcode C|C-Beispielen]]?)&lt;br /&gt;
* Mehr C Tutorials wie bei Bascom für LCDs,....&lt;br /&gt;
* C-Control 2 Tutorial&lt;br /&gt;
* PIC16F... Programmierung mit dem Go Embedded Pascal-Compiler&lt;br /&gt;
* PIC18F... Einführung&lt;br /&gt;
&lt;br /&gt;
'''Hardware'''&lt;br /&gt;
* CNY70&lt;br /&gt;
* CNY70 als Liniensensor (analoge / digitale Auswertung)&lt;br /&gt;
* Serielles AVR-ISP Programmierkabel&lt;br /&gt;
* USB-ISP Programmieradaper&lt;br /&gt;
* Schnittstellen Übersicht (Es sollten alle gängigen Schnittstellen mit Vorteilen, Nachteilen etc. aufgelistet werden, damit man für jede zu bewältigende Aufgabe die am besten geeignete Schnittstelle wählen kann)&lt;br /&gt;
* JTAG mit AVRs&lt;br /&gt;
* Shift-/Schieberegister&lt;br /&gt;
* Sensorschaltung Windrichtung&lt;br /&gt;
* Sensorschaltung Luftfeuchte&lt;br /&gt;
* Schaltungssicherheitsvorkehrungen (wenns nicht nur auf dem Basteltisch funktionieren soll)&lt;br /&gt;
** ESD-Sicherheit&lt;br /&gt;
*** ESD-konformes Routing&lt;br /&gt;
*** ESD-Bauteile (Supressor Dioden, etc.)&lt;br /&gt;
*** Abschirmung bei Leitungen, Gehäuseauswahl, etc.&lt;br /&gt;
** Kurzschlusssicherheit&lt;br /&gt;
** Verpolungsschutz&lt;br /&gt;
** Überspannungsschutz&lt;br /&gt;
* Kondensator mit Beispielschaltungen&lt;br /&gt;
* Bluetooth Support (senden/empfangen) nach dem Vorbild des Lego NXT&lt;br /&gt;
* Microcontroller Entwicklungsboards&lt;br /&gt;
* Quarz-Bausteine: Funktionsprinzip und Beispielschaltungen (fehlt bisher komplett)&lt;br /&gt;
&lt;br /&gt;
==Folgende erscheinen noch unvollständig und sollten von Usern die in dem Bereich kundig sind, ergänzt werden==&lt;br /&gt;
Findet man jetzt durch folgenden Link: [[:Kategorie:Artikelausbau]]&lt;br /&gt;
Artikel die unvollständig sind sollte man jetzt also nicht mehr hier aufgelistet werden, sondern die Artikel sollten am unteren Ende durch folgendes Kommando ergänzen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
  {{Ausbauwunsch|Mehr Grundlagen und vor allem Programmbeispiele etc.}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Artikel wird dann ein Hinweis eingeblendet, ähnlich wie diesem:&lt;br /&gt;
&lt;br /&gt;
[[Bild:artikelausbau.gif]]&lt;br /&gt;
&lt;br /&gt;
Also hier klicken um ausbaufähige Artikel zu finden:&lt;br /&gt;
* [[:Kategorie:Artikelausbau]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Hier noch ein paar Artikel wo der Hinweis noch nicht drin steht:&lt;br /&gt;
&lt;br /&gt;
* [[GNU Assembler|AVR Assembler (GNU) Einführung]]:&lt;br /&gt;
* [[Zahnrad]]&lt;br /&gt;
* [[Flipflop]]&lt;br /&gt;
* [[C-Tutorial]] &lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
* [[Transistor]] (noch ein paar Bilder und vielleicht Grundschaltungen mit Beschreibung wären toll&lt;br /&gt;
* [[Avr-gcc|Dokumentation zu avr-gcc]]&lt;br /&gt;
* [[Arm]] Microcontroller&lt;br /&gt;
* [[GPS]] - Aufbau und Anwendung&lt;br /&gt;
* [[SPI]] - Vielleicht noch Beispiele&lt;br /&gt;
* [[Portexpander am AVR]] könnte nen BASCOM-Teil vertragen&lt;br /&gt;
* [[Manchester- Codierung]] - noch ein Programmbeispiel wäre toll&lt;br /&gt;
* [[JTAG]]&lt;br /&gt;
&lt;br /&gt;
== Bereits erfüllte Wünsche ==&lt;br /&gt;
* stellenanzeigen-forum -&amp;gt;Gibt es bereits hier http://www.roboternetz.de/phpBB2/viewforum.php?f=29&lt;br /&gt;
* Filter (Hardware/Software) -&amp;gt; Wurde hier angelegt [[Filter (Elektronik)]]&lt;br /&gt;
* [[Roboterwettbewerbe]]&lt;br /&gt;
* Motortreiber (Einsteigerguide) -&amp;gt; [[Getriebemotoren Ansteuerung]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:RN-Wissen]]&lt;/div&gt;</summary>
		<author><name>RobotProgger</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Wunschthemen&amp;diff=13351</id>
		<title>Wunschthemen</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Wunschthemen&amp;diff=13351"/>
				<updated>2008-03-30T17:07:10Z</updated>
		
		<summary type="html">&lt;p&gt;RobotProgger: /* Meine Wunschthemen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite kann '''jeder''' Themen nennen, die er sich in diesem Wiki wünschen würde. Die Seite dient Usern, die gerne was schreiben möchten, als Anregung. Hat jemand ein entsprechendes Thema erstellt, kann er es auch aus dieser Liste wieder streichen. &lt;br /&gt;
&lt;br /&gt;
==Meine Wunschthemen==&lt;br /&gt;
&lt;br /&gt;
'''Allgemeines'''&lt;br /&gt;
* Spracherkennung&lt;br /&gt;
* [[Schaltung AVR-Digitizer]] um Videobild mit AVR zu digitalisieren und auszuwerten oder per Funk zu übertragen&lt;br /&gt;
* Ausführliche Bedienhinweise für Euroflex-Saugroboter Monster Intelligente F1&lt;br /&gt;
* Künstliche Neuronale Netze&lt;br /&gt;
* Roboter-Filme&lt;br /&gt;
* [[Formula Flowcode Buggy]]&lt;br /&gt;
* Wie ist eine Grundschaltung für einen Roboter aufgebaut, dh. wie werden Motoren mit AVR's angesteuert, wie Sensoren ausgelesen?&lt;br /&gt;
&lt;br /&gt;
'''Programmierung'''&lt;br /&gt;
* Enwickeln eines universellen Programms, das ein Programmablaufdiagram (PDA) direkt in ausführbaren Code für ein bestimmter Prozessor (Maschinensprache) wandelt&lt;br /&gt;
* [[Network_Controller/PC_Praxis#Network_Controller.2FPC_RS232_mit_Windows|Ansprechen der RS232 Schnittstelle mit gängigen Programmiersprachen]]&lt;br /&gt;
* Pda und PPC steuerung über CF und MMC slot&lt;br /&gt;
* [[GCC]] Einführung mit Beispielen (welche Beispiele? Benutzung von GCC? (Optionen, ...)?, Programmbeispiele (also [[C-Tutorial]])?), für spezielle Maschinen oder Derivate? ANSI-C? Was fehlt in den [[:Kategorie:Quellcode C|C-Beispielen]]?)&lt;br /&gt;
* Mehr C Tutorials wie bei Bascom für LCDs,....&lt;br /&gt;
* C-Control 2 Tutorial&lt;br /&gt;
* PIC16F... Programmierung mit dem Go Embedded Pascal-Compiler&lt;br /&gt;
* PIC18F... Einführung&lt;br /&gt;
&lt;br /&gt;
'''Hardware'''&lt;br /&gt;
* CNY70&lt;br /&gt;
* CNY70 als Liniensensor (analoge / digitale Auswertung)&lt;br /&gt;
* Serielles AVR-ISP Programmierkabel&lt;br /&gt;
* USB-ISP Programmieradaper&lt;br /&gt;
* Schnittstellen Übersicht (Es sollten alle gängigen Schnittstellen mit Vorteilen, Nachteilen etc. aufgelistet werden, damit man für jede zu bewältigende Aufgabe die am besten geeignete Schnittstelle wählen kann)&lt;br /&gt;
* JTAG mit AVRs&lt;br /&gt;
* Shift-/Schieberegister&lt;br /&gt;
* Sensorschaltung Windrichtung&lt;br /&gt;
* Sensorschaltung Luftfeuchte&lt;br /&gt;
* Schaltungssicherheitsvorkehrungen (wenns nicht nur auf dem Basteltisch funktionieren soll)&lt;br /&gt;
** ESD-Sicherheit&lt;br /&gt;
*** ESD-konformes Routing&lt;br /&gt;
*** ESD-Bauteile (Supressor Dioden, etc.)&lt;br /&gt;
*** Abschirmung bei Leitungen, Gehäuseauswahl, etc.&lt;br /&gt;
** Kurzschlusssicherheit&lt;br /&gt;
** Verpolungsschutz&lt;br /&gt;
** Überspannungsschutz&lt;br /&gt;
* Kondensator mit Beispielschaltungen&lt;br /&gt;
* Bluetooth Support (senden/empfangen) nach dem Vorbild des Lego NXT&lt;br /&gt;
* Microcontroller Entwicklungsboards&lt;br /&gt;
* Quarz-Bausteine: Funktionsprinzip und Beispielschaltungen (fehlt bisher komplett)&lt;br /&gt;
&lt;br /&gt;
==Folgende erscheinen noch unvollständig und sollten von Usern die in dem Bereich kundig sind, ergänzt werden==&lt;br /&gt;
Findet man jetzt durch folgenden Link: [[:Kategorie:Artikelausbau]]&lt;br /&gt;
Artikel die unvollständig sind sollte man jetzt also nicht mehr hier aufgelistet werden, sondern die Artikel sollten am unteren Ende durch folgendes Kommando ergänzen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
  {{Ausbauwunsch|Mehr Grundlagen und vor allem Programmbeispiele etc.}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Artikel wird dann ein Hinweis eingeblendet, ähnlich wie diesem:&lt;br /&gt;
&lt;br /&gt;
[[Bild:artikelausbau.gif]]&lt;br /&gt;
&lt;br /&gt;
Also hier klicken um ausbaufähige Artikel zu finden:&lt;br /&gt;
* [[:Kategorie:Artikelausbau]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Hier noch ein paar Artikel wo der Hinweis noch nicht drin steht:&lt;br /&gt;
&lt;br /&gt;
* [[GNU Assembler|AVR Assembler (GNU) Einführung]]:&lt;br /&gt;
* [[Zahnrad]]&lt;br /&gt;
* [[Flipflop]]&lt;br /&gt;
* [[C-Tutorial]] &lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
* [[Transistor]] (noch ein paar Bilder und vielleicht Grundschaltungen mit Beschreibung wären toll&lt;br /&gt;
* [[Avr-gcc|Dokumentation zu avr-gcc]]&lt;br /&gt;
* [[Arm]] Microcontroller&lt;br /&gt;
* [[GPS]] - Aufbau und Anwendung&lt;br /&gt;
* [[SPI]] - Vielleicht noch Beispiele&lt;br /&gt;
* [[Portexpander am AVR]] könnte nen BASCOM-Teil vertragen&lt;br /&gt;
* [[Manchester- Codierung]] - noch ein Programmbeispiel wäre toll&lt;br /&gt;
* [[JTAG]]&lt;br /&gt;
&lt;br /&gt;
== Bereits erfüllte Wünsche ==&lt;br /&gt;
* stellenanzeigen-forum -&amp;gt;Gibt es bereits hier http://www.roboternetz.de/phpBB2/viewforum.php?f=29&lt;br /&gt;
* Filter (Hardware/Software) -&amp;gt; Wurde hier angelegt [[Filter (Elektronik)]]&lt;br /&gt;
* [[Roboterwettbewerbe]]&lt;br /&gt;
* Motortreiber (Einsteigerguide) -&amp;gt; [[Getriebemotoren Ansteuerung]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:RN-Wissen]]&lt;/div&gt;</summary>
		<author><name>RobotProgger</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Benutzer:RobotProgger&amp;diff=13350</id>
		<title>Benutzer:RobotProgger</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Benutzer:RobotProgger&amp;diff=13350"/>
				<updated>2008-03-30T17:04:17Z</updated>
		
		<summary type="html">&lt;p&gt;RobotProgger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Whats that? Ich bin ich, was denn sonst?&lt;br /&gt;
Ich bin 16 Jahre alt und beschäftige mich noch nicht lange mit Robotern, bin aber schon länger mit Elektronic am Werkeln&lt;br /&gt;
Nebenbei beschäftige ich mich noch mit Webdesign und Programmierung, sowohl von Windowsanwendungen als auch von Skripten für Homepages. So plane ich im Moment eine Community für Computerspieler, bei der ich das System komplett selbst programmiere. Im Moment beschäftige ich mich auch noch mit einer Tauschcommunity für Spielstände von PC-Spielen, die aber nicht so recht viele User anzieht.&lt;br /&gt;
&lt;br /&gt;
Money, Money, immer das gleiche. Wenn es mal Geld regnen würde würde ich einen Quadrocopter bauen (so ca. €150-€200!) aber ich glaube ich muss mich mit einem kleinen primitiven Roboter begnügen, den ich in Planung habe&lt;/div&gt;</summary>
		<author><name>RobotProgger</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Benutzer:RobotProgger&amp;diff=13349</id>
		<title>Benutzer:RobotProgger</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Benutzer:RobotProgger&amp;diff=13349"/>
				<updated>2008-03-30T16:59:04Z</updated>
		
		<summary type="html">&lt;p&gt;RobotProgger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Whats that? Ich bin ich, was denn sonst?&lt;br /&gt;
Ich bin 16 Jahre alt und beschäftige mich noch nicht lange mit Robotern, bin aber schon länger mit Elektronic am Werkeln&lt;/div&gt;</summary>
		<author><name>RobotProgger</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Testseite&amp;diff=13348</id>
		<title>Testseite</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Testseite&amp;diff=13348"/>
				<updated>2008-03-30T16:57:29Z</updated>
		
		<summary type="html">&lt;p&gt;RobotProgger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Testseite =&lt;br /&gt;
&lt;br /&gt;
== Passive Bauteile ==&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
110^{-6}F&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hier komme ich ==&lt;br /&gt;
Das will ich auch mal ausprobieren.&lt;br /&gt;
&lt;br /&gt;
== da der rest ==&lt;br /&gt;
&lt;br /&gt;
[[:Kategorie:Microcontroller]]&lt;br /&gt;
&lt;br /&gt;
Hier kann man ein wenig experimentieren wie was geht! Einfach auf bearbeiten klicken und schreiben!&lt;br /&gt;
Wieso ist das jetzt in so einem Kästchen?&lt;br /&gt;
Eine neue Zeile im Haupttext.&lt;br /&gt;
So strukturiert man Seiten: &lt;br /&gt;
 Bla ??? blablabla&lt;br /&gt;
 Test1234&lt;br /&gt;
 Das geht ja gut!!!&lt;br /&gt;
&lt;br /&gt;
==Formeln==&lt;br /&gt;
&amp;lt;math&amp;gt; f(x)=x \cdot b^x &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{k=0}^\infty \frac {(-1)^k \cdot x^{2k}}{(2k)!} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{k=0}^3 \frac {(-1)^k \cdot x^{2k}}{(2k)!} = 1-\frac{1}{2}\cdot x^2 +\frac{1}{24}\cdot x^4-\frac{1}{720}\cdot x^4&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
 U_\mathrm{m} = U_\mathrm{ein} \cdot  \frac{t_\mathrm{ein}}{t_\mathrm{ein} + t_\mathrm{aus}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Neuer Abschnitt ==&lt;br /&gt;
bla bla bla ...&lt;br /&gt;
&lt;br /&gt;
=== Unterabschnitt ===&lt;br /&gt;
bla bla bla ...&lt;br /&gt;
==== Unter-Unterabschnitt ====&lt;br /&gt;
[[Bild:AtmelController.jpg|thumb|Bildunterzeile für Beschreibung]]&lt;br /&gt;
bla bla bla ...&lt;br /&gt;
* Aufzählung&lt;br /&gt;
* Aufzählung&lt;br /&gt;
* Aufzählung&lt;br /&gt;
* Aufzählung&lt;br /&gt;
&lt;br /&gt;
# Aufzählung &amp;lt;ref name=&amp;quot;rrr&amp;quot;&amp;gt; aaa [xxxx yyy] &amp;lt;/ref&amp;gt;&lt;br /&gt;
# Aufzählung&lt;br /&gt;
# Aufzählung&lt;br /&gt;
# Aufzählung&lt;br /&gt;
&lt;br /&gt;
== Ab hier Testbereich zum ausprobieren - kann ruhig verschandelt werden!!!==&lt;br /&gt;
&lt;br /&gt;
===Formatierprobleme===&lt;br /&gt;
&lt;br /&gt;
;Quellcode I:&lt;br /&gt;
:&amp;lt;pre&amp;gt;Zeile 1&lt;br /&gt;
Zeile2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{| {{Blauetabelle}}&lt;br /&gt;
|+ ohne center&lt;br /&gt;
|-&lt;br /&gt;
| a || b&lt;br /&gt;
|-&lt;br /&gt;
| aaaaaa || bbbbb&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{| {{Blauetabelle}} style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
|+ mit center&lt;br /&gt;
|-&lt;br /&gt;
| a || b&lt;br /&gt;
|-&lt;br /&gt;
| aaaaaa || bbbbb&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
{| style=&amp;quot;text-align:center;&amp;quot; {{Blauetabelle}} &lt;br /&gt;
|+ mit center&lt;br /&gt;
|-&lt;br /&gt;
| a || b&lt;br /&gt;
|-&lt;br /&gt;
| aaaaaa || bbbbb&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formel ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;E=mc^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
http://images.allposters.com/images/GDF/Z1735D.jpg&lt;br /&gt;
&lt;br /&gt;
==Vorlage==&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
U(t) \,=\, U_0 \cdot e^{-\frac{t}{RC}}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Test|aaa|bbb}}&lt;br /&gt;
&lt;br /&gt;
== Teste hier auch mal :-) ==&lt;br /&gt;
&amp;lt;math&amp;gt;\Downarrow\Uparrow&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hat du kopp wie Sieb mutdu aufschreiben ==&lt;br /&gt;
---------------------------&lt;br /&gt;
&lt;br /&gt;
Interrupts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Struktur:&lt;br /&gt;
&lt;br /&gt;
 Config InterruptXXX  		‘Konfiguriere Interrupt&lt;br /&gt;
 Enable Interrupts		‘generell Interrupts zulassen&lt;br /&gt;
 Enable  InterruptXXX		‘schalte speziell den InterruptXXX ein&lt;br /&gt;
 On  InterruptXXX   SprungXXX	‘verzweige bei InterruptXXX zu SprungXXX&lt;br /&gt;
 &lt;br /&gt;
 Do&lt;br /&gt;
 ....Hauptprogramm		‘Hauptprogramm&lt;br /&gt;
 Loop&lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
 SprungXXX:			‘Unterprogramm von InterruptXXX&lt;br /&gt;
 ....Ausführung			‘arbeitet hier etwas ab und springt mit Return &lt;br /&gt;
 Return				‚ wieder zurück, zum Hauptprogramm&lt;br /&gt;
=== xxx ===&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\overline{u} \vee \overline{v} = \overline{u \wedge v}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar{u}_1 \wedge \bar{u}_2 \wedge \cdots \wedge \bar{u}_n  &lt;br /&gt;
= \overline{u_1 \vee u_2 \vee \cdots \vee u_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\neg u_1 \wedge \neg u_2 \wedge \cdots \wedge \neg u_n  &lt;br /&gt;
= \neg (u_1 \vee u_2 \vee \cdots \vee u_n)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar{u} \vee u = 1&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\bar{u} \wedge u = 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\bar{A_1} = \overline{A}_1 = \overline{A_1}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\uparrow a&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;\Downarrow \Uparrow&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Jetzt will ich das ganze auch mal testen! ==&lt;br /&gt;
Test '''Test''' ''Test'' '''''Test'''''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a² = b² + c²&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;    &amp;lt;!-- warum geht das mit den ² dingern nich!?! --&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;a=b+c&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;           &amp;lt;!-- ahh so gehts --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a^2=b^2+c^2&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt; &lt;br /&gt;
*Dies könnte eine Aufzählung sein&lt;br /&gt;
**und dies einer der Inhalte&lt;br /&gt;
**dies auch&lt;br /&gt;
***und noch ein inhalt von &amp;quot;dies auch&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 nun will ich&lt;br /&gt;
 auch einmal versuchen&lt;br /&gt;
 ein quelltextfenster&lt;br /&gt;
 darzustellen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
{{FarbigerRahmen|&lt;br /&gt;
Wichtiger Text wird in der Mitte geschrieben&amp;lt;br/&amp;gt;&lt;br /&gt;
und zusätzlich ROT umrahmt!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== NAND GATTER ===&lt;br /&gt;
&amp;lt;math&amp;gt; x=a \overline { acb } b&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== NOR GATTER ===&lt;br /&gt;
&amp;lt;math&amp;gt; x=a \overline { v } b&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Elayne|Elayne]] 16:20, 27. Dez 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Getiebe ==&lt;br /&gt;
&lt;br /&gt;
=== Achsabstände ===&lt;br /&gt;
Das größte Problem bei selbstgebauten Getrieben ist die Bestimmung&lt;br /&gt;
der Achsabstände. &amp;lt;br&amp;gt;&lt;br /&gt;
Zu weite Abstände verursachen zum einen Schäden an den Zahnrädern &amp;lt;br&amp;gt;&lt;br /&gt;
und zu kurze Abstände sorgen dafür, dass sich das Getriebe,&amp;lt;br&amp;gt; &lt;br /&gt;
wenn überhaupt, nicht drehen lässt und auch schneller verschleißen kann.&lt;br /&gt;
&lt;br /&gt;
Ein wichtiger Parameter, welcher zur Berechnung der Achsabstände benötigt wird,&amp;lt;br&amp;gt;&lt;br /&gt;
ist die Modulgröße oder auch Modulzahl genannt.&lt;br /&gt;
&lt;br /&gt;
Für Zahnräder mit unbekannter Modulgröße gibt es Zahnradlehren,&lt;br /&gt;
welche das ermitteln des Modul's erleichtert ohne raten zu müssen&lt;br /&gt;
&lt;br /&gt;
Der Abstand der Zahnradachsen lässt sich wie folgend ermitteln:&lt;br /&gt;
&lt;br /&gt;
   Anzahl der beiden Zahnradzähne (welche ineiandergreifen) zusammenzählen,&lt;br /&gt;
   davon dann die Hälfte mit der Modulzahl multiplizieren.&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
&lt;br /&gt;
;Quelle1: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah &lt;br /&gt;
:{|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ghdjs gdjs dgjs &lt;br /&gt;
   dgsjdghsj&lt;br /&gt;
   dgsdhgjs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Quelle2 und Quelle3: blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah &lt;br /&gt;
:{|&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| '''Quelle2'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ghdjs gdjs dgjs &lt;br /&gt;
   dgsjdghsj&lt;br /&gt;
   dgsdhgjs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
| &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;lt;!-- space --&amp;gt;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| '''Quelle3'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ghdjs gdjs dgjs &lt;br /&gt;
   dgsjdghsj&lt;br /&gt;
   dgsdhgjs&lt;br /&gt;
ghdjs gdjs dgjs &lt;br /&gt;
   dgsjdghsjjavascript:insertTags('\'\'\'','\'\'\'','Fetter Text');&lt;br /&gt;
Fetter Text&lt;br /&gt;
   dgsdhgjs&lt;br /&gt;
ghdjs gdjs dgjs &lt;br /&gt;
   dgsjdghsj&lt;br /&gt;
   dgsdhgjs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Sudoku==&lt;br /&gt;
&lt;br /&gt;
[[Bild:sodoku.gif|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bildergallery ganz einfach anlegen==&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:kaercherrobot.jpg&lt;br /&gt;
Image:siemensvsr8000unten.jpg|Siemens von unten&lt;br /&gt;
Image:siemensvsr8000buerste.jpg&lt;br /&gt;
Image:siemensvsr8000basis.jpg|Die Basisstation&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Test]]&lt;br /&gt;
&lt;br /&gt;
[[Media:Beispiel.mp3]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
darf ich auch mal, ja? Gut:&lt;br /&gt;
L'''o'''r''e''m ipsum dolor sit amet.......&lt;/div&gt;</summary>
		<author><name>RobotProgger</name></author>	</entry>

	</feed>