der gibt mir beim maken folgende warnmeldung raus:
main.c:31: warning: passing argument 1 of 'key_pressed_2' makes pointer
from integer without a cast
kann mir einer dabei helfen?
>#define Taster_2 (PIND&(1<<PD3))>uint8_t key_pressed_2(const volatile uint8_t *input)>key_pressed_2(Taster_2)
du sagst in der Deklaration deiner Funktion, dass das Argument ein
pointer auf uint8_t sein soll übergibst aber einen einfachen
integer-wert. Mach mal den Stern da weg, das ist bei konstanten eh
blödsinn...
in der restlichen Funktion natürlich jeweils auch den Stern weg.
LG, Björn
Stichwort Pointer. Das sind Variablen, die die Adresse einer anderen
Variablen speichern. Lies dir dazu mal ein Buch über C durch! Oder
sonstiges C-grundlagenwissen...
je nachdem, wo der Stern steht, deklariert er eine Pointervariable oder
er ist der sogenannte Dereferenzierungsoperator(liefert also zu einem
Pointer den Wert, der an der Adresse gespeichert ist). Das Gegenteil,
also der Referenzierungsoperator, der die Adresse zu einer Variablen
liefert, ist das &.
Auch in der anderen Funktion ist der Pointer Blödsinn. Bei der Übergabe
erzeugst du die Adresse mit &, in der Funktion nimmst du dann den Wert,
indem du mit * wieder dereferenzierst. Ein Anwendungsfall, wo er
gebraucht würde, ist, wenn eine Variable außerhalb der Funktion diurch
die Funktion geändert werden sollte(sogenanntes Call by Reference). Das
ist hier aber nicht der Fall.
Lösch mal alle * in der Funktion, und beim Aufruf, also hier:
>if (key_pressed_1(&PIND,PD2)) PORTD ^= (1<<5);
löscht du das &.
Edit: Schau mal hier:
http://home.netcom.com/~tjensen/ptr/pointers.htm
LG, Björn
Björn R. wrote:
> Auch in der anderen Funktion ist der Pointer Blödsinn.
Nein.
Wenn der Wert eines SFRs in eine Funktion geliefert wird, ist dieser
Wert in der Funktion konstant, d.h. jedes mal, wenn man den Wert
verwendet, ist er gleich. Und wenn man den Wert ändert, hat das keinen
Effekt auf das SFR selbst.
Wenn man die Adresse eines SFRs verwendet, ist das komplett anders!
Vergleiche zum Beispiel folgende Funktionen
1
voidwait1(volatileunsignedchar*x)
2
{
3
while(*x);
4
}
5
6
voidwait2(unsignedcharx)
7
{
8
while(x);
9
}
Während wait1() das macht, was es soll (nämlich warten, bis sich im SFR,
dessen Adresse in x steht, was tut) ist wait2 gleichbedeutend mit der
optimierten Version
Björn R. wrote:
> Und, haben wir diesen Fall hier? Nein! Also doch Blödsinn. Der Wert wird> nur einmal abgefragt, also reicht es wenn er kopiert wird.
Björn R. wrote:
> Auch in der anderen Funktion ist der Pointer Blödsinn.
In key_pressed_1() zähle ich 3 mal die Verwendung von *inputreg.
Wieviel zähltst du?
Zudem kommt es nicht darauf an, wie oft statisch darauf zugegriffen
wird, sondern wie oft dies zur Laufzeit geschieht.
Auch wenn statisch nur 1x zugegriffen wird, kann dies zur Laufzeit zu
vielen Zugriffen führen. Ein Beispiel ist der Zugriff innerhaln einer
Schleife.
Guck dir doch an was die Funktion machen soll! ich bleibe dabei, es
reicht wenn der Wert einmal bei funktionsaufruf kopiert wird. pointer
unnötig.
Sollte die funktion in einer Schleife aufgerufen werden wird bei jedem
funktionsaufruf der wert neu kopiert.
Eine eigene Frage?
Dieser Thread ist über 17 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.