GCC Test2 Frage

Gast #39261
(Btw., outp() ist "out".  Besser schreiben als:

UDR = *uart_data_ptr;

Aktuellere gcctest-Versionen sollte es irgendwo geben.)

Ob und inwieweit sizeof(something) funktioniert ist eine Frage
in erster Linie, wie "something" deklariert ist, MSVCC hin,
avr-gcc her.  sizeof hat eine ziemlich exakte Definition im
Standard (es muß übrigens keineswegs immer mit Klammern geschrieben
werden).

Obiges Codeschnipsel legt nahe, daß es sich bei "uart_data_ptr"
um einen Zeiger handelt.  sizeof <any pointer> ergibt typischerweise
eine Konstante für die jeweilige Architektur (2 im Falle von
AVR).  Nicht sehr hilfreich.  Sizeof *<any pointer> würde die
Größe des Objektes benennen, auf das <any pointer> zeigt,
also wahrscheinlich 1 in diesem Falle (char).

Alles nicht so ganz hilfreich, nicht wahr?

if (!(*uart_data_ptr))

funktioniert nur, falls der Speicherbereich, auf den
uart_data_ptr zeigt, auch ein String im Sinne von C ist, also
am Ende des Strings ein NUL-Byte (mit einem "L", ist was völlig
anderes als ein NULL-Zeiger) steht.
Gast #39263
Nun, Du solltest dem Ratschlag folgen, den ich meiner Frau von
Zeit zu Zeit wieder gebe (und den sie bislang immer erfolgreich
ignoriert hat :-): das Kapitel über Zeiger und Felder im K&R
nochmal lesen...

Du hast komplett vergessen darüber nachzudenken, wo eigentlich
der Speicher für Deinen Puffer überhaupt herkommt.  Du schreibst
einfach einen Zeiger hin, nennst ihn irreführend "Puffer", und
läßt ihn dann irgendwohin zeigen...  Das kann nicht funktionieren.
Gast #39265
>  das habe ich bedauerlicherweise noch nicht gelesen,>
> aldiweil ich garnicht weiß, was Du mit K&R meinst.

Kernighan & Ritchie: The C Programming Language.

Gibt's auch in deutsch.  Dem Vernehmen nach soll die deutsche
Übersetzung der zweiten Auflage nicht mehr ganz so gruselig
sein wie die der ersten Auflage.  Ist die ,,C-Bibel'', Brian
Kernighan und Dennis Ritchie sind die Schöpfer von C.

Du kannst Dir sicher auch jedes andere brauchbare Buch über C
aussuchen dafür, eventuell findest Du auch benutzbare Vorlesungsscripte
oder so im Internet.  Sieh einfach nach, was da über Zeiger und
Felder (pointer and arrays) geschrieben steht und versuche es
zu verstehen.

[Wo kommt der Speicher her?]

> Zählt die Ausrede: "Warum ich?"

Nein.  Für Dein Programm mußt Du Dir schon Deine eigenen
Gedanken machen.  Du hast offensichtlich ein Beispiel so
auseinandergepflückt, daß es hinterher gar nicht mehr
funktionieren kann -- eben, weil Du Dir die Grundlagen dazu
noch nicht zu Gemüte geführt hast.  Die kann man aber auch
schlecht in ein paar Zeilen eines Webforums vermitteln, das
Kapitel im K&R hat immerhin 34 Seiten.

> Ich gehe einfach mal davon aus, das der Compiler den
> größten Teil für mich erledigt.

``Assumptions are the root of all evil.''

Er wird es (so, wie es da steht) nicht tun, und das Ergebnis
hast Du ja eigentlich schon gespürt: es funktioniert nicht.

> Bei den Daten handelt es sich meist nur um Maximal zwei
> Zeichen, ...

Selbst wenn es nur eins wäre: es muß irgendwo dafür im Speicher
Platz geschaffen worden sein.  Ansonsten hast Du einen Zeiger,
der einfach irgendwohin zeigt, mit dem Du irgendwas ausliest
oder (noch schlimmer) irgendwas überschreibst.  Da der
RAM-Adreßbereich bei AVR auch den kompletten Registersatz
überstreicht, kannst Du damit (je nach Anwendung) von einer
Totalverklemmung des Programms bis zum Auslösen eines Atomkrieges
alles erreichen...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 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.