Forum: Compiler & IDEs Fragen zu Pointern


von Wolfgang Müller (Gast)


Lesenswert?

Hallo,


Ich verwende VMLAB, WINAVR mit avr-libc 1.4.3

In meinem C-Programm gibt es mehrere Arrays (ausserhalb jeder Funktion
deklariert/definiert):

volatile char anzbuffer[6];
volatile uint8_t dg_stat [3];
volatile uint8_t ebuffer [32];
const char modus_text[15][19]={"Anzeige","Einstellen" (... usw.) };

const char chan_text[23][11]={... };   //ähnlich wie modus_text

Der Aufruf einer Funktion
disp_frame_B_ls(ebuffer, modus_text, chan_text, anzbuffer);

erzeugt Warnungen:
a) ... passing arg1 of 'disp_frame_B_ls' discards qualifiers from
pointer target
b) ... passing arg2 of 'disp_frame_B_ls' from incompatible pointer
type
c) ... passing arg3 of 'disp_frame_B_ls' from incompatible pointer
type
d) ... passing arg4 of 'disp_frame_B_ls' discards qualifiers from
pointer target

Ändere ich den Aufruf in
disp_frame_B_ls((uint8_t*)ebuffer, (char*)modus_text, char*)chan_text,
(uint8_t*)anzbuffer);

entfallen Warnungen a) und d).

Meine Fragen:

1.  Was bedeutet 'discards qualifiers' in diesem Kontext?
2.  Die Zeiger weisen doch auf den richtigen Typ. Was ist falsch am
ersten Funktionsaufruf?


Meine 'Bücherei' zu C hilft mir hier auch nicht weiter.
Daher: Für Hinweise bin ich sehr dankbar.

Wolfgang

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Den Prototyp Deiner Funktion "disp_frame_B_ls" solltest Du auch noch
angeben ... sonst ist Raten angesagt.

Nur so nebenbei, warum ist modus_text ein zweidimensionales Array und
nicht ein Array von char-Pointern? Das würde in den meisten Fällen
ausreichen, und Du müsstest Dir auch keine Gedanken um die Länge des
längsten enthaltenen Strings machen - und Speicher spart's obendrein.

von Joe D. (kosmonaut_pirx)


Lesenswert?

hallo,

poste einmal bitte die deklaration der funktion.

bye kosmo

von Wolfgang Müller (Gast)


Lesenswert?

hier die Deklaration:

void disp_frame_B_ls(uint8_t ebuffer[],char modus_text[][],char
chan_text[][],char anzbuffer[]);

Wolfgang

von Joe D. (kosmonaut_pirx)


Lesenswert?

hallo,

im aufruf
disp_frame_B_ls(ebuffer, modus_text, chan_text, anzbuffer);

für
void disp_frame_B_ls(uint8_t ebuffer[],char modus_text[][],char
chan_text[][],char anzbuffer[]);

kickst du die von dir angegebenen qualifier weg:

volatile char anzbuffer[6];
-ist ein feld von volatile char's, deine deklaration sagt nur
'char'

volatile uint8_t dg_stat [3];
-dito

volatile uint8_t ebuffer [32];
-dito

const char modus_text[15][19]=
-ist ein feld von konstanten char's. für die funktion spricht nichts
dagegen, da werte reinzuwerfen.

mit volatile bin ich nicht firm genug, um  aussagen zu treffen, in wie
weit das discarden 'böse' ist.

von Stefan (Gast)


Lesenswert?


von Wolfgang Müller (Gast)


Lesenswert?

hallo kosmo,

die Deklaration der Funktion um 'volatile' zu ergänzen bringt nichts;
die übrigen angeführten Arrays sind entsprechend deklariert (siehe mein
erstes posting).
Weiterhin ist mir nicht klar, warum die Typumwandlung für arg3 der
Funktion, nämlich (char*)modus_text, nicht akzeptiert wird.

Ich bin also weiterhin auf Hinweise zu meinem Problem angewiesen und
bitte um Hilfe.

Mir scheint, das Arbeiten mit Pointern ist nicht ohne Grund so
fehlerträchtig.

Gruss

Wolfgang

von Stefan (Gast)


Lesenswert?

Schade, dass du nicht auf die gelinkte FAQ eingehst. IMHO stehen dort
die Antworten auf deine Frage.

von Wolfgang Müller (Gast)


Lesenswert?

hallo Stefan,

habe mir die Seiten heruntergeladen und muss sie nun studieren;
scheinen sehr informativ.

Danke

Wolfgang

von Wolfgang Müller (Gast)


Lesenswert?

Stefan,

ich habe die FAQ erstmal schnell gelesen: Sehr gut!

Dein Hinweis ist eine grosse Hilfe zu meinen Fragen und zu Pointern
allgemein. Dass sich die FAQ auf C90 bezieht, ist nicht so dramatisch.


Bedauerlicherweise wird sie nicht weiter gepflegt; ich halte sie für
didaktisch sehr gut aufgebaut.

Nochmals Dank für Deine Hilfe.

Wolfgang

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.