AVR - Pointer ersetzen

Gast #6473372
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?
Gast #6473379
"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.
#6473382
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...
Gast #6473383
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.
Gast #6473384
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
Moderator Persönliche Seite #6473410
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.
Gast #6473411
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.
Gast #6473423
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)
Gast #6473425
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.