www.mikrocontroller.net

Forum: Compiler & IDEs Zeichenkette senden


Autor: programmierer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich will gerne eine Zeichenkette über Uart schicken. Zum Bsp. Programm 
hätte ich paar Fragen was welche Zeile macht.
void uart_puts (char *s) /*Hier zeige ich auf die Adresse bzw. ersten   Buchstaben von Hallo Welt*/

while (*s)  /*hier steht nicht *s != '\0', wie wird das erkannt*/

uart_putc(*s);  /*hier wird der erste Buchstabe von Hallo Welt an uart_putc überwiesen*/

uart_puts("Hall Welt");

int uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
    {
    }                             
 
    UDR = c;                      /* sende Zeichen */
    return 0;
}
 
 
/* 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++;
    }
}

MfG

Autor: MeinerEiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Zeilen genau? Steht doch eigentlich eh schon dahinter.

Autor: programmierer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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,...)

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: programmierer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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...

Autor: programmierer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: programmierer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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)

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> 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.

Autor: programmierer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

void uart_puts (char *s)
{
  //Inhalt
}

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> 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 schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.