www.mikrocontroller.net

Forum: Compiler & IDEs Umgang mit const array (Pointer darauf gibt warnung)


Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich arbeite mit Konstanten-Array wie z.B.:
static unsigned char const SET_AM[] = {0x11, 0x04, 0x1B, 0x4D, 0x4E, 0x28, 0xF3};
nun möchte ich mal dieses mal jenes Array einer Funktion übergeben, was 
mit einem Array-Pointer auch wunderbar funktioniert:
char *ptr2SPIFrame;
Der Compiler gibt mir dann aber die Warnmeldung: "warning: assignment 
discards qualifiers from pointer target type". Was wohl soviel heisst 
das mein const beim array ignoriert wird und ich über den Pointer die 
Werte des Arrays dennoch ändern kann. Wie verhindere ich das?
Programmtechnisch habe ich eigentlich keine Angst dass ich die Werte 
verändere, aber ich hätte schon gerne 0 Warnungen, alleine deswegen 
schon damit, falls mal eine kommt die auf einen Fehler hinweist, auch 
gleich ins Auge sticht.

Eine andere Frage ist wie ich die ein nicht-const array befülle. Klar 
mit:
BUFFER[0] = 0x2D;
aber wie befülle ich z.B. die ersten 10 Bytes auf einmal (ähnlich wie 
bei der Deklaration hatte ich mir das vorgstellt, geht aber nicht.)

danke
Fred

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fred schrieb:

> Wie verhindere ich das?

Indem du den Pointer auf "const char" zeigen lässt. Also
const char *ptr2SPIFrame;

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fred schrieb:

> Eine andere Frage ist wie ich die ein nicht-const array befülle. Klar
> mit:
>
> BUFFER[0] = 0x2D;
> 
> aber wie befülle ich z.B. die ersten 10 Bytes auf einmal (ähnlich wie
> bei der Deklaration hatte ich mir das vorgstellt, geht aber nicht.)

memset oder memcpy aus der libc, deklariert in string.h

Johann

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Möglichkeit, eine Array-Initialisierung auch in grösseren Happen 
durchzuführen, beispielsweise über
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
existiert meines Wissens nur beim GNU Compiler.

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Indem du den Pointer auf "const char" zeigen lässt. Also
>const char *ptr2SPIFrame;

bzw. "const unsigned char" in meinem Fall. Obwohl char ja sowieso 
unsigned ist, sollte also ziemlich überflüssig sein dass unsigned. Weiss 
gar nicht warum ich dass da drin hab.
Auf jeden Fall danke, funktioniert immer noch und die Warnungen sind 
weg. Der Gedanke dass so zu machen kam mir zwar auch schon, hatte ich 
aber wieder verworfen da ich dachte den Pointer selbst dann konstant zu 
machen.


>memset oder memcpy aus der libc, deklariert in string.h
danke, muss mir aber noch überlegen ob es das Wert ist, die ganze 
Bibliothek einzubinden um ca. 7 Zeilen zu sparen. Wohl eher nicht.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fred schrieb:

> aber wieder verworfen da ich dachte den Pointer selbst dann konstant zu
> machen.

Um das zu tun müsstest du
   char *const ptr;
schreiben. Willkommen im Land der irrlichternen Syntax.

> danke, muss mir aber noch überlegen ob es das Wert ist, die ganze
> Bibliothek einzubinden um ca. 7 Zeilen zu sparen. Wohl eher nicht.

Du bindest damit nicht die ganze Bibliothek ein, sondern eine Funktion 
daraus.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fred schrieb:
> bzw. "const unsigned char" in meinem Fall. Obwohl char ja sowieso
> unsigned ist, sollte also ziemlich überflüssig sein dass unsigned.

Nein, ist es nicht.
In C gibt es 3 unterschiedliche Character Dtaentypen

  signed char
  unsigned char
  char

Ein 'char' alleine ist entweder ein signed char oder ein unsigned char. 
Welches davon zutrifft, entscheidet der Compiler und ist oft mit einem 
Command Line Switch überschreibbar. Aber: Auch wenn ein char 
konzeptionell ein unsigned char ist, so sind dennoch char und unsigned 
char 2 verschiedene Datentypen.

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.