Hallo zusammen, kürzlich habe ich im Forum einen Link auf diese Seite hier gefunden. https://www.xennis.org/wiki/AVR-GCC_-_UART Die Routine möchte ich gerne in einem Projekt benutzen, um Zeichen seriell auszugeben. In den Dateien auf der Seite werden aber offensichtlich Pointer verwendet, das möchte ich gerne umgehen (kenne mich mit Pointern nicht aus). Kann man die Pointer irgendwie durch normale Variablen ersetzten?
"char *s" ist ein Zeiger auf eine Zeichenkette. Das ist die übliche Methode, Zeichenketten an Funktionen zu übergeben. Alle C Funktionen aus der Standard Bibliothek machen es ebenso. Also lerne das besser, sonst kommst du mit C nicht weit.
Es gibt zahllose Codebeispiele mit UART. Nimm doch einfach einen passenden. z.B. hier aus dem Forum: https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART
berndF schrieb: > In den Dateien auf der Seite werden aber offensichtlich Pointer > verwendet, ... Das ist an dieser Stelle auch das einzig sinnvolle. Stell Dir vor, Du hast einen String (sprich: Array of char). Du möchstest diesen in einer Funktion verwenden, wie willst Du den String der Funktion übergeben, wenn nicht durch einen Zeiger auf den String? Zeichen für Zeichen kopieren? Sehr uneffektiv...
berndF schrieb: > Kann man die Pointer irgendwie durch normale Variablen ersetzten? Nicht wirklich, denn um Daten an Funktionen zu übergeben verwendet man entweder CPU Register oder Stapelspeicher. In beiden Fällen müsste man (ohne Zeiger) die ganze Zeichenkette kopieren. Das kommt wegen dem knappen Speicherplatz nicht in Frage.
Irgendwie kann man das. Aber nicht in C. Und es wird nicht einfacher. Das Programm verwendet genau einen Pointer. Und zwar ungefähr das erste Lehrbuchbeispiel für Pointer. Ich empfehle daher auch: Lerne es. Wenn es daran scheitert, such dir eine andere Programmiersprache mit anderer Philosophie. MfG, Arno
Mit einem Array:
1 | void
|
2 | uart_puts(char s[]) |
3 | {
|
4 | int i = 0; |
5 | while (s[i] != 0) { |
6 | uart_putc(s[i++]); |
7 | }
|
8 | }
|
berndF schrieb: > Hallo zusammen, kürzlich habe ich im Forum einen Link auf diese Seite > hier gefunden. > https://www.xennis.org/wiki/AVR-GCC_-_UART das Gleiche schrieb: > Mit einem Array:void > uart_puts(char s[]) Hättest Du mal auf den Link im Eröffnungsposting geklickt, hättest Du gesehen, dass die Funktion uart_puts() dort längst implementiert ist. Eine weitere Variante ist für den TO überhaupt nicht hilfreich. Denn es geht ihm um die Anwendung, nicht um die Implementierung. @berndF: Das ist ganz einfach, hier ein Beispiel:
1 | uart_puts ("Hallo, Welt\r\n"); |
Denn eine Zeichenkette (in Gänsefüßchen) ist bereits ein Pointer, nämlich der Zeiger auf die Zeichenkette. Es ist also für Zeichenketten-Ausgabe ganz trivial.
das Gleiche schrieb: > Mit einem Array: Da kommt exakt der gleiche Maschinencode heraus. Arrays werden nämlich immer als Zeiger übergeben. Es ist lediglich eine alternative Syntax. Immerhin ohne Zeiger. > uart_puts(char s[]) und > uart_puts(char *s) kann man beide sowohl mit einem Zeichenketten-Literal (z.B. "Hallo"), als auch mit einem Zeiger auf eine Zeichenkette als auch mit einem Array von Zeichen aufrufen. Man kann die Funktion auch mit der Adresse der Zeichenkette aufrufen. Am Ende (im Maschinencode) ist das alles das Selbe.
Frank M. schrieb: > Hättest Du mal auf den Link im Eröffnungsposting geklickt Hä? Ich habe die Stelle herauskopiert, wo die Zeiger benutzt werden und diese durch einen Array ersetzt. Genau das was er wollte. (auf Zeiger verzichten)
Stefan ⛄ F. schrieb: > Da kommt exakt der gleiche Maschinencode heraus. Tja, der Maschinencode. Und nicht der Queltext ;-) Wenn er die Arrays bereits kennt, so kann er jetzt loslegen. Natürlich muss man noch wissen wie die Strings in C abgeschlossen werden.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.