Forum: Compiler & IDEs gcc beschwert sich über zu kurze char arrays


von Vlad T. (vlad_tepesch)


Lesenswert?

1
static const char c_a[5] = "12345";

sollte doch perfekt legaler c-Code sein. Wieso beschwert sich der gcc 
(AVR8/GNU C Compiler : 4.8.1) mit:

> error: initializer-string for array of chars is too long [-fpermissive]

Der Standard sagt explizit in 6.7.8.14:
1
An array of character type may be initialized by a character string 
2
literal, optionally enclosed in braces. 
3
Successive characters of the character string literal (including the
4
terminating null character if there is room or if the array is of
5
 unknown size) initialize the elements of the array.

von Marvin (Gast)


Lesenswert?

Falsch. "12345" ist sechs Zeichen.

"..." ist ein String mit abschliender null.

von Vlad T. (vlad_tepesch)


Lesenswert?

Marvin schrieb:
> Falsch. "12345" ist sechs Zeichen.

das habe ich nicht bestritten.

Du hast aber auch den von mir zitierten Abschnitt aus dem C-Standard 
nicht gelesen.
Der Besagt nämlich, dass aus dem String literal nur so viele Zeichen 
benutzt werden, wie Platz in dem Array ist.


Aber ich hab den FEhler gefunden:

mein Dateiname hat am Ende noch 2 zusätzliche 'p's :)

Und der c++ standard sieht das scheinbar anders.

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

Vlad Tepesch schrieb:
> Und der c++ standard sieht das scheinbar anders.

Ja, tut er. Die Option, das '\0' wegzulassen, gibt es dort nicht.

von warning (Gast)


Lesenswert?

Du solltest froh sein, dass der Compiler deinen Programmierfehler 
findet.

von Vlad T. (vlad_tepesch)


Lesenswert?

warning schrieb:
> Du solltest froh sein, dass der Compiler deinen Programmierfehler
> findet.

es ist kein Programmierfehler, sondern wäre hier Intention, sonst hätte 
ich auch die explizite gröenangabe wegglassen und den Compiler diese 
bestimmen lassen

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Vlad Tepesch schrieb:
> es ist kein Programmierfehler, sondern wäre hier Intention

Das sollte man dem Compiler auch mitteilen:
1
static const char c_a[5] = {'1','2','3','4','5'};

von warning (Gast)


Lesenswert?

Der eine sagt Programmierfehler, der andere nennt es schlechten Stil. 
Wenn jemand das betrachtet, kann er nicht erkennen was du wolltest:
- 4-Zeichen string, der falsch initialisiert wird
- 5-Zeichen string, wobei Speicher für \0 vergessen wurde

Wir können ja mal abstimmen. ;-)

von Vlad T. (vlad_tepesch)


Lesenswert?

ein kommentar gehört natürlich dahinter aber
1
static const char c_sequence[] = "____--__----_-__-_,-._";

ist deutlich besser zu lesen als
1
static const char c_sequence[] = {'_','_','_','_','-','-','_','_','-','-','-','-','_','-','_','_','-','_',',','-','.','_'};

ich hätte halt nur gern das `sizeof` bzw, ARRAY_SIZE die richtige größe 
liefert;

von Dirk B. (dirkb2)


Lesenswert?

Vlad Tepesch schrieb:
> ich hätte halt nur gern das `sizeof` bzw, ARRAY_SIZE die richtige größe
> liefert;

Für den ersten Fall gibt es strlen.

Wenn du weißt was du tust, kannst du bei sizeof ja auch -1 rechnen.
(Aber bitte mit Kommentar dabei)

von Rolf M. (rmagnus)


Lesenswert?

warning schrieb:
> Wenn jemand das betrachtet, kann er nicht erkennen was du wolltest:
> - 4-Zeichen string, der falsch initialisiert wird
> - 5-Zeichen string, wobei Speicher für \0 vergessen wurde

Für mich ist offensichtlich, daß er keins davon wollte, sondern einen 
5-Zeichen-String, der mit Absicht nicht nullterminiert sein soll. C 
lässt sowas ganz bewusst zu.

von Peter D. (peda)


Lesenswert?

Vlad Tepesch schrieb:
> ich hätte halt nur gern das `sizeof` bzw, ARRAY_SIZE die richtige größe
> liefert;

Ich hab auch für das eDIPTFT die Steuersequenzen als String im Flash 
abgelegt. Zum Senden an das TFT nehme ich dann einfach sizeof()-1.
1
#define TFT_FKT(x)         tft_wr( sizeof(x) - 1, x, 1 )

: Bearbeitet durch User
von warning (Gast)


Lesenswert?

@magnus
static const char txt[10] = "hello worl";

Und was ist damit gemeint?

von Karl H. (kbuchegg)


Lesenswert?

warning schrieb:
> @magnus
> static const char txt[10] = "hello worl";
>
> Und was ist damit gemeint?

Ich versteh jetzt die Frage nicht.
In C ist das identisch zu
1
static const char txt[10] = { 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l' };

aber das hat Vlad ja auch im Eröffnungsposting schon angegeben.

In C++ ist das ein Fehler.

: Bearbeitet durch User
von Bastler (Gast)


Lesenswert?

Bei der Frage Programmierfehler ja/nein, gilt als sollcher eben auch mit 
dem falschen Compiler zu übersetzen. ".cpp" ist eben nicht ".c".
GCC läßt sich aber mit -fpermissive dazu überreden, hier die C++ Syntax 
nicht allzu penibel auszulegen, denn er ahnt ja was gemeint war.

von warning (Gast)


Lesenswert?

@KHB
Betrachtet man nur die code Zeile, ist nicht erkennbar, was der 
Programmierer wollte. In meinem Beispiel fehlt am Ende das d. Absicht 
oder Fehler?
Ich halte das daher für einen schlechten Stil. Nicht alles was erlaubt 
ist, ist gut und muss ausgenutzt 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.