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


von Fred (Gast)


Lesenswert?

Hallo,
ich arbeite mit Konstanten-Array wie z.B.:
1
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:
1
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:
1
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

von (prx) A. K. (prx)


Lesenswert?

Fred schrieb:

> Wie verhindere ich das?

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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Fred schrieb:

> Eine andere Frage ist wie ich die ein nicht-const array befülle. Klar
> mit:
>
1
> BUFFER[0] = 0x2D;
2
>
> 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

von (prx) A. K. (prx)


Lesenswert?

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

von Fred (Gast)


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.

von (prx) A. K. (prx)


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.

von Karl H. (kbuchegg)


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.

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.