Gast
#1505143
Hallo, ich will gerne eine Zeichenkette über Uart schicken. Zum Bsp. Programm hätte ich paar Fragen was welche Zeile macht.
1 | |
2 | |
3 | |
4 | |
5 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
MfG
|
Anzeige
|
Zeichenkette senden
Gast
#1505143
Hallo, ich will gerne eine Zeichenkette über Uart schicken. Zum Bsp. Programm hätte ich paar Fragen was welche Zeile macht.
MfG
Gast
#1505147
Welche Zeilen genau? Steht doch eigentlich eh schon dahinter.
Gast
#1505171
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,...)
Gast
#1505184
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.
Gast
#1505201
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...
Gast
#1506840
@Lothar Miller Mir ist unklar was das eine mit dem anderen zu tun hat. Ich wollte nur wissen ob es richtig ist, so wie ich das Bsp verstanden habe. 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.
Gast
#1507296
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.
Gast
#1507333
>> 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.
Gast
#1507369
> 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.
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
Gast
#1507418
>> 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. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|