Dieser Beitrag wurde auf Wunsch des Autors geloescht.
(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.
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.
> 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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.