Im unteren C-Code steht der eigentliche Code und im oberen meine
Vermutungen. Da wollte ich nur wissen ob das so stimmt.
Hätte noch eine Frage was machen die Punkte
void uart_puts (char *s,...)
Warum meint eigentlich jeder Hansel, man könnte Programmieren einfach
durch kopieren von Beispielen aus dem Netz lernen?!?
Es gibt viele Tutorial im Netz, die die C Schritt für Schritt erklären.
Besser noch du kaufst dir ein Buch.
Wieso müssen immer bestimmte Hansel hier im Forum blöde Kommentare
abgeben.
Um es für dich noch einmal ausführlich zu erklären. Ich versuche ja die
Bsp. nachzuvollziehen, was genau gemacht wird. Aber auf so ein Bsp. mit
Pointern wäre ich einfach nicht gekommen.
> Aber auf so ein Bsp. mit Pointern wäre ich einfach nicht gekommen.
Das brauchst du gar nicht. Und es ist auch nicht irgendwie "neu".
Das steht Jahrzehnten im Standardwerk für C:
"Programmieren in C" von Kernighan&Ritchie
Brauchbar geschrieben und immer noch lesens- und verstehenswert...
programmierer schrieb:
> @Lothar Miller>> Mir ist unklar was das eine mit dem anderen zu tun hat.
Der Zusammenhang kommt daher, das all das was dir als der große
'Pointerhack' in diesem Beispiel vorkommt, eigentlich harmloses
Pointer-Geplänkel in C ist, wie es jeder angehende C Programmierer in
seinem C-Standardwerk im Kapitel 8, "Stringbearbeitung", lernt.
Deine Fragen sind allesamt von der Natur, dass man sagen muss: Sie
werden alle in jedem noch so grindigen C-Buch erklärt und dort wird auch
ziemlich ausführlich auf die jeweilige Thematik eingegangen. OK,
variadische Funktionen (die mit einem ... in der Argumentliste) kommen
in den Büchern üblicherweise erst irgendwo im letzten Drittel, aber sie
kommen vor.
Die logische Schlussfolgerung:
Du benutzt kein Buch
Dazu kann man nur sagen: Benutze Literatur. Eine Programmiersprache wie
C, kann man ohne vernünftige Literatur nicht lernen. Vergiss dieses
ganze Online, Web, Foren Geplänken. Die meisten sog. Online Tutorials
kannst du in der Pfeife rauchen. Die erzählen dir nämlich die Hälfte
dessen nicht, was wissenswert wäre. Das kommt daher, dass zwar viele ein
Tutorial mit sehr viel Enthusiasmus anfangen, aber irgendwann merken,
dass das eine Heidenarbeit ist. Ein gutes C-Buch hat locker einen Umfang
von ca. 200 Seiten. Wie soll da ein Tutorial mit 15 oder 20 Web-Siten
dieselbe Information vermitteln?
Natürlich gibt es auch gute Online-Tutorien. Aber sie haben gegen ein
Buch trotzdem keine Chance. In ein Buch kann man sich Notizen machen,
STellen anstreichen, mit Einlageblättern kleine Romane an den
entsprechenden STellen einfügen. Ein Buch kann man aufgeschlagen neben
dem Monitor liegen habe und und bei Bedarf zur Hand nehmen und nachlesen
ohne dass man seinen eigenen Sourcecode (zb zum Vergleichen) vom
Bildschirm verbannen muss.
Ich gebe es auf.
Ich wollte keine Erklärung wie Pointer funktionieren ich habe nur
gefragt ob es richtig ist wie ich das mit den Pointern verstanden habe.
> void uart_puts (char *s) /*Hier zeige ich auf die Adresse bzw.> ersten Buchstaben von Hallo Welt*/
s enthält die Adresse des ersten Zeichens, ab dem ausgegeben werden
soll. Ob das der erste Buchstabe des Textes ist oder nicht, kann
uart_puts nicht feststellen. Für uart_puts gilt einfach nur die
Konvention: Ab diesem Zeichen wird ausgegeben. Und zwar so lange, wie im
Text Zeichen enthalten sind, die nicht '\0' sind. Den '\0' kennzeichnet
das Ende eines Textes.
> while (*s) /*hier steht nicht *s != '\0', wie wird das erkannt*/
In C kann jeder Ausdruck als logischer Ausdruck verwendet werden.
Es gilt dann: 0 ist gleichzusetzen mit FALSE, alles andere ist TRUE.
Solange also das Zeichen, das sich an der Stelle s befindet nicht 0 ist
(denn 0 gilt ja als FALSE), läuft die Schleife.
Und jetzt ist es natürlich ganz besonders praktisch, dass jeder Text in
C mit einem '\0' Zeichen abgeschlossen wird. Den '\0' hat den Code 0 und
der gilt bei der Abfrage damit automatisch zu FALSE.
Anders als in anderen Sprachen, bei denen in einem if, while, etc eine
Bedingung gefordert wird, gilt in C
while( Ausdruck )
C kümmert sich nicht darum, wie dieser Ausdruck aufgebaut ist. Es geht
nur darum, welchen Wert man erhält, wenn dieser Ausdruck ausgewertet
wird. Ergibt der Ausdruck 0, dann ist das FALSE. Ergibt der AUsdruck
etwas anderes als 0, dann ist das TRUE.
Die logische Schlussfolgerung:
Auch ein Vergleich ist nichts anderes als ein Ausdruck, der einen Wert
liefert.
i == j
ist ein arithmetischer Ausdruck, der 0 liefert wenn i ungleich j ist und
der 1 liefert, wenn beide gleich sind.
Du kannst in C ohne weiteres schreiben
k = ( i == j ) * 5;
wenn i gleich j ist, dann erhält k den Wert 5. Sind sie ungleich, dann
erhält k den Wert 0.
> uart_putc(*s); /*hier wird der erste Buchstabe von Hallo Welt> an uart_putc überwiesen*/
Nein. Hier wird das Zeichen an uart_putc übergeben, welches sich ergibt
wenn man an der Stelle s im Speicher nachsieht. (s enthält die Adresse
des Zeichens oder man sagt auch: s zeigt auf das Zeichen)
> void uart_puts (char *s) /*Hier zeige ich auf die Adresse bzw. ersten >
Buchstaben von Hallo Welt*/
Falsch. Die Zeile meckert der Compiler mit Syntaxfehler an. Es fehlt das
abschliessende ; bei der Deklaraktion des Funktionsprototyps.
> while (*s) /*hier steht nicht *s != '\0', wie wird das erkannt*/
C-Buch lesen. Ausdrücke habe einen Wert. Der Wert wird hier benutzt.
> uart_putc(*s); /*hier wird der erste Buchstabe von Hallo Welt an uart_putc
überwiesen*/
Richtig,
> uart_puts("Hall Welt");
Falsch. Die Zeile meckert der Compiler mit Syntaxfehler an. Der
Funktionsaufruf steht ausserhalb einer Funktion.
>int uart_putc(unsigned char c)>{> while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */> {> }>> UDR = c; /* sende Zeichen */> return 0;>}
Richtig.
>/* puts ist unabhaengig vom Controllertyp */>void uart_puts (char *s)>{> while (*s)> { /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */> uart_putc(*s);> s++;> }>}
Richtig.
>> ich habe nur gefragt ob es richtig ist wie ich das mit den Pointern>> verstanden habe.
Das hast Du eben nicht gefragt:
>> /*hier steht nicht *s != '\0', wie wird das erkannt*/
Ein freundlicher Hinweis von Karlheinz auf die Benutzung eines Buches
und lernen der Grundlagen wird mit Papmpigkeit belohnt, ich würd' sagen
Du hast die Auffassungsgabe einer Dose Kekse, gehe nicht über Los und
ziehe auch keine 1000 Euro ein :D
Achja, solltest Du meinen, wie wird erkannt daß der String zu Ende ist:
*s wird dereferenziert, und da in C alles <> 0 = True ist, ist natürlich
0 = False, damit wird dann das while beendet.
> void uart_puts (char *s) /*Hier zeige ich auf die Adresse bzw.> ersten Buchstaben von Hallo Welt*/>uart_puts("Hallo Welt");>s enthält die Adresse des ersten Zeichens, ab dem ausgegeben werden>soll. Ob das der erste Buchstabe des Textes ist oder nicht, kann>uart_puts nicht feststellen. Für uart_puts gilt einfach nur die>Konvention: Ab diesem Zeichen wird ausgegeben. Und zwar so lange, wie im>Text Zeichen enthalten sind, die nicht '\0' sind. Den '\0' kennzeichnet>das Ende eines Textes.
Beim ersten Durchlauf davon bin ich ja ausgegangen, habe ich mit *s das
'H'.
=>s= Adresse; *s=Inhalt der Adresse=> 'H'
> while (*s) /*hier steht nicht *s != '\0', wie wird das erkannt*/
Dass '\0' == NUL in der Ascii-Tabelle ist, gebe ich zu, wußte ich nicht.
>> void uart_puts (char *s) /*Hier zeige ich auf die Adresse bzw. ersten >>Buchstaben von Hallo Welt*/>>Falsch. Die Zeile meckert der Compiler mit Syntaxfehler an. Es fehlt das>abschliessende ; bei der Deklaraktion des Funktionsprototyps.
1
voiduart_puts(char*s)
2
{
3
//Inhalt
4
}
Ist eine Funktion, fehlt kein ;
Danke.
p.s. Dass ich '\0'==NUL nicht wußte => Entschuldigung. Man kann darauf
aufmerksam machen man kann aber auch sagen nimm ein Buch und lerne C.
>Du hast die Auffassungsgabe einer Dose Kekse, gehe nicht über Los und>ziehe auch keine 1000 Euro ein :D
Ich habe mich für meine Unhöflichkeit entschuldigt aber in diesem Forum
durch solche Aussagen platz einem mal der Kragen.
Man kann x Zeichen schreiben aber der Inhalt besteht nur aus unnötigen
Aussagen
>> while (*s) /*hier steht nicht *s != '\0', wie wird das erkannt*/>> Dass '\0' == NUL in der Ascii-Tabelle ist, gebe ich zu, wußte ich> nicht.
Was für eine ASCII-Tabelle? '\0' entspricht in C dem Wert 0. Was ASCII
dazu sagt, ist C eigentlich relativ egal.