Forum: Compiler & IDEs Funktionsaufruf mit Zeiger


von Patrick B. (patrick)


Lesenswert?

Hallo,

ich hab ein Problem mit der Übergabe eines Array an eine Funktion:

ich hab die Funktion wie folgt deklariert:

void Decodemsg(BYTE *lpBuf, WORD wRead);

im Program möchte ich ein Char Array cRxBuf mit Länge übergeben:

Decodemsg(cRxBuf, MsgLength);

in der Funktion soll es dann weitergehen:

void Decodemsg(BYTE *lpBuf, WORD wRead)
{
 WORD  wGroupAddr;

 wGroupAddr = (lpBuf[9] << 8) | lpBuf[10];

}

das ganze geht aber nicht, es wird nicht mal in die Funktion beim
Aufruf gesprungen?

Dazu liefert der Compiler die Meldung:
"passing arg 1 of `DecodeEIBmsg' discards qualifiers from pointer
target type"

was mache ich falsch??

Gruss Patrick

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

schauder  Ungarische Notation.  Kann man echt nicht lesen...

Anyway, das klingt alles konfus.  Das Wichtigste aber, nämlich die
die Deklaration von DecodeEIBmsg, hast du uns vorenthalten.  Die
Fehlermeldung klingt so, als hättest du in dieser entweder ein const
oder ein volatile drin (ein restrict wird's ja nicht sein, das wäre
der dritte Qualifier, den es gibt ;-).

Auch weiß ich mit deiner Aussage ,es wird nicht mal in die Funktion
beim Aufruf gesprungen' nichts anzufangen.  In welche Funktion wird
denn nicht gesprungen, Decodemsg oder DecodeEIBmsg?  Wie hast du das
herausgefunden?  Hast du nur mit dem Simulator geguckt und vermisst im
optmierten Code dies oder das?  Bedenke, dass die Optimierung dir eine
so simple Funktion durchaus inline erweitern könnte, d.h. im
Einzelschritt der Simulation wird sie scheinbar nicth angesprungen,
dennoch macht der Code das Richtige...

von Patrick B. (patrick)


Lesenswert?

die Deklaration des Array cRxBuf das ich übergebe war volatile, darum
wohl auch die Fehlermeldung. Die ist nun weg.

Mit der Aussage das nicht in die Funktion gesprungen wird meine ich das
ich einen Breakpoint auf den Funktionsaufruf setzt. Beim nächsten
Einzelschritt sollte ja dann die Funktion aufgerufen werden. Diese wird
aber übergangen?

Ich verwende keinen Simulator sondern ein STK500/501 mit JTAG ICE

Patrick

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Naja, das Kriterium für die Wahrheit ist immer noch, ob die
gewünschte Funktionalität errreicht wird.  Wie geschrieben,
der Compiler könnte eine derartig simple Funktion als
inline-Code implementieren, dann wird dein Breakpoint nie
erreicht, obwohl trotzdem alles funktioniert.

von Unbekannter (Gast)


Lesenswert?

ISO C99 ist erfunden.

Man benötigt solchen Kruscht wie "BYTE" und "WORD" nicht mehr...

Verwende besser "uint8_t" und "uint16_t" oder "int16_t" usw.

Und wie schon angemerkt wurde: Wirf die ungarische Notation weg. Es
gibt nichts schlimmeres. Nur weil es Microsoft so toll fand und
Millionen von Windowsprogrammierer das so machen uns sogar manche
Hochschulen diesen Schrott gelehrt haben, heißt das noch lange nicht
dass das etwas taugt.

von Karsten R. (karsten)


Angehängte Dateien:

Lesenswert?

Hallo, kann mir viellicht jemand erklären warum die Funktion 
tastenentpreller
nicht funktioniert, es soll ein Lauflicht eingeschaltet werden,und beim 
2. Aufruf soll die Frequenz halbiert werden.

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
Noch kein Account? Hier anmelden.