mikrocontroller.net

Forum: Compiler & IDEs Hilfe zu Warnmeldung


Autor: Mathias O. (m-obi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

hab da mal einen sourcecode der nicht funzt:
#include <avr/io.h>
#include <util/delay.h>

#define Taster_2 (PIND&(1<<PD3))

uint8_t key_pressed_1(const volatile uint8_t *inputreg, uint8_t inputbit)
{
  static uint8_t last_state = 0;
  if (last_state==(*inputreg&(1<<inputbit))) return 0;
  _delay_ms(20);
  last_state=(*inputreg&(1<<inputbit));
  return (*inputreg&(1<<inputbit));
}
 
uint8_t key_pressed_2(const volatile uint8_t *input)
{
  static uint8_t last_state = 0;
  if ( last_state == *input ) return 0; 
  _delay_ms(20);
  last_state = *input;
  return *input;
}

int main(void)
{
  DDRD = 0b11100011;

  while(1)
  {                
        if (key_pressed_1(&PIND,PD2)) PORTD ^= (1<<5);
    if (key_pressed_2(Taster_2)) PORTD ^= (1<<6);
    }
    return 0;
}

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?

Autor: Björn R. (sushi)
Datum:

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

Autor: Mathias O. (m-obi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
super funktioniert, danke!
Wozu ist denn der Stern eigentlich da, weil in der oberen Funktion muss 
er hin.

Autor: Björn R. (sushi)
Datum:

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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
void wait1 (volatile unsigned char * x)
{
    while (*x);
}

void wait2 (unsigned char x)
{
    while (x);
}

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
void wait2 (unsigned char x)
{
    if (x)
        while (1);
}

Autor: Björn R. (sushi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und, haben wir diesen Fall hier? Nein! Also doch Blödsinn. Der Wert wird 
nur einmal abgefragt, also reicht es wenn er kopiert wird.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

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

Autor: Björn R. (sushi)
Datum:

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

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.