Da hat mich wohl der Titel des Threads zu der Annahme verleitet es gäbe Zusammenhänge zu einer Statemachine.
philaadro:
Ich habe mit einen Zeiger gearbeitet das ich die Speicher Adresse von denn DDRx Register bekomme.
mit der Referenz bekam ich eine Fehler meldungen:
Severity Code Description Project File Line
Error invalid conversion from 'volatile uint8_t* {aka volatile unsigned char*}' to 'uint8_t {aka unsigned char}' [-fpermissive]
Wieso suchst Du Deine Fehler immer wo anders? Hier steht doch klar und deutlich, daß "volatile" nicht konvertierbar ist. Und ich hatte schon mal gefragt, wozu Du "volatile" brauchst. Bislang scheinst Du "volatile" überall hinzuschreiben, wo eher "const" angebracht wäre, oder garnichts.
Whandall:
Da hat mich wohl der Titel des Threads zu der Annahme verleitet es gäbe Zusammenhänge zu einer Statemachine.
Ja, der TO benutzt Schlüsselworte sehr kreativ. Wenn das so konfus weitergeht, werde ich mich wohl ausklinken.
combie:
Die Dereferenzierung über this stammt aus der alten Zeit, als es noch nicht C++ hieß, sondern noch "C mit Klassen". Damals war das ein MUSS. Es gab keine Alternative dazu.
Okay mag alles sein. Mir ist das ehrlich gesagt noch nie unter die Augen gekommen. Oder vielleicht vorsichtiger formuliert noch nicht bewusst unter die Auge gekommen. Ich wäre aber auch so nicht auf die Idee gekommen für jeden Mist einen Zeiger verwenden zu wollen. Das steht auch auf den einschlägigen Seiten die ich kenne so nicht.
Als kleine Abhandlung zu Zeigern allgemein gibts nichts besseres als diesen Thread.
https://forum.arduino.cc/index.php?topic=616496.0
Deswegen hätte ich rein zum Verständnis gern von philaadro gewusst wie er überhaupt darauf kam.
Wer man versucht ohne das Arduino Framework auszukommen und Gehversuche startet dann ist das ja okay. Irgendwann reizt das bestimmt jeden einmal. Dann sollte man vielleicht diese Seiten https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial lesen. Wenn man die dort gewöhnlichen defines gegen const uint8_t tauscht hat man schon viel gewonnen. Bei C++ kann man ja dennoch bleiben statt C. Das Eis wird dann dünner, dem sollte man sich bewusst sein. Irgendwann findet man dann zurück ...
Wünsche weiterhin viel Spass auf dem Eis ...
Doc_Arduino:
Ich wäre aber auch so nicht auf die Idee gekommen für jeden Mist einen Zeiger verwenden zu wollen. Das steht auch auf den einschlägigen Seiten die ich kenne so nicht.
Auch wenn Du in C++ das 'this->' nicht hinschreibst, macht der Compiler es trotzdem genauso, als wenn es dort stünde. Wenn Du den this-Pointer explizit hinschreibst, wird dir bewusst, was passiert. Wenn nicht, merkst Du gar nicht, dass Du mit Zeigern arbeitest, obwohl es so ist.
Variablen in Objekten werden immer über den Zeiger auf das Objekt adressiert, das geht ja garnicht anders. Wenn Du mehrere Objekte hast, ist der Code ja trotzdem nur 1x vorhanden. Damit die 'richtigen' member-Variablen adressiert werden, geht dies immer über den this-Pointer, egal ob Du den explizit hinschreibst oder nicht.
Damit die 'richtigen' member-Variablen adressiert werden, geht dies immer über den this-Pointer, egal ob Du den explizit hinschreibst oder nicht.
OT:Das Problem mit Pointern generell ist nicht, dass sie verwendet werden, sondern dass man als Mensch damit so viele Fehler machen kann.
Vielleicht ist es deshalb auch ganz gut, dass C++ das weitgehend 'versteckt' 8) . Trotzdem finde ich es gut, wenn man sich dessen bewusst ist.
Hallo,
wie das der Compiler intern macht mag ja alles sein. Darum ging es mir nicht. Der Compiler muss meinen Syntax verstehen den dieser mir zur Verfügung stellt. Dieser Syntax muss so einfach wie möglich gehalten werden. Es ist nicht das Ziel einer Hochsprache sich dem Innereien des Compilers anzunähern.
Zum Teil möchte ich dem widersprechen.
Wenn Du Zeiger sinnvoll verwenden willst, solltest Du deren Prinzipien verstanden haben. Das ist Deine Aufgabe, der Compiler weiß, wie er damit umgehen muss, wenn Du es richtig vorgibst.
Gruß Tommy
Hallo,
wem widersprechen?
Egal, kurz innehalten. Ich denke es wird Ursache und Wirkung oder so ähnlich verwechselt. Wenn ich in meinem Syntax keine Zeiger verwende, dann habe ich ein Problem weniger. Was der Compiler daraus macht kann mir als Hochsprachenprogrammierer herzlich egal sein. Ich muss den Compilerprogrammierern sowieso vertrauen. Erst wenn ich mit Zeigern in meinem Syntax hantiere muss ich wissen was ich mache damit am Ende etwas Funktionierendes in meinem Sinne herauskommt. Klingt doch einleuchtend?
Das ein this Zeiger existiert sollte man trotzdem wissen. Jede Methode hat den als versteckten Parameter. So gab es hier schon einige male das Problem dass Leute Methoden an gewöhnliche Funktionszeiger zuweisen wollen, da manche Dritt-Bibliotheken mit Callbacks arbeiten. Das scheitert dann aber erstmal am this-Zeiger weil die Signatur nicht passt
Eine andere Stelle wo man das manchmal sieht ist in Konstruktoren:
myClass(int var)
{
this->var = var;
}
Normal in vielen anderen Sprachen. In C++ löst man es aber besser mit einer Initialisierungsliste
Doc_Arduino:
Egal, kurz innehalten. Ich denke es wird Ursache und Wirkung oder so ähnlich verwechselt. Wenn ich in meinem Syntax keine Zeiger verwende, dann habe ich ein Problem weniger.
Zwei oder noch mehr. Wenn man auf einem armen kleinen Arduino mit dynamischen Objekten hantiert, dann ist das schon mal bedenklich. Schaut man sich die üblichen Bibliotheken an, dann werden dort die Objekte alle statisch angelegt, womit sich IMO die Notwendigkeit für Pointer bzw. Referenzen drastisch reduziert.
Doc_Arduino:
Wenn ich in meinem Syntax keine Zeiger verwende, dann habe ich ein Problem weniger. Was der Compiler daraus macht kann mir als Hochsprachenprogrammierer herzlich egal sein. Ich muss den Compilerprogrammierern sowieso vertrauen. Erst wenn ich mit Zeigern in meinem Syntax hantiere muss ich wissen was ich mache damit am Ende etwas Funktionierendes in meinem Sinne herauskommt. Klingt doch einleuchtend?
Im Prinzip hast Du Recht. Der Compiler wird intern an vielen Stellen Zeiger verwenden, wo uns das egal sein kann ( auch die lokalen Variablen auf dem Stack werden über Zeiger adressiert ). Wobei ein wenig HIntergrundwissen sicher nicht schadet.
Und der this-Zeiger ist ein dermaßen zentrales Element bei der OOP mit C++, das man ihn schon kennen sollte. Nicht umsonst hat er ja auch einen eigenen Namen - gehört also zur Syntax von C++ dazu.
DrDiettrich:
Schaut man sich die üblichen Bibliotheken an, dann werden dort die Objekte alle statisch angelegt, womit sich IMO die Notwendigkeit für Pointer bzw. Referenzen drastisch reduziert.
In den Bibliotheken werden die Objekte üblicherweise gar nicht angelegt. Das geschieht in aller Regel im Sketch ( Ich weis, es gibt Ausnahmen ). Aber auch wenn ein Objekt statisch angelegt ist, muss es über den this-> Zeiger adressiert werden. Das hat nichts mit statisch oder dynamisch angelegt zu tun.
P.S. ich glaube wir kapern hier gerade einen Thread ...
Hallo,
alles richtig. Ich habe nur versucht zu unterscheiden ob man nun bewusst Zeiger verwendet oder nicht. Unabhängig was unter der Haube abgeht. Ich wollte keine endlose Diskussion auslösen. Wissenswert bleibt es dennoch. Ich ziehe mich zurück.