Forum: Compiler & IDEs GCC Test2 Frage


von geloescht (Gast)


Lesenswert?

Dieser Beitrag wurde auf Wunsch des Autors geloescht.

von Joerg Wunsch (Gast)


Lesenswert?

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

von geloescht (Gast)


Lesenswert?

Dieser Beitrag wurde auf Wunsch des Autors geloescht.

von Joerg Wunsch (Gast)


Lesenswert?

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.

von geloescht (Gast)


Lesenswert?

Dieser Beitrag wurde auf Wunsch des Autors geloescht.

von Joerg Wunsch (Gast)


Lesenswert?

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

von geloescht (Gast)


Lesenswert?

Dieser Beitrag wurde auf Wunsch des Autors geloescht.

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.