www.mikrocontroller.net

Forum: Compiler & IDEs GCC Test2 Frage


Autor: geloescht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieser Beitrag wurde auf Wunsch des Autors geloescht.

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: geloescht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieser Beitrag wurde auf Wunsch des Autors geloescht.

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: geloescht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieser Beitrag wurde auf Wunsch des Autors geloescht.

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: geloescht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieser Beitrag wurde auf Wunsch des Autors geloescht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.