Forum: Compiler & IDEs Zeichenkette senden


von programmierer (Gast)


Lesenswert?

Hallo,

ich will gerne eine Zeichenkette über Uart schicken. Zum Bsp. Programm 
hätte ich paar Fragen was welche Zeile macht.
1
void uart_puts (char *s) /*Hier zeige ich auf die Adresse bzw. ersten   Buchstaben von Hallo Welt*/
2
3
while (*s)  /*hier steht nicht *s != '\0', wie wird das erkannt*/
4
5
uart_putc(*s);  /*hier wird der erste Buchstabe von Hallo Welt an uart_putc überwiesen*/
1
uart_puts("Hall Welt");
2
3
int uart_putc(unsigned char c)
4
{
5
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
6
    {
7
    }                             
8
 
9
    UDR = c;                      /* sende Zeichen */
10
    return 0;
11
}
12
 
13
 
14
/* puts ist unabhaengig vom Controllertyp */
15
void uart_puts (char *s)
16
{
17
    while (*s)
18
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
19
        uart_putc(*s);
20
        s++;
21
    }
22
}

MfG

von MeinerEiner (Gast)


Lesenswert?

Welche Zeilen genau? Steht doch eigentlich eh schon dahinter.

von programmierer (Gast)


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,...)

von Klaus (Gast)


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.

von programmierer (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

von programmierer (Gast)


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.

von Karl H. (kbuchegg)


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.

von programmierer (Gast)


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.

von Karl H. (kbuchegg)


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)

von Stefan B. (stefan) Benutzerseite


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.

von MWS (Gast)


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.

von programmierer (Gast)


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.

1
void uart_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

von Rolf Magnus (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.