www.mikrocontroller.net

Forum: Compiler & IDEs Fragen zu Pointern


Autor: Wolfgang Müller (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Joe Die (kosmonaut_pirx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

poste einmal bitte die deklaration der funktion.

bye kosmo

Autor: Wolfgang Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hier die Deklaration:

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

Wolfgang

Autor: Joe Die (kosmonaut_pirx)
Datum:

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Wolfgang Müller (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

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

Autor: Wolfgang Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo Stefan,

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

Danke

Wolfgang

Autor: Wolfgang Müller (Gast)
Datum:

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

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.