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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Vlad T. (vlad_tepesch)


Bewertung
0 lesenswert
nicht lesenswert
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:
An array of character type may be initialized by a character string 
literal, optionally enclosed in braces. 
Successive characters of the character string literal (including the
terminating null character if there is room or if the array is of
 unknown size) initialize the elements of the array.

von Marvin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Falsch. "12345" ist sechs Zeichen.

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

von Vlad T. (vlad_tepesch)


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


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


Bewertung
-1 lesenswert
nicht lesenswert
Du solltest froh sein, dass der Compiler deinen Programmierfehler 
findet.

von Vlad T. (vlad_tepesch)


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


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

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

von warning (Gast)


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


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

ist deutlich besser zu lesen als

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)


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


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


Bewertung
0 lesenswert
nicht 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.
#define TFT_FKT(x)         tft_wr( sizeof(x) - 1, x, 1 )

: Bearbeitet durch User
von warning (Gast)


Bewertung
0 lesenswert
nicht lesenswert
@magnus
static const char txt[10] = "hello worl";

Und was ist damit gemeint?

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht 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
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 Moderator
von Bastler (Gast)


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


Bewertung
1 lesenswert
nicht 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. ;-)

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.