Forum: Mikrocontroller und Digitale Elektronik AVR - Pointer ersetzen


von berndF (Gast)


Lesenswert?

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?

von Wad? (Gast)


Lesenswert?

berndF schrieb:
> (kenne mich mit Pointern nicht aus).

Dann lerne es!

von Stefan F. (Gast)


Lesenswert?

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

von Thomas F. (igel)


Lesenswert?

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

von M.A. S. (mse2)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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.

von Arno (Gast)


Lesenswert?

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

von das Gleiche (Gast)


Lesenswert?

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
}

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von das Gleiche (Gast)


Lesenswert?

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)

von das Gleiche (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.